MyBatis整合Spring开发

前置文章

阅读本文需要提前掌握JDBC、MyBatis、Spring IoC的部分基础内容,如有遗忘可以转看以下文章,再来阅读本文。
JDBC
MyBatis快速入门(XML配置文件版)
Spring基础
Spring快速入门(XML配置文件版)

本文关键词

  • SqlSessionFactoryBean
  • MapperScannerConfigurer

一、引言

JDBC规范了Java编程如何去操作数据库,MyBatis框架让程序开发更集中于关键的sql编写。但是MyBatis框架对应的Mapper接口、以及XML的配置往往也是比较繁琐的。因此,可以考虑将MyBatis整合Spring框架中,减少一些不必要的重复代码,优化程序开发。

二、MyBatis单独使用产生的问题

代码耦合
每次在获取对应的mapper对象来执行sql,都需要获得sqlSession对象,再用sqlSession对象去获取mapper对象。

        String resource = "mybatis-config.xml";
        //加载核心配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //获取sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取对应映射对象,执行sql
        XXXMapper mapper = sqlSession.getMapper(XXXMapper.class);

当然,获取sqlSession对象可以单独抽离出来,可以不用每次都再去获取一遍。但是通过sqlSession对象去获取mapper对象的过程却难以省略,而且跟程序耦合死了。

三、MyBatis整合Spring开发

① 相关依赖
mybatis-spring整合开发的maven依赖

        <!--spring和mybatis整合开发的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>

② 获取SqlSessionFactory
MyBatis是通过SqlSessionFactoryBuilder来获取SqlSessionFactory对象的。在整合开发的情形,通过SqlSessionFactoryBean来创建。
SqlSessionFactoryBean相应配置
可以在Spring核心配置文件applicationcontext.xml中做如下配置:

    <!--spring和mybatis整合的工厂bean-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
    </bean>

因为是Spring框架开发,数据源的配置也可以在applicationcontext.xml中完成。

    <!--数据源-->
    <bean id="dataSource"
          class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="username" value="root" />
        <property name="password" value="root" />
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8" />
    </bean>

③ 获取mapper/dao对象
Ⅰ、硬编码
单独使用MyBatis是需要通过sqlSession去获取对应的mapper,是硬编码的形式来获取sql执行对象,不便于后期的维护。

        //获取对应映射对象,执行sql
        XXXMapper mapper = sqlSession.getMapper(XXXMapper.class);

Ⅱ、通过MapperFactoryBean注入容器
通过配置应用容器,获取MapperFactoryBean工厂bean。这种形式虽然解耦了,但是不难发现一次配置只对应了一个mapper对象。mapper对象一多,配置起来就显得相当繁琐。

        //MapperFactoryBean工厂bean,用于获取对象
        <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
          <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
          <property name="sqlSessionFactory" ref="sqlSessionFactory" />
        </bean>

Ⅲ、通过MapperScannerConfigurer注入容器
MapperScannerConfigurer的作用其实与MapperFactoryBean类似,都是通过工厂bean获取程序需要的mapper对象。但是MapperScannerConfigurer的属性允许它批量注册包路径下的所有类到容器中。

        //MapperScannerConfigurer实现了FactoryBean接口,可以批量注入
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.viewscenes.netsupervisor.dao" />
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
        </bean>

四、总结

MyBatis开发到MyBatis整合Spring开发,整个优化流程更类似于在生命周期上优化:获取SqlSessionFactory -> SqlSession对象 -> 获取mapper/dao对象。在各个节点做适当的抽离,让程序编码更加优雅。
感谢查看本文,如有不足欢迎留言/私信订正。感谢点赞支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容