Spring框架整合MyBatis框架

1.1    基本整合方式

Spring框架整合其他框架的本质其实就是把其他框架交给Spring框架管理。Spring框架通过IoC、AOP等机制实现与其他框架的连接,最终建立一个低耦合的应用架构,这大大增强了系统的灵活性,便于功能扩展。

1.1.1    整合思路梳理

MyBatis框架主要是通过SqlSession实例实现对数据的操作,而SqlSession实例是通过SqlSessionFactory创建的,SqlSessionFactory实例又是由SqlSessionFactoryBuilder依据MyBatis配置文件中的数据源、SQL映射文件等信息构建的。

1.1.2    整合所需的依赖及配置

原来的724系统中没有使用Spring框架,所以除原有jar包外还需要添加Spring框架的相关jar包。Spring框架并没有提供直接整合MyBatis框架的功能,所以还需要添加一个整合两个框架的关联jar包。

1.1.3    使用Spring配置文件配置数据源

在Spring配置文件中配置数据源的关键代码如示例1所示。

示例1

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

      destroy-method="close">

    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />


&characterEncoding=utf8&serverTimezone=Asia/Shanghai]]>

-->

    <property name="url" value="jdbc:mysql://127.0.0.1:3306/cvs_db?useUnicode=

          true &amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>

    <property name="username" value="root" />

    <property name="password" value="123456" />

</bean>

知识回顾:

XML文件中的特殊字符可以使用<![CDATA[]]>标签进行处理,也可以使用对象引用来替换。示例4中使用“&amp;”替换了“&”。

1.1.4    通过Spring配置文件创建SqlSessionFactory

在MyBatis框架中,配置完数据源之后,就可以使用SqlSessionFactoryBuilder创建SqlSessionFactory实例了。而MyBatis-Spring整合包中提供了SqlSessionFactoryBean类来实现同样的功能。SqlSessionFactory中封装了SqlSessionFactoryBuilder创建SqlSessionFactory实例的过程,在Spring配置文件中可以通过配置SqlSessionFactoryBean获取SqlSessionFactory。配置代码如示例2所示。

示例2

<!-- 配置SqlSessionFactoryBean -->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    <!-- 引用数据源组件 -->

    <property name="dataSource" ref="dataSource" />

    <!-- 引用MyBatis配置文件中的配置 -->

    <property name="configLocation" value="classpath:mybatis-config.xml" />

    <!-- 配置SQL映射文件信息 -->

    <property name="mapperLocations">

            <value>classpath:mapper/**/*.xml

</bean>

1.1.5    通过SqlSessionTemplate操作数据库

MyBatis框架是通过SqlSessionFactory获取操作数据库的SqlSession实例的,而MyBatis-Spring整合包提供了更加简便且强大的SqlSessionTemplate代替SqlSession实现同样功能。SqlSessionTemplate类实际上实现了SqlSession接口。

1.1.6    使用SqlSessionDaoSupport简化编码

除直接使用SqlSessionTemplate获取SqlSession实例处理数据的方式外,MyBatis-Spring还提供了SqlSessionDaoSupport类来简化SqlSessionTemplate的配置和获取方式。其用法如示例3所示。

示例3

SysUserDaoImpl类中的关键代码:

import cn.cvs.pojo.SysUser;

import java.util.List;

import org.mybatis.spring.support.SqlSessionDaoSupport;

/**用户数据层实现*/

public class SysUserMapperImpl extends SqlSessionDaoSupport

    implements SysUserMapper {


@Override

publicList<SysUser>selectSysUserLisr(SysUsersysUser){

    returnthis.getSqlSession().selectList(

        "cn.cvs.dao.sysUser.SysUserMapper.selectSysUserList",

        sysUser);

    }

}

Spring配置文件中的关键代码:

<!-- 配置DAO -->

<bean id="sysUserMapper" class="com.bdqn.mapper.impl.SysUserMapperImpl">

    <property name="sqlSessionFactory" ref="sqlSessionFactory" />

</bean>

1.2    映射器整合方式

在7.1节中主要使用SqlSessionTemplate类实现DAO层的相关操作。但是,这种方式不仅需要编写Mapper接口的实现类,还需要使用字符串定义方法的位置,这样不仅代码繁多,还容易出错、不易维护,如果命名空间发生变化,改起来会更麻烦。

1.2.1    使用MapperFactoryBean注入映射器

如果在DAO实现类中没有业务操作,只是使用SqlSessionTemplate类操作数据库的话,则没有必要使用SqlSessionTemplate或SqlSessionDaoSupport实现此类DAO。MyBatis-Spring提供的MapperFactoryBean能够以配置的方式生成映射器的实现类,并注入给业务组件。所以,使用MapperFactoryBean注入映射器时,首先需删除原有的DAO层实现类SysUserMapperImpl,然后修改Spring配置文件。配置文件关键代码如示例4所示。

示例4

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    <!-- 引用数据源组件 -->

    <property name="dataSource" ref="dataSource" />

    <!-- 引用MyBatis配置文件中的配置 -->

    <property name="configLocation" value="classpath:mybatis-config.xml" />

    <!-- 配置SQL映射文件信息 -->

    /**

**/


classpath:mapper/*/*.xml

-->

<!-- 配置DAO -->

<bean id="sysUserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

    <property name="mapperInterface"

          value="com.bdqn.mapper.SysUserMapper"/>

    <property name="sqlSessionFactory" ref="sqlSessionFactory" />

<!-- 省略业务Bean配置 -->

1.2.2    使用MapperScannerConfigurer注入映射器

使用MapperFactoryBean对映射器做配置,在很大程度上简化了DAO模块的编码。不过,如果映射器很多,则相应的配置项也会很多。为了简化配置工作量,MyBatis-Spring中提供了MapperScannerConfigurer的配置方法如示例5所示。

示例5

<!-- 省略数据源配置 -->

<!-- 配置SqlSessionFactoryBean -->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    <!-- 引用数据源组件 -->

    <property name="dataSource" ref="dataSource" />

    <!-- 引用MyBatis配置文件中的配置 -->

    <property name="configLocation" value="classpath:mybatis-config.xml" />

<!-- 配置DAO -->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <property name="basePackage" value="com.bdqn.mapper" />

</bean>

1.3    声明式事务

在企业管理系统开发中,事务处理是非常重要的一环,以往我们通过在业务方法中硬编码的方式进行事务控制,这样做的弊端显而易见:事务相关代码分散在业务方法中难以重用;复杂事务的编码难度较高,增加了开发难度等。

1.3.1    配置声明式事务

项目中的增、删、改操作通常需要对事务进行处理。下面以添加用户的功能为例,介绍如何用声明式事务。在Service层和DAO层增加添加用户的功能代码,如示例14所示。

示例6

SysUserMapper类中的关键代码:

/** 保存用户 */

public int add(SysUser sysUser);

SysUserMapper.xml映射文件中的关键代码:

<insert id="add" parameterType="SysUser">

    insert into t_sys_user (account,realName,password,sex

        ,birthday,phone,address,roleId,createdUserId,createdTime)

    values (#{account},#{realName},#{password},#{sex},#{birthday}

        ,#{phone},#{address},#{roleId},#{createdUserId},#{createdTime})

</insert>

SysUserService类中的关键代码:

/** 保存用户 */

public int add(SysUser sysUser);

SysUserServiceImp类中的关键代码:

@Override

public boolean add(SysUser sysUser) {

    boolean result =false;

    try {

        if (sysUserMapper.add(sysUser) ==1) {

            result =true;

            //测试事务回滚时,打开注释

            //throw new RuntimeException();

        }

    } catch (RuntimeException e) {

        e.printStackTrace();

        throw e;

    }

    return result;

}

1.3.2    使用注解实现声明式事务

除使用配置文件处理事务外,Spring框架还支持注解配合少量配置的方式处理声明式事务,相对于纯配置文件的方式,这种方式所写的代码要简洁很多。使用注解处理事务仍然需要在Spring配置文件中配置文件中配置事务管理类,并开启注解处理事务的功能,代码如示例7所示。

示例7

<!-- 定义事务管理器 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource">

<tx:annotation-driven />

注意:

示例7中事务管理器的id被定义为transactionMapper,则<tx:annotation-driven/>不需要指定transaction-manager属性的值。

总结

◎    Spring框架整合MyBatis框架后,可以采用Spring框架的事务管理,包括使用XML和注解配置事务管理,注解是@Transactional。

◎    MyBatis-Spring资源包提供了SqlSessionTemplate模板类操作数据库,常用的方法有selectList()、insert()、update()等,使用getMapper(Class<T>Type)方法可以直接访问接口实例,能够减少错误的发生,且可以不用写DAO的实现类。

◎    使用MapperScannerConfigurer可以递归扫描basePackage所指定的包下的所有接口类,配合@Autowired或@Resource注解使用,可以使代码变得清晰简洁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容