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注解使用,可以使代码变得清晰简洁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容