Java在写数据库查询时,我接触过四种方式:
1、纯Java代码,引用对应的数据库驱动包,自己写连接与释放逻辑(可以用连接池)
这种模式实际上性能是非常不错的,但是使用起来并不是非常方便:一是要手工为Connection做获取与释放,大量的冗余代码也容易出错;另一个是,复杂的SQL用字符串写起来简直不可维护(换行、可视长度、参数都是问题)。
2、使用Spring JdbcTemplate
这个其实还是挺不错的,配置比较简单,功能丰富上比手工管理Connection要舒服多了,而且代码也比较简洁。突出的问题就是SQL维护还是挺麻烦的。
3、使用Hibernate框架
一句话,配置很麻烦,用起来还是挺不错的。但是有一个致命缺陷,它并不能像单表查询一样可以帮我们完成多表的查询。如果有复杂的多表查询或查询条件,还是得用SQL去查,这对于一些业务逻辑复杂或者会经常变更的业务来说,后期维护就是灾难,改到想哭(因为真的是很混乱,一定要开始就规划好)。
4、使用MyBatis框架
这个是当前我所做项目最喜欢用的数据库持久化框架了,它通过XML配置可以非常简单直观地帮你完成各种条件、判断、多表的综合查询,实现方式比Java代码拼SQL要舒服太多了,在这方面更是甩Hibernate一条街。要说易用性,其实也挺容易用的,但是配置上也要对一些数据做映射,不过相对而言更加灵活。它的实体类并不一定要是数据库物理表,而可以是任意查询出来的数据集(类似数据传输对象DTO)。
简单总结一下:
配置容易程度:1 > 2 > 4 > 3
使用便捷程度:2 > 3 > 4 > 1
查询灵活程度:4 > 1 = 2 > 3
下面将开始介绍Spring集成MyBatis的配置和使用,项目基于Maven构建,连接Mysql数据库:
一、Maven配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<!-- Spring Base --> < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-beans</ artifactId > < version >4.2.5.RELEASE</ version > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-context</ artifactId > < version >4.2.5.RELEASE</ version > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-jdbc</ artifactId > < version >4.2.5.RELEASE</ version > </ dependency > <!-- MySql --> < dependency > < groupId >mysql</ groupId > < artifactId >mysql-connector-java</ artifactId > < version >5.1.39</ version > </ dependency > < dependency > < groupId >com.mchange</ groupId > < artifactId >c3p0</ artifactId > < version >0.9.5.2</ version > </ dependency > < dependency > < groupId >org.mybatis</ groupId > < artifactId >mybatis</ artifactId > < version >3.4.1</ version > </ dependency > < dependency > < groupId >org.mybatis</ groupId > < artifactId >mybatis-spring</ artifactId > < version >1.3.0</ version > </ dependency > |
关于Spring的包引用,我这里的引用只作为参考,其它web、mvc的包视各业务来引用。如果不用Maven,就自己乖乖引jar包,或者使用其它包管理吧。
二、Spring配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > < bean id = "myDataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method = "close" > < property name = "driverClass" value = "com.mysql.jdbc.Driver" /> < property name = "jdbcUrl" value = "jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxxdb" /> < property name = "user" value = "lekko" /> < property name = "password" value = "xxx" /> < property name = "minPoolSize" value = "2" /> < property name = "maxPoolSize" value = "100" /> </ bean > < bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" > < property name = "mapperLocations" value = "classpath:mapper/**/*Mapper.xml" /> < property name = "dataSource" ref = "myDataSource" /> </ bean > < bean id = "mapperScannerConfigurer" class = "org.mybatis.spring.mapper.MapperScannerConfigurer" > < property name = "basePackage" value = "lekko.code.**.dao" /> </ bean > </ beans > |
这里的配置比较关键。
1、myDataSource是一个ComboPooledDataSource类型的实例bean,它实现了数据库连接池的功能。
2、sqlSessionFactory是MyBatis用于建立查询的工厂实例,它包括了一个mapperLocations定位,以及dataSource数据库连接来源。
- mapperLocations指定了MyBatis将会搜索的路径,支持Ant风格路径。在指定的路径下,MyBatis会把读取其中的xml查询,并将用于后面的dao映射。
- dataSource是来源数据库,这里直接就是前面的连接池。
3、mapperScannerConfigurer是MyBatis用于自动建立数据库dao类的配置器。
- basePackage指定了要扫描的包名称,支持Ant风格路径。在指定的包名称下,MyBatis通过Spring,会自动发现对应包名下的dao接口,在后面需要查询时,为接口提供实现。
下图是MyBatis的大体框架,可以作为上述配置的一个补述:
也就是说,MyBatis会根据XML配置Mapper去组成数据库查询,然后把查询中所涉及的参数、返回结果,都映射成为Java对象(或元数据类型)。最后交由数据库去执行,返回。
三、dao接口
1
2
3
4
5
6
7
8
9
10
11
|
package lekko.code.test.dao; import lekko.code.test.model.TestModel; import org.springframework.stereotype.Repository; /** * 测试DAO */ @Repository public interface TestDao { TestModel getTest(String name); int addTest(String name); } |
上面这个接口,由于属于包lekko.code.**.dao,所以会被识别为需要映射的dao。
接口只有两个方法,一个是查询getTest,一个是新增addTest。至于getTest已经根据需要,我这里提取成了一个实体类TestModel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package lekko.code.test.model; /** * 测试数据类 */ public class TestModel { private int id; private String name; public String getName() { return name; } public void setName(String name) { this .name = name; } public int getId() { return id; } public void setId( int id) { this .id = id; } } |
四、Mapper映射
1
2
3
4
5
6
7
8
9
10
|
<? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> < mapper namespace = "lekko.code.test.dao.TestDao" > < select id = "getTest" resultType = "lekko.code.test.model.TestModel" > select id, name from Test where name = #{name} </ select > < insert id = "addTest" > insert into Test (name, createdTime) values (#{name}, now()) </ insert > </ mapper > |
语法我就不详细解释了,百度一下就有。各种条件、判断、参数都有解释。我本人非常喜欢这种自由度高,sql看起来也很舒服的配置方式。
至此,大体的使用介绍已经完毕。MyBatis还是挺不错的,建议大家在业务合适的情况下试用试用。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持服务器之家!
原文链接:http://www.cnblogs.com/lekko/p/6367732.html