Spring和MyBatis的整合
1. Spring和各個框架的整合
Spring目前是JavaWeb開發中最終的框架,提供一站式服務,可以其他各個框架整合集成
Spring整合方案
1.1. SSH
Ssh是早期的一種整合方案
Struts2 : Web層框架
Spring : 容器框架
Hibernate : 持久層框架
2. SSM
主流的項目架構的三大框架(相對其他框架而言,最優秀)
SpringMVC : spring自己家的 Web層框架,spring的一個模塊
Spring :容器框架
MyBatis :持久層框架
3. Spring與MyBatis整合
3.1. 集成思路
實際開發,使用Maven項目,直接引入項項目在Maven倉庫中的坐標即可
學習階段: 手動導入jar包,從零開始集成(鞏固基礎知識)
3.2. 創建java項目
![]()
|
3.3. 准備集成相關jar包
3.3.1. Spring依賴包
![]()
|
3.3.2. Mybatis依賴包
|
3.3.3. MyBatis和Spring框架集成的橋梁包
Spring自己並沒有集成MyBatis框架,需要MyBatis自己來集成,所以需要自己提供Spring框架集成的橋梁包
如果我們使用的mybatis3.4.4 不能直接使用mybatis內置的 橋梁包版本,版本比較低,無法正常運行,需要單獨下載一個比價高的版本
|
3.3.4. 數據庫驅動包和連接池
|
|
3.3.5. Mybatis支持的日志包log4j
|
3.4. 項目集成需要各種配置文件
|
3.5. 完成項目層與層之間spring對象的創建和依賴關系的維護
3.5.1. Service層
package cn.zj.mybatis.service.impl;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import cn.zj.mybatis.mapper.UserMapper; import cn.zj.mybatis.pojo.User; import cn.zj.mybatis.service.UserService;
@Service public class UserServiceImpl implements UserService { /* * 問題: UserMapper 代理對象如何創建? * 答 :使用 SqlSession 操作對象創建 ! * * 問題 : SqlSession 對象如何創建? * * 答 : SqlSessionFactory 工廠對象創建? * * 問題: SqlSessionFactory 對象如何創建 * * 1,和Spring框架集成之前 * MyBatis框架自己讀取配置文件中的相關配置去創建 * 2, 和Spring框架集成之后 * 交個Spring容器來創建 * 問題: 如何在Spring框架中配置,創建出來SqlSessionFactory對象? * mybatis和spring集成的類查閱 橋梁包 * org.mybatis.spring.SqlSessionFactoryBean 創建 SqlSessionFactory * */ @Autowired private UserMapper mapper;
@Override public int insert(User user) { return mapper.insert(user); }
@Override public User selectByPrimaryKey(Integer id) { System.out.println(mapper); return mapper.selectByPrimaryKey(id); }
}
|
3.5.2. 測試代碼
package cn.zj.mybatis.test;
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.zj.mybatis.pojo.User; import cn.zj.mybatis.service.UserService;
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class UserServiceTest {
@Autowired private UserService service;
@Test public void testInsert() { User user = new User(null, "喬峰", "qiaofeng", 30); int row = service.insert(user); System.out.println(row);
}
@Test public void testSelectByPrimaryKey() { User user = service.selectByPrimaryKey(8); System.out.println(user); }
}
|
3.5.3. applicationContext配置文件的配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd ">
<!-- 設置注解配置包掃描位置 --> <context:component-scan base-package="cn.zj.mybatis"/>
</beans> |
3.6. MyBatis 框架SqlSessionFactory對象的創建
* 問題: UserMapper 代理對象如何創建?
* 答 :使用 SqlSession 操作對象創建 !
*
* 問題 : SqlSession 對象如何創建?
*
* 答 : SqlSessionFactory 工廠對象創建?
*
* 問題: SqlSessionFactory 對象如何創建
*
* 1,和Spring框架集成之前
* MyBatis框架自己讀取配置文件中的相關配置去創建
* 2, 和Spring框架集成之后
* 交個Spring容器來創建
* 問題: 如何在Spring框架中配置,創建出來SqlSessionFactory對象?
* mybatis和spring集成的類查閱 橋梁包
* org.mybatis.spring.SqlSessionFactoryBean 創建 SqlSessionFactory
*
*/
創建MyBatis框架工廠對象的 類在mybatis-spring1.2.1.jar 橋梁包中的
org.mybatis.spring.SqlSessionFactoryBean 類 如下圖
![]()
|
3.6.1. 配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd ">
<!-- 配置讀取 db.properties 數據庫配置文件 --> <context:property-placeholder location="classpath:db.properties"/>
<!-- 配置數據源連接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="maxActive" value="${jdbc.maxActive}"/> </bean>
<!-- 配置MyBatis框架的 SqlSessionFactoryBean 類,創建
SqlSessionFactory 工廠對象 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 1.注入數據源 --> <property name="dataSource" ref="dataSource"/>
<!-- 2.配置映射文件 --> <property name="mapperLocations"> <array> <!-- <value>classpath:cn/zj/mybatis/mapper/UserMapper.xml</value> --> <!-- 可以使用通配符 * 讀取 目錄下面所有的配置文件 --> <value>classpath:cn/zj/mybatis/mapper/*Mapper.xml</value> </array> </property>
<!-- 3. 配置別名使用包掃描 --> <property name="typeAliasesPackage" value="cn.zj.mybatis.pojo"/>
<!-- 4.讀取mybat-config.xml配置文件,此配置文件可能還會配一些mybatis框架的 其他個性化配置 實際項目開發可能不用配置 --> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> </beans> |
3.7. 創建MyBatis的Mapper接口的代理對象
使用橋梁包 org.mybatis.spring.mapper.MapperFactoryBean<T> 創建 UserMapper代理對象
![]()
|
此種方式每一個Mapper接口需要單獨配置,如果Mapper過多,創建Mapper可能造成配置代碼過多
<!-- 創建UserMapper代理對象-創建單個Mapper對象
使用橋梁包 org.mybatis.spring.mapper.MapperFactoryBean<T> 創建 UserMapper代理對象 -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 注入SqlSessionFacotry對象 --> <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
<!-- 注入UserMapper接口類型:底層創建UserMapper的代理對象 --> <property name="mapperInterface" value="cn.zj.mybatis.mapper.UserMapper"/>
</bean> |
3.8. 使用包掃描創建MyBatis的Mapper接口的代理對象
![]()
|
<!-- 批量創建Mapper代理對象 ,使用包掃描創建Mapper代理對象 使用橋梁包 org.mybatis.spring.mapper.MapperScannerConfigurer -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 配置需要創建Mapper接口代理對象對應的包 --> <property name="basePackage" value="cn.zj.mybatis.mapper"/>
<!-- 配置SqlSessionFactoryBean 的名稱,不是引用 --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> |
3.9. MyBatis的事務管理器的配置
一般開發,事務的管理都會使用aop切入到業務層
<!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入數據源 --> <property name="dataSource" ref="dataSource"/> </bean>
<!-- spring事務配置 --> <tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 事務屬性配置 --> <tx:attributes> <!-- DQL :查詢操作,配置只讀事務 --> <tx:method name="get*" read-only="true" isolation="REPEATABLE_READ" propagation="REQUIRED"/> <tx:method name="select*" read-only="true" isolation="REPEATABLE_READ" propagation="REQUIRED"/> <tx:method name="find*" read-only="true" isolation="REPEATABLE_READ" propagation="REQUIRED"/> <tx:method name="query*" read-only="true" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
<!-- 其他 SQL :非只讀事務 --> <tx:method name="*" read-only="false" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置AOP 切入事務 -->
<aop:config> <!-- 切入點 --> <aop:pointcut expression="execution(* cn.zj.mybatis.service..*.*(..))" id="pt"/>
<!-- 切面 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/> </aop:config>
|