在前面寫測試代碼的時候,不管是基於原始dao還是Mapper接口開發都有許多的重復代碼,將spring和mybatis整合可以減少這個重復代碼,通過spring的模板方法模式,將這些重復的代碼進行封裝,如:獲取SqlSessionFactory、SqlSession、SqlSession的關閉等,我們只需要實現具體的業務處理。另外,spring還利用其IOC將Dao或者Mapper接口的放入到容器中進行管理,更好的實現了解耦。
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>
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 }
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容器中,可以實現代碼解耦。