目录
本文概览:配置mybatis所需要的pom.xml、spring的xml、代码,包含单数据源和多数据源两种配置。还包括sqlSessionTemplate的使用。
1 单数据源
1.1 配置
1 pom.xml
1 2 3 4 5 |
<properties> <junit.version>4.8.2</junit.version> <hamcrest.version>1.3</hamcrest.version> <org.springframework.version>3.2.5.RELEASE</org.springframework.version> </properties> |
(1)mybatis相关
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<!--配置 mybatis beg--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!-- 这里还需要spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework.version}</version> </dependency> <!--配置 mybatis end--> |
(2)数据库连接池
1 2 3 4 5 6 7 |
<!--配置 数据库连接池 end--> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <!--配置 数据库连接池 end--> |
(3)spring相关
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 |
<!--配置IOC beg--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <artifactId>spring-test</artifactId> <groupId>org.springframework</groupId> <version>${org.springframework.version}</version> <scope>test</scope> </dependency> <!--配置 Spring-IOC end--> <!--配置 Spring-transaction start--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework.version}</version> </dependency> <!--配置 Spring-transaction end--> |
(4)为了进行测试还需要
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!--配置 单元测试 beg--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>${hamcrest.version}</version> </dependency> <!--配置 单元测试 end--> |
2 spring.xml
(1)applicationContext.xml
- 加载properties
- 加载其他的spring的xml文件,如下local_database.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 加载properties文件 --> <context:property-placeholder location="classpath:config.properties" /> <!-- 加载spring的xml文件 --> <import resource="classpath:spring/local_database.xml"/> <import resource="classpath:spring/service.xml"/> </beans> |
(2) mybatis对应的spring配置
- datasource定义
- sqlSessionFactory定义
- 两种mybatis方式
- 事务配置
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 38 39 40 41 42 43 44 45 46 47 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- ===================== Mybatis配置 beg ====================================== --> <!-- 公共 beg --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" > <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="2" /> <property name="initialSize" value="1" /> <property name="maxIdle" value="2" /> <property name="minIdle" value="1" /> <!-- 等待连接超时时间,30秒 --> <property name="maxWait" value="30000" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:/mappers/*.xml" /> </bean> <!-- 公共 end --> <!-- 方式1 beg--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--配置扫描的dao接口的路径,可以有多个路径,每一个用逗号隔开--> <property name="basePackage" value="dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!-- 方式1 end--> <!-- 方式2 beg--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean> <!-- 方式2 end--> <!-- ============== Mybatis配置 end ==================== --> <!-- =============== 事务配置 beg ======================= --> <!-- 事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven /> <!-- ==================== 事务配置 end ============================ --> </beans> |
(4) config.properties
1 2 3 4 |
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/test jdbc.user=root jdbc.password=53061208 |
3. mapper.xml
1 2 3 4 5 6 7 8 9 |
<?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="dao.StudentDao"> <select id="count" resultType="int"> select count(1) from student </select> </mapper> |
4. 代码
(1)定义dao
1 2 3 4 5 6 7 8 |
@Repository public interface StudentDao { /** * 统计表大小 * @return */ int count(); } |
(2)测试
- 定义测试基类
1 2 3 4 5 |
@ContextConfiguration("classpath:applicationContext.xml") @RunWith(SpringJUnit4ClassRunner.class) public class BaseTest { } |
- 测试类
1 2 3 4 5 6 7 8 9 10 |
public class StudentDaoTest extends BaseTest { @Resource private StudentDao studentDao; @Test public void testQuery(){ int count = studentDao.count(); System.out.println(count); } } |
5. 关于mybatis-config.xml的说明,其实这里推荐不再使用mybatis-config.xml
有的时候在配置中使用了mybatis-config.xml,如下
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置mappers --> <mappers> <mapper resource="mappers/StudentDaoMapper.xml"/> </mappers> </configuration> |
mybatis-config.xml作用就是可以配置<mappers>和<typeHandlers>,,是为了配置sqlSessionFactoryBean服务:
1 2 3 4 |
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> |
mybatis-config.xml配置都可以在sqlSessionFactoryBean中属性直接配置,这样就不需要mybatis-config.xml了,如下通过mapperLocations来配置替换mybatis-config.xml中的<mappers>:
1 2 3 4 |
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:/mappers/*.xml"/> </bean> |
综上,引入mybatis-config.xml的作用就是为了更方便的初始化sqlSessionFactoryBean,但是不好地方就是自己在配置mybatis时需要新增一个mybatis-config.xml文件,这样造成配置文件太多了,所以就推荐不使用mybatis-config.xml的方式,都是直接在定义sqlSessionFactory时配置属性。
6. github代码
https://github.com/zhonghuwu/mybatistemplate
1.2 @Respository和sqlSessionTemplate两种使用mybatis的方式区别
1、在dao.xml文件
(1)@Respository配置
1 2 3 4 5 |
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--配置扫描的dao接口的路径,可以有多个路径,每一个用逗号隔开--> <property name="basePackage" value="com.qunar.qtown.persistence.dao,com.qunar.qtown.bundle.search.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> |
(2)sqlSession方法
1 2 3 |
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean> |
2、关于mapper.xml中namespace属性
(1)使用@Respository需要指定具体的类。
1 2 |
<mapper namespace="com.qunar.hotel.crm.dao.AccompanyVisitMappingDao"> </mapper> |
(2)对于sqlSessionTemlate,此属性的值则是一个随意的名字,但是这里是采用和接口方法相同,这样好处在于可以同时使用@Respository和sqlSessionTemplate方法。
2 多数据源
相比上面的mybatis的xml的配置,需要再新增一个xml,需要配置如下
- dataSource,新增的数据源dataSource2
- sqlSessionFactory,需要指定新的数据源dataSource2和mapper文件,所以所以在代码中新数据源对应的mappers要和之前数据源放在不同目录下面。
- MapperScannerConfiurer,定义新的MappScannerConfigureer时,需要重新指定basePackage和sqlSessionFactory。所以在代码中新数据源对应的dao接口要和之前数据源放在不同包下面。
- TransactionManger,指定新的数据源dataSource2。
- sqlSesion,指定新的数据源dataSource2。
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 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- ============== Mybatis配置 beg ============== --> <!-- 公共 beg --> <bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> <property name="maxActive" value="600"/> <property name="initialSize" value="1"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="1"/> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="select NOW()"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="poolPreparedStatements" value="true"/> <property name="maxOpenPreparedStatements" value="20"/> </bean> <bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource2" /> <property name="mapperLocations" value="classpath:/mappers/database2/*.xml"/> </bean> <!-- 公共 end --> <!-- 方式1 beg--> <bean id="mapperScannerConfigurer2" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--配置扫描的dao接口的路径,可以有多个路径,每一个用逗号隔开--> <property name="basePackage" value="dao.mybatis.annotation.datasource2"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2"/> </bean> <!-- 方式1 end--> <!-- 方式2 beg--> <bean id="sqlSession2" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory2" /> </bean> <!-- 方式2 end--> <!-- ============ Mybatis配置 end ======================= --> <!-- ============= 事务配置 beg =================== --> <!-- 事务 --> <bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource2" /> </bean> <!-- ================== 事务配置 end =============== --> </beans> |
3 SqlSessionTemplate
在上面的单数据源和多数据源都是使用mybatis的注解@Responsitory。其实还有这一种方法就是通过sessionTemplate方式来使用。配置信息都是和上面的一样,下面是代码
1. 使用sqlSession来实现dao
1 2 3 4 5 6 7 8 9 10 11 |
@Service public class StudentDaoWithSqlSession { private static final Logger logger = LoggerFactory.getLogger(StudentDaoWithSqlSession.class); @Resource private SqlSessionTemplate sqlSession; public void select(){ // 参数是mapper中<select>中id的值 int count = sqlSession.<Integer>selectOne("dao.mybatis.annotation.datasource1.StudentDao.count"); logger.info("count="+count); } } |
1 2 3 4 5 6 7 8 |
public class MybatisSqlSessionTest extends BaseTest { @Resource private StudentDaoWithSqlSession studentDaoWithSqlSession; @Test public void testCount(){ studentDaoWithSqlSession.select(); } } |
4 扫描配置的改进
1 2 3 4 5 |
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--配置扫描的dao接口的路径,可以有多个路径,每一个用逗号隔开--> <property name="basePackage" value="dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> |
1 |
<mybatis:scan base-package="dao" factory-ref="sqlSessionFactory"/> |
2、把Dao接口中@Repository注解删除掉
1 2 3 |
public interface StudentDao { ... } |
在使用mybatis generator自动生成mapper时,都是没有使用@Respository的,参考
(全文完)