- 简介
在前面写测试代码的时候,不管是基于原始dao还是Mapper接口开发都有许多的重复代码,将spring和mybatis整合可以减少这个重复代码,通过spring的模板方法模式,将这些重复的代码进行封装,如:获取SqlSessionFactory、SqlSession、SqlSession的关闭等,我们只需要实现具体的业务处理。另外,spring还利用其IOC将Dao或者Mapper接口的放入到容器中进行管理,更好的实现了解耦。
- Spring和MyBatis整合
1、整合思路:
需要spring通过单例方式管理SqlSessionFactory。spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)持久层的mapper都需要由spring进行管理。
2、整合环境
创建一个新的java工程,将Mybatis和Spring整合的jar包导入到工程中。
3、sqlSessionFactory
在applicationContext.xml配置sqlSessionFactory和数据源:
1 <!-- 加载配置文件 --> 2 <context:property-placeholder location="classpath:db.properties" /> 3 4 <!-- 数据源,使用dbcp --> 5 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 6 destroy-method="close"> 7 <property name="driverClassName" value="${jdbc.driver}" /> 8 <property name="url" value="${jdbc.url}" /> 9 <property name="username" value="${jdbc.username}" /> 10 <property name="password" value="${jdbc.password}" /> 11 <property name="maxActive" value="10" /> 12 <property name="maxIdle" value="5" /> 13 </bean> 14 15 16 <!-- sqlSessinFactory --> 17 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 18 <!-- 加载mybatis的配置文件 --> 19 <property name="configLocation" value="mybatis/SqlMapConfig.xml" /> 20 <!-- 数据源 --> 21 <property name="dataSource" ref="dataSource" /> 22 </bean>
- 原始Dao开发
1、其他都基本相同,就是Dao的实现类有所变化:
1 public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{ 2 @Override 3 public User findUserById(int id) throws Exception { 4 SqlSession sqlSession = this.getSqlSession();//获取sqlSession 5 User user = sqlSession.selectOne("user.findUserById", id); 6 return user; 7 } 8 }
实现类继承SqlSessionDaoSupport,这样spring就通过模板方法将 获取sqlSessionFactory、获取sqlSession、事务管理、关闭sqlSession进行了封装,我们只需要负责业务逻辑即可。
2、配置dao
在applicationContext.xml中配置dao。
1 <!-- 配置userDaoImpl --> 2 <bean id="userDao" class="com.luchao.mybatis.first.daoimpl.UserDaoImpl"> 3 <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 4 </bean>
3、测试程序
1 public class MyBatis_mapper_test { 2 private ApplicationContext applicationContext; 3 @Before 4 public void init() throws IOException { 5 this.applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); 6 } 7 @Test 8 public void testFindUserById() throws Exception { 9 // 创建UserMapper对象 10 UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper"); 11 // 调用userMapper的方法 12 User user = userMapper.findUserById(10); 13 // 打印客户信息 14 System.out.println(user); 15 } 16 }
- Mapper代理开发
1、在Spring中配置Mapper接口
(1)、使用org.mybatis.spring.mapper.MapperFactoryBean,根据mapper接口生成代理对象
1 <bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean"> 2 <property name="mapperInterface" value="mapper接口地址"/> 3 <property name="sqlSessionFactory" ref="sqlSessionFactory"/> 4 </bean>
需要针对每个mapper进行配置,比较麻烦。
(2)、通过MapperScannerConfigurer进行mapper扫描
1 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 2 <property name="basePackage" value="mapper接口包地址"></property> 3 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> 4 </bean>
basePackage:扫描包路径,中间可以用逗号或分号分隔定义多个包。
这种方式mapper.xml的文件名和mapper的接口名称保持一致,且放在同一个目录。如果将mapper.xml和mapper接口的名称保持一致且放在一个目录 则不用在sqlMapConfig.xml中进行配置。
可以看出将Mybatis整合到Spring中,可以减少模板代码的书写,并且将Dao和Mapper通过配置放入到Spring容器中,可以实现代码解耦。