前置文章
阅读本文需要提前掌握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对象。在各个节点做适当的抽离,让程序编码更加优雅。
感谢查看本文,如有不足欢迎留言/私信订正。感谢点赞支持。