spring-mybatis 之SqlSessionFactoryBean

http://blog.csdn.net/liuxiao723846/article/details/52424802


 MyBatis 中,使用 SqlSessionFactoryBuilder创建SqlSessionFactory ,进而来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时候你可以关闭 session 

Mybatis社区自己开发了一个Mybatis-spring用来满足Mybatis用户整合Spring的需求。


使用 MyBatis-Spring 之后, 会使用SqlSessionFactoryBean来代替SqlSessionFactoryBuilder创建SqlSessionFactory,然后可以使用下面两种方式使用sqlSession。

1、SqlSessionTemplate:

Mybatis-Spring提供了一种直接使用SqlSession的方式(一个实现了SqlSession接口的SqlSessionTemplate实现类)

  1. 它是线程安全的,可以被多个Dao同时使用;
  2. 它跟Spring的事务进行了关联,确保当前被使用的SqlSession是一个已经和Spring的事务进行绑定了的,而且它还可以自己管理Session的提交和关闭。

1)spring.xml

[html]  view plain  copy
  1. <context:annotation-config/>  
  2.     <!-- 扫描service、dao组件 -->   
  3.     <context:component-scanbase-packagecontext:component-scanbase-package="cn.edu.nuc" />   
  4.     <!-- 分解配置 jdbc.properites -->   
  5.     <context:property-placeholderlocationcontext:property-placeholderlocation="classpath:jdbc.properties" />   
  6.        
  7.     <!-- 数据源c3p0 -->   
  8.     <bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">   
  9.         <propertynamepropertyname="driverClass" value="${jdbc.driverClassName}"/>   
  10.         <property name="jdbcUrl"value="${jdbc.url}" />   
  11.         <property name="user"value="${jdbc.username}" />   
  12.         <property name="password"value="${jdbc.password}" />   
  13.     </bean>  
  14.      
  15.     <!--配置sqlSessionFactory-->  
  16.     <bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">   
  17.         <propertynamepropertyname="dataSource" ref="dataSource" />   
  18.         <propertynamepropertyname="configLocation"value="classpath:mybatis/configuration.xml"/>  
  19.         <propertynamepropertyname="mapperLocations"value="classpath*:cn/edu/nuc/map/*.xml"/>  
  20.     </bean>  
  21.      
  22.     <bean id="sqlSession"class="org.mybatis.spring.SqlSessionTemplate">  
  23.       <constructor-arg index="0"ref="sqlSessionFactory" />  
  24.          </bean>  

mybatis配置文件:

[html]  view plain  copy
  1. <?xmlversionxmlversion="1.0" encoding="UTF-8" ?>      
  2. <!DOCTYPEconfiguration      
  3.     PUBLIC "-//mybatis.org//DTD Config3.0//EN"      
  4.     "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5. <configuration>  
  6. <settings>  
  7. <!--changes from the defaults for testing -->  
  8. <settingnamesettingname="cacheEnabled" value="false" />  
  9. <settingnamesettingname="useGeneratedKeys" value="true" />  
  10. <settingnamesettingname="defaultExecutorType" value="REUSE" />  
  11. <settingnamesettingname="lazyLoadingEnabled" value="false" />  
  12. <settingnamesettingname="logImpl" value="LOG4J" />  
  13. </settings>  
  14. <mappers>  
  15.    
  16.          </mappers>  
  17. </configuration>   

2)dao层实现:

[html]  view plain  copy
  1. packagecn.edu.nuc.dao;  
  2. importorg.apache.ibatis.session.SqlSession;  
  3. importorg.springframework.beans.factory.annotation.Autowired;  
  4. importorg.springframework.stereotype.Component;  
  5. importcn.edu.nuc.bean.User;  
  6.    
  7. @Component  
  8. public classUserDaoImpl implements UserDao {  
  9. @Autowired  
  10. private SqlSession sqlSession;  
  11.    
  12. publicvoid insertUsers(User user) {  
  13. sqlSession.insert("cn.edu.nuc.map.UserMapper1.insertUser",user);  
  14. }  
  15. }  
3)mapper文件:

[html]  view plain  copy
  1. <?xmlversionxmlversion="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  3. <mappernamespacemappernamespace="cn.edu.nuc.map.UserMapper1">  
  4.          
  5.      <insert id="insertUser"parameterType="cn.edu.nuc.bean.User">  
  6.             insert into user (name)values (#{name});  
  7.      </insert>  
  8. </mapper>  

4)测试

[html]  view plain  copy
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration({"classpath:spring-sqlSessionTemplate.xml"})  
  3. public classUserServiceSqlSesionTemplateTest {  
  4.            @Autowired  
  5.       private UserDao userDao;   
  6.    
  7. @Test  
  8. publicvoid testFindUserById() throws Exception {  
  9. Useruser = new User();  
  10. user.setName("lanxiaoli");  
  11. userDao.insertUsers(user);  
  12. }  
  13. }  

补充:在dao层sqlSession.insert("cn.edu.nuc.map.UserMapper1.insertUser",user);第一个参数前半部分是mapper文件的namespace,最后一个是sql的id;这两部分都是随意写的。

 

2、SqlSessionDaoSupport:

SqlSessionDaoSupport 是一个抽象的支持类, 用来为你提供 SqlSession。调用 getSqlSession()方法你会得到一个SqlSessionTemplate,之后可以用于执行 SQL 方法。

SqlSessionDaoSupport 需要一个 sqlSessionFactory 或sqlSessionTemplate 属性来设置 。 这 些要被 被 明 确地 设 置 或 者由 Spring 来 自 动 装 配 。 如 果 两 者 都 被 设 置 了 , 那 么 SqlSessionFactory 是被忽略的。(其实可以使用下面的MapperScannerConfigurer来自动装配)

1)spring.xml

[html]  view plain  copy
  1. <context:annotation-config/>  
  2.    
  3.     <!-- 扫描service、dao组件 -->   
  4.     <context:component-scanbase-packagecontext:component-scanbase-package="cn.edu.nuc" />   
  5.     <!-- 分解配置 jdbc.properites -->   
  6.     <context:property-placeholderlocationcontext:property-placeholderlocation="classpath:jdbc.properties" />   
  7.        
  8.     <!-- 数据源c3p0 -->   
  9.     <bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">   
  10.         <propertynamepropertyname="driverClass" value="${jdbc.driverClassName}"/>   
  11.         <property name="jdbcUrl"value="${jdbc.url}" />   
  12.         <property name="user"value="${jdbc.username}" />   
  13.         <property name="password"value="${jdbc.password}" />   
  14.     </bean>  
  15.      
  16.     <!--sqlSessionFactory-->  
  17.     <bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">   
  18.         <propertynamepropertyname="dataSource" ref="dataSource" />   
  19.         <propertynamepropertyname="configLocation"value="classpath:mybatis/configuration.xml"/>  
  20.         <propertynamepropertyname="mapperLocations"value="classpath*:cn/edu/nuc/map/*.xml"/>  
  21.     </bean>  
  22.     <!--SqlSessionTemplate-->  
  23.     <bean id="sqlSession"class="org.mybatis.spring.SqlSessionTemplate">  
  24.       <constructor-arg index="0"ref="sqlSessionFactory" />  
  25. </bean>  
  26.      
  27.     <bean id="userDao"class="cn.edu.nuc.dao.UserDaoImpl1">   
  28.    <!--注入SqlSessionTemplate实例 -->   
  29.    <propertynamepropertyname="sqlSessionTemplate" ref="sqlSession" />    
  30.   <!--也可直接注入SqlSessionFactory实例,二者都指定时,SqlSessionFactory失效 -->   
  31.    <!-- <propertyname="sqlSessionFactory" ref="sqlSessionFactory" />-->   
  32. </bean>  
2)dao层实现类:

[html]  view plain  copy
  1. packagecn.edu.nuc.dao;  
  2. importorg.mybatis.spring.support.SqlSessionDaoSupport;  
  3. importcn.edu.nuc.bean.User;  
  4.    
  5. public classUserDaoImpl1 extends SqlSessionDaoSupport implements UserDao {  
  6. publicvoid insertUsers(User user) {  
  7. getSqlSession().update("cn.edu.nuc.map.UserMapper1.updateUser",user);  
  8. }  
  9. }  
3)mapper文件:

[html]  view plain  copy
  1. <?xmlversionxmlversion="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  3. <mappernamespacemappernamespace="cn.edu.nuc.map.UserMapper1">  
  4.          
  5. <updateidupdateid="updateUser" parameterType="cn.edu.nuc.bean.User">  
  6.             update user setname=#{name} where id=#{id}  
  7.      </update>  
  8. </mapper>  

4)测试:

[html]  view plain  copy
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration({"classpath:spring-sqlSessiondaosupport.xml"})  
  3. public classUserServiceSqlSessionDaoSupportTest {  
  4. @Autowired  
  5.       private UserDaouserDao;  
  6.    
  7. @Test  
  8. publicvoid testFindUserById() throws Exception {  
  9. Useruser = new User();  
  10. user.setId(2L);  
  11. user.setName("12323");  
  12. userDao.insertUsers(user);  
  13. }  
  14. }  


分析:

上面做法没问题,但就是在spring.xml中需要配置所有的dao层实现,把sqlSession或者sqlSessionFactory注入进去。下面,可以使用MapperScannerConfigurer来解决这个问题。(通常使用这种方法作为dao层基础架构

1)spring.xml配置文件:

[html]  view plain  copy
  1. <context:annotation-config/>  
  2.    
  3.     <!-- 扫描service、dao组件 -->   
  4.     <context:component-scanbase-packagecontext:component-scanbase-package="cn.edu.nuc" />   
  5.     <!-- 分解配置 jdbc.properites -->   
  6.     <context:property-placeholderlocationcontext:property-placeholderlocation="classpath:jdbc.properties" />   
  7.        
  8.     <!-- 数据源c3p0 -->   
  9.     <bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">   
  10.         <propertynamepropertyname="driverClass" value="${jdbc.driverClassName}"/>   
  11.         <property name="jdbcUrl"value="${jdbc.url}" />   
  12.         <property name="user"value="${jdbc.username}" />   
  13.         <property name="password"value="${jdbc.password}" />   
  14.         <propertynamepropertyname="maxPoolSize" value="${c3p0.pool.size.max}" />   
  15.         <propertynamepropertyname="minPoolSize" value="${c3p0.pool.size.min}" />   
  16.         <propertynamepropertyname="initialPoolSize" value="${c3p0.pool.size.ini}"/>   
  17.         <propertynamepropertyname="acquireIncrement" value="${c3p0.pool.size.increment}"/>   
  18.     </bean>  
  19.      
  20.     <!--sqlSessionFactory-->  
  21.     <bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">   
  22.         <propertynamepropertyname="dataSource" ref="dataSource" />   
  23.         <propertynamepropertyname="configLocation"value="classpath:mybatis/configuration.xml"/>  
  24.         <propertynamepropertyname="mapperLocations"value="classpath*:cn/edu/nuc/map/*.xml"/>  
  25.     </bean>  
  26. <beanclassbeanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  27.         <!-- 可以不用指定,因为MapperScannerConfigurer会自动装配  
  28.                   <propertynamepropertyname="sqlSessionFactoryBeanName"value="sqlSessionFactory"/>-->  
  29.         <propertynamepropertyname="basePackage" value="cn.edu.nuc.dao" />  
  30.     </bean>  

2)dao层实现类:

[html]  view plain  copy
  1. packagecn.edu.nuc.dao;  
  2. importjavax.annotation.Resource;  
  3. importorg.apache.ibatis.session.SqlSessionFactory;  
  4. importorg.mybatis.spring.support.SqlSessionDaoSupport;  
  5. importorg.springframework.stereotype.Component;  
  6. importcn.edu.nuc.bean.User;  
  7.    
  8. @Component  
  9. public classUserDaoImpl1 extends SqlSessionDaoSupport implements UserDao {  
  10. @Resource(name="sqlSessionFactory")  
  11. public void setSqlSessionFactory(SqlSessionFactorysqlSessionFactory) {  
  12. super.setSqlSessionFactory(sqlSessionFactory);  
  13. }  
  14. publicvoid insertUsers(User user) {  
  15. getSqlSession().update("cn.edu.nuc.map.UserMapper1.updateUser",user);  
  16. }  
  17. }  

3)测试类:

[html]  view plain  copy
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration({"classpath:spring-sqlSessiondaosupport.xml"})  
  3. public classUserServiceSqlSessionDaoSupportTest {  
  4. @Autowired  
  5.     private UserDao userDaoImpl1;   
  6.    
  7. @Test  
  8. publicvoid testFindUserById() throws Exception {  
  9. Useruser = new User();  
  10. user.setId(2L);  
  11. user.setName("4321");  
  12. userDaoImpl1.insertUsers(user);  
  13. }  
  14. }  


:在dao层的实现里,必须指定public void setSqlSessionFactory(SqlSessionFactorysqlSessionFactory);一般的做法是写一个baseDao,然后把所有常见的CRUD方法实现,每个业务模块的dao去继承该baseDao

 

MapperScannerConfigurer具有下面两个重要特性:

1)不需要指定SqlSessionFactory 或SqlSessionTemplate,MapperScannerConfigurer 将会创建 MapperFactoryBean,之后自动装配

2)MapperScannerConfigurer 其实和MapperFactoryBean类似,都是创建代理然后注入到spring中;区别是前者是自动扫描数据映射器接口,生成代理类、并注入到Spring的容器中

 

我们这里不需要用MapperScannerConfigurer来创建MapperFactoryBean,以及生成代理类注入到spring中(后面的使用中会用到),我们需要:

1)需要MapperScannerConfigurer帮我们自动装配SqlSessionFactory 或 SqlSessionTemplate(因为SqlSessionDaoSupport 需要一个 sqlSessionFactory 或 sqlSessionTemplate属性来设置);

2)我们需要自己显示的在dao层加上@Component注解(否则依赖的时候会拿到注入到spring中的MapperScannerConfigurer生成的代理类)

3dao层我们继承了SqlSessionDaoSupport,所以可以直接使用getSqlSession() 方法获取sqlSessionTemplate,然后操作数据映射文件(mapper文件)里的sql了;


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring-MyBatis整合是一种常见的开发方式,其中spring-mybatis.xml文件是用来配置SpringMyBatis框架集成的配置文件。在这个文件中,我们会定义数据源、事务管理器、扫描Mapper接口等配置信息。同时,我们还需要将MyBatisSqlSessionFactory注入到Spring容器中,以便其他组件可以使用它来执行数据库操作。以下是一个简单的spring-mybatis.xml文件示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClass}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 配置SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="com.example.entity" /> <property name="mapperLocations" value="classpath*:com/example/mapper/*.xml" /> </bean> <!-- 配置Mapper扫描 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper" /> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 开启Spring的注解功能 --> <context:annotation-config /> <!-- 开启Spring的AOP功能 --> <aop:aspectj-autoproxy /> <!-- 开启Spring的事务管理功能 --> <tx:annotation-driven transaction-manager="transactionManager" /> </beans> ``` 在这个配置文件中,我们使用了Spring的注解功能、AOP功能和事务管理功能,以及MyBatis的Mapper扫描和SqlSessionFactory配置。其中,数据源、事务管理器和Mapper扫描的配置信息需要根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值