Mybatis+strus2+spring 整合

1、MyBatis-Spring简介:

MyBatis-Spring帮助你无缝地整合MyBatis代码到Spring中。使用这个类库中的类,Spring将会加载必要的MyBatis工厂类和session 类。

这个类库也提供一个简单的方式来注入MyBatis数据映射器和SqlSession到业务层的bean中。而且它也会处理事务,翻译MyBatis

异常到Spring的DataAccessException异常(数据访问异常,译者注)。最终,它不依赖于MyBatis,Spring或MyBatis-Spring来构建应用程序代码。

2、要使用MyBatis-Spring模块,你只需要包含mybatis-spring-1.0.0.jar(现在已经更新到mybatis-spring-1.2.1)文件,并在类路径中加入依赖关系。

要和Spring一起使用MyBatis,你需要在Spring应用上下文中定义至少两样东西:一个SqlSessionFactory和至少一个数据映射器类。 
  在MyBatis-Spring中,SqlSessionFactoryBean是用于创建SqlSessionFactory的。要配置这个工厂bean,

放置下面的代码在Spring的XML配置文件中:


[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">   
  2. <property name="dataSource" ref="dataSource" />   
  3. </bean>  


要注意SqlSessionFactory需要一个DataSource(数据源)。这可以是任意

的DataSource,配置它就和配置其它Spring数据库连接一样。如下:


[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!-- 数据库配置文件位置 -->  
  2.     <context:property-placeholder location="classpath:jdbc.properties" />  
  3.       
  4.     <!-- 配置dbcp数据源 -->  
  5.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  6.         <property name="driverClassName" value="${jdbc.driverClassName}" />  
  7.         <property name="url" value="${jdbc.url}" />  
  8.         <property name="username" value="${jdbc.username}" />  
  9.         <property name="password" value="${jdbc.password}" />  
  10.         <!-- 队列中的最小等待数 -->  
  11.         <property name="minIdle" value="${jdbc.minIdle}"></property>  
  12.         <!-- 队列中的最大等待数 -->  
  13.         <property name="maxIdle" value="${jdbc.maxIdle}"></property>  
  14.         <!-- 最长等待时间,单位毫秒 -->  
  15.         <property name="maxWait" value="${jdbc.maxWait}"></property>  
  16.         <!-- 最大活跃数 -->  
  17.         <property name="maxActive" value="${jdbc.maxActive}"></property>  
  18.         <property name="initialSize" value="${jdbc.initialSize}"></property>  
  19.     </bean>  


假设你有一个如下编写的数据映射器类:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public interface userMapper  
  2.   
  3. {  
  4.     public Login login(Login login);  
  5. }  

那么可以使用MapperFactoryBean,像下面这样来把接口加入到Spr ing中:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">   
  2. <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />   
  3. <property name="sqlSessionFactory" ref="sqlSessionFactory" />   
  4. </bean>  

要注意指定的映射器类必须是一个接口,而不是具体的实现类。在这个示例中,使用MyBatis的映射器XML文件来指定sql语句,

但是用注解用来指定SQL语句也是可以的。

一旦配置好,你可以用注入其它任意Spring的bean相同的方式直接注入映射器到你的business/ser vice对象中。

MapperFactoryBean处理SqlSession的创建和关闭它。如果使用了Spring 的事务,那么当事务完成时,

session 将会提交或回滚。最终,任何异常都会被翻译成Spring的DataAccessException异常。

调用MyBatis数据方法现在只需一行代码(一般是在使用工厂模式的Service实现的时候): 

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class FooServiceImpl implements FooService {   
  2. private UserMapper userMapper;   
  3. public void setUserMapper(UserMapper userMapper) {   
  4. this.userMapper = userMapper;   
  5. }   
  6. public User doSomeBusinessStuff(String userId) {   
  7. return this.userMapper.getUser(userId);   
  8. }   
  9. }  

3、现在还简单介绍一下上面的SqlSessionFactoryBean,这个是核心的:

3.1、在基本的MyBatis中,session 工厂可以使用SqlSessionFactoryBuilder.来创建。

在MyBatis-Spring中,使用了SqlSessionFactoryBean来替代。
要创建工厂bean,放置下面的代码在Spring的XML配置文件中:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">   
  2. <property name="dataSource" ref="dataSource" />   
  3. </bean>  

要注意SqlSessionFactoryBean实现了Spring的FactoryBean接口。这就说明由Spring最终创建的bean不是SqlSessionFactoryBean本
身,而是工厂类的getObject()返回的方法的结果。这种情况下,Spring将会在应用启动时为你创建SqlSessionFactory对象,

然后将它以SqlSessionFactory为名来存储。在Java中,相同的代码是:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();   
  2. SqlSessionFactory sessionFactory = factoryBean.getObject();  

在一般的MyBatis-Spring用法中,你不需要直接使用SqlSessionFactoryBean或和其对

应的SqlSessionFactory。相反,session工厂将会被注入到MapperFactoryBean或其它扩
展了SqlSessionDaoSupport的DAO(也就是数据访问对象)中。

3.1、现在再看看数据源的配置及一些属性:

SqlSessionFactory有一个单独的必须属性,就是JDBC的DataSource。这可以是任意
的DataSource,其配置应该和其它Spring数据库连接是一样的。 
  一个通用的属性是configLocation,它是用来指定MyBatis的XML配置文件路径的。
如果基本的MyBatis配置需要改变,那么这就是一个需要它的地方。通常这会是<settings>
或<typeAliases>的部分。 
  要注意这个配置文件不需要是一个完整的MyBatis配置。确定地说,任意环境,数据源
和MyBatis的事务管理器都会被忽略。SqlSessionFactoryBean会创建它自己的,使用这些
值定制MyBatis的Environment时是需要的。 
  如果MyBatis映射器XML文件在和映射器类相同的路径下不存在,那么另外一个需要
配置文件的原因就是它了。使用这个配置,有两种选择。第一是手动在MyBatis的XML配
置文件中使用<mappers>部分来指定类路径。第二是使用工厂bean的mapperLocations属
性。 
  mapperLocations属性使用一个资源位置的list。这个属性可以用来指定MyBatis的XML
映射器文件的位置。它的值可以包含Ant样式来加载一个目录中所有文件,或者从基路径下
递归搜索所有路径。比如:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">   
  2. <property name="dataSource" ref="dataSource" />   
  3. <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />   
  4. </bean>  

这会从类路径下加载在sample.config.mappers 包和它的子包中所有的MyBatis映射器XML文件。

下面写上详细的一些简单配置:

spring的配置文件如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"   
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  8.     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
  9.     http://www.springframework.org/schema/aop   
  10.     http://www.springframework.org/schema/aop/spring-aop-3.2.xsd  
  11.     http://www.springframework.org/schema/tx   
  12.     http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"  
  13.     default-autowire="byName">  
  14.   
  15.     <!-- 加载数据库配置文件,如果是Sqlserver数据库,请修改此值为Sqlserver.config -->  
  16.     <bean id="config"  
  17.         class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">  
  18.         <property name="locations">  
  19.             <list>  
  20.                 <value>  
  21.                     classpath:config/Oracle.properties  
  22.                 </value>  
  23.             </list>  
  24.         </property>  
  25.     </bean>  
  26.   
  27.     <!-- 获取数据源 dataSource -->  
  28.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
  29.         destroy-method="close">  
  30.         <property name="driverClassName" value="${driverClassName}" />  
  31.         <property name="url" value="${url}" />  
  32.         <property name="username" value="${username}" />  
  33.         <property name="password" value="${password}" />  
  34.     </bean>  
  35.   
  36.     <!-- 管理SqlSession,自动打开,关闭,提交,回滚等 -->  
  37.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  38.         <property name="configLocation">  
  39.             <value>classpath:config/mybatis.xml</value>  
  40.         </property>  
  41.         <property name="dataSource" ref="dataSource"/>  
  42.     </bean>  
  43.   
  44.     <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
  45.         <constructor-arg index="0" ref="sqlSessionFactory" />  
  46.     </bean>   
  47.       
  48.  <!--    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DateSourceTransactionManager">  
  49.         <property name="dataSource" ref="dataSource"/>  
  50.     </bean>  
  51.       
  52.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  53.        <tx:attributes>  
  54.            <tx:method name="select*" read-only="true"/>  
  55.            <tx:method name="query*" read-only="true"/>  
  56.            <tx:method name="get*" read-only="true"/>  
  57.            <tx:method name="find*" read-only="true"/>  
  58.            </tx:attributes>  
  59.     </tx:advice>  
  60.       
  61.     <aop:config>  
  62.        <aop:pointcut expression="execution(* net.business.*.*(..))" id="aopConfig"/>  
  63.        <aop:advisor advice-ref="txAdvice" pointcut-ref="aopConfig"/>  
  64.     </aop:config> -->  
  65.       
  66. </beans>  

Sqlserver数据库Sqlserver.properties如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver  
  2. url=jdbc:sqlserver://localhost:1433; DatabaseName=dataName  
  3. username=sa  
  4. password=sa  

mybatis的配置文件mybatis.xml 如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >  
  3. <configuration>  
  4.    <!-- 参数设置 -->  
  5.     <settings>  
  6.         <!-- 这个配置使全局的映射器启用或禁用缓存 -->  
  7.         <setting name="cacheEnabled" value="true" />  
  8.         <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->  
  9.         <setting name="lazyLoadingEnabled" value="true" />  
  10.         <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载 -->  
  11.         <setting name="aggressiveLazyLoading" value="true" />  
  12.         <!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动) -->  
  13.         <setting name="multipleResultSetsEnabled" value="true" />  
  14.         <!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 -->  
  15.         <setting name="useColumnLabel" value="true" />  
  16.         <!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby) -->  
  17.         <setting name="useGeneratedKeys" value="true" />  
  18.         <!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况) -->  
  19.         <setting name="autoMappingBehavior" value="PARTIAL" />  
  20.         <!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新 -->  
  21.         <setting name="defaultExecutorType" value="SIMPLE" />  
  22.         <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->  
  23.         <setting name="defaultStatementTimeout" value="25000" />  
  24.     </settings>  
  25.       
  26.     <!-- 别名定义 -->  
  27.     <typeAliases>  
  28.         <typeAlias alias="Login" type="net.system.Login" />  
  29.     </typeAliases>  
  30.     <!-- 映射文件,存放sql语句的配置文件 -->  
  31.     <mappers>  
  32.         <mapper resource="net/system/Login.xml" />  
  33.     </mappers>     
  34.       
  35. </configuration>  


4、使用SqlSession 

上面的说明中还有最重要的没有提了,那就是SqlSession 的实现了。

在MyBatis中,你可以使用SqlSessionFactory来创建SqlSession。一旦你获得一个
session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时
候,你可以关闭session。使用MyBatis-Spring之后,你不再需要直接使用SqlSessionFactory
了,因为你的bean可以通过一个线程安全的SqlSession来注入,基于Spring的事务配置
来自动提交,回滚,关闭session。 
  注意通常不必直接使用SqlSession。在大多数情况下MapperFactoryBean,将会在bean
中注入所需要的映射器。下一章节中的MapperFactoryBean会解释这个细节。

这里主要介绍两种,SqlSessionTemplate和SqlSessionSupport。

4.1、SqlSessionTemplate:

SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,
调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO
所共享使用。 
  当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate
将会保证使用的SqlSession是和当前Spring的事务相关的。此外,它管理session的生命
周期,包含必要的关闭,提交或回滚操作。 
  SqlSessionTemplate实现了SqlSession,这就是说要对MyBatis的SqlSession进行简易替换。 
SqlSessionTemplate通常是被用来替代默认的MyBatis实现的DefaultSqlSession,
因为它不能参与到Spring 的事务中也不能被注入,因为它是线程不安全的。相同应用程序
中两个类之间的转换可能会引起数据一致性的问题。 
SqlSessionTemplate对象可以使用SqlSessionFactory作为构造方法的参数来创建。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!-- 配置mybitasSqlSessionFactoryBean -->  
  2.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  3.         <property name="dataSource" ref="dataSource" />  
  4.         <property name="configLocation" value="classpath:mybatis.xml"></property>  
  5.     </bean>  
  6.       
  7.     <!-- 配置SqlSessionTemplate -->  
  8.     <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">  
  9.         <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />  
  10.     </bean>  

接下来看看去证明实现呢?

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class UserDaoImpl implements UserDao {  
  2.     private SqlSessionTemplate sqlSessionTemplate;  
  3.     public User findUserByid(Integer userId) {  
  4.         return sqlSessionTemplate.selectOne(FIND_USER_BYID, userId);  
  5.     }  
  6.     public List<User> findAll() {  
  7.         return sqlSessionTemplate.selectList(SELECT_ALL_USER);  
  8.     }  
  9.     public User userLogin(User user) {  
  10.         return sqlSessionTemplate.selectOne(USER_LOGIN, user);  
  11.     }  
  12. }  

如下注入SqlSessionTemplate:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">   
  2. <property name="sqlSession" ref="sqlSessionTemplate"/>   
  3. </bean>  

4.2、SqlSessionSupport:

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

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {   
  2. public User getUser(String userId) {   
  3. return (User) getSqlSession()   
  4. .selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);   
  5. }   
  6. }  

假设类UserMapperImpl是SqlSessionDaoSupport的子类,它可以在Spring中进行如下的配置:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <bean id="userMapper" class="org.mybatis.spring.sample.mapper.UserMapperImpl">   
  2. <!--注入SqlSessionTemplate实例 -->    
  3.    <property name="sqlSessionTemplate" ref="sqlSession" />     
  4.    <!--也可直接注入SqlSessionFactory实例,二者都指定时,SqlSessionFactory失效 -->    
  5.    <!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" />   -->    
  6. </bean>  

当然还有两种session配置了 就是:MapperFactoryBean和MapperScannerConfigurer:

这两种就不介绍了,当然了还有事务管理也没有说明了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值