Spring框架與MyBatis框架是Java互聯網技術的主流框架。但是如何將MyBatis無縫整合到Spring框架中呢?這時候就誕生了MyBatis-Spring。使用這個類庫中得類,Spring將會加載必要的MyBatis工廠類和session類。
Spring3.0也僅僅支持ibatis2.0。本來將MyBatis3的支持添加到Spring3.0中。而不幸,Spring3.0的開發在MyBatis3.0官方發布前就結束了。因為Spring開發團隊不想發布一個非發布版的MyBatis的整合支持。就放棄了對MyBatis的支持。
隨著Spring越來越成為java事實標準的技術框架。Spring 4.0 移除了對iBatis的直接支持。MyBatis團隊開發出來了基于Spring的MyBatis整合Jar---MyBatis-Spring。
2.使用MyBatis-Spring的好處
1.使得業務層和模型層得到更好的分離。再Spring框架中MyBatis也更加簡單,節約不少的代碼
2.甚至不需要顯示的使用SqlSessionFactory、SqlSessiond等對象
3.MyBatis-Spring組成部分
1.配置數據源
2.配置SqlSessionFactory
3.配置SqlSessionTemplate
4.配置Mapper
5.事務處理
MyBatis中要構建SqlSessionFactory對象,讓它產生SqlSession,而在MyBatis-Spring項目中SqlSession的使用是通過SqlSessionTemplate來實現的,它提供了對SqlSession操作的封裝。所以可以通過SqlSessionTemplate可以得到Mapper。
4.在Spring MVC中配置
4.1 配置SqlSessionFactoryBean
在基本的 MyBatis中,session工廠可以使用SqlSessionFactoryBuilder 來創建。而在 MyBatis-Spring 中,則使用 SqlSessionFactoryBean 來替代。
1
2
3
|
<bean id= "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" > <property name= "dataSource" ref= "dataSource" /> </bean> |
注意點
SqlSessionFactory 有一個單獨的必須屬性,就是 JDBC 的 DataSource
在SqlSessionFactoryBean的返回getObject的時候,有個驗證。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Override public SqlSessionFactory getObject() throws Exception { if ( this .sqlSessionFactory == null ) { afterPropertiesSet(); } return this .sqlSessionFactory; } @Override public void afterPropertiesSet() throws Exception { notNull(dataSource, "Property 'dataSource' is required" ); notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required" ); state((configuration == null && configLocation == null ) || !(configuration != null && configLocation != null ), "Property 'configuration' and 'configLocation' can not specified with together" ); this .sqlSessionFactory = buildSqlSessionFactory(); } |
4.2配置datasource
這里我們使用的是阿里巴巴的數據庫連接池。https://github.com/alibaba/druid
1
2
3
4
5
6
7
8
|
compile group: 'com.alibaba' , name: 'druid' , version: '1.1.2' <!--阿里巴巴的數據庫連接池--> <bean id= "dataSource" class = "com.alibaba.druid.pool.DruidDataSource" init-method= "init" destroy-method= "close" > <!-- 基本屬性 url、user、password --> <property name= "url" value= "${jdbc_url}" /> <property name= "username" value= "${jdbc_user}" /> <property name= "password" value= "${jdbc_password}" /> </bean> |
4.3配置數據庫鏈接屬性
在resource目錄下創建properties文件夾,并創建datasource.properties
1
2
3
|
jdbc_url=jdbc:mysql: //localhost:3306/cnblogs?serverTimezone=Asia/Shanghai&characterEncoding=utf8 jdbc_user=root jdbc_password=root |
使用阿里巴巴的數據庫連接池是無需配置數據庫驅動。是根據url的前綴來判斷的
4.4配置Spring加載配置屬性及配置替換動態標簽
1
2
3
4
5
6
7
8
|
<!--加載配置文件路徑--> <bean id= "configProperties" class = "org.springframework.beans.factory.config.PropertiesFactoryBean" > <property name= "location" value= "classpath:properties/datasource.properties" ></property> </bean> <!--獲取配置屬性之后動態替換標簽--> <bean id= "propertyConfigurer" class = "org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer" > <property name= "properties" ref= "configProperties" /> </bean> |
4.5配置Spring自動創建Mapper接口的bean
MyBatis-Spring提供了一個轉換器MapperScannerConfigurer,可以將映射接口轉換為Spring容器中Bean。這樣就可以在代碼中注入映射的bean
1
2
3
4
|
<!--采用自動掃描方式創建Mapper Bean--> <bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name= "basePackage" value= "com.cnblogs.dao" ></property> </bean> |
basePackage屬性是讓你為映射器接口文件設置基本的包路徑。 你可以使用分號或逗號作為分隔符設置多于一個的包路徑。每個映射器將會在指定的包路徑中遞歸地被搜索到。
4.6配置事務
MyBatis和Spring結合后是使用Spring AOP去管理事務的,使用Spring AOP是相當的簡單的,它分為聲明式事務和編程性事務。大部分場景下使用聲明式事務就可以了。
引入Jar包
1
2
3
4
5
6
7
8
|
compile group: 'org.springframework' , name: 'spring-tx' , version: '4.3.10.RELEASE' compile group: 'org.springframework' , name: 'spring-jdbc' , version: '4.3.10.RELEASE' <!--事務管理器--> <bean id= "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name= "dataSource" ref= "dataSource" /> </bean> <!--使用聲明式事務管理方式--> <tx:annotation-driven transaction-manager= "transactionManager" /> |
5.完整的Spring xml配置及引用的Jar包
引入的Jar列表
1
2
3
4
5
6
7
8
|
compile group: 'org.springframework' , name: 'spring-webmvc' , version: '4.3.10.RELEASE' compile group: 'org.springframework' , name: 'spring-tx' , version: '4.3.10.RELEASE' compile group: 'org.springframework' , name: 'spring-jdbc' , version: '4.3.10.RELEASE' compile group: 'javax.servlet' , name: 'javax.servlet-api' , version: '3.1.0' compile group: 'org.mybatis' , name: 'mybatis-spring' , version: '1.3.1' compile group: 'org.mybatis' , name: 'mybatis' , version: '3.4.5' compile group: 'mysql' , name: 'mysql-connector-java' , version: '6.0.6' compile group: 'com.alibaba' , name: 'druid' , version: '1.1.2' |
Spring的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
<?xml version= "1.0" encoding= "UTF-8" ?> <beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:context= "http://www.springframework.org/schema/context" xmlns:mvc= "http://www.springframework.org/schema/mvc" xmlns:tx= "http://www.springframework.org/schema/tx" 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/mvc http: //www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--spring可以自動去掃描base-pack下面的包或者子包下面的Java文件--> <context:component-scan base- package = "com.cnblogs.controller,com.cnblogs.service,com.cnblogs.dao" /> <!--自動注冊RequestMappingHandlerMapping與RequestMappingHandlerAdpter--> <mvc:annotation-driven/> <!-- 對靜態資源文件的訪問--> <mvc: default -servlet-handler/> <!--加載配置文件路徑--> <bean id= "configProperties" class = "org.springframework.beans.factory.config.PropertiesFactoryBean" > <property name= "location" value= "classpath:properties/datasource.properties" ></property> </bean> <!--獲取配置屬性之后動態替換標簽--> <bean id= "propertyConfigurer" class = "org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer" > <property name= "properties" ref= "configProperties" /> </bean> <!--阿里巴巴的數據庫連接池--> <bean id= "dataSource" class = "com.alibaba.druid.pool.DruidDataSource" init-method= "init" destroy-method= "close" > <!-- 基本屬性 url、user、password --> <property name= "url" value= "${jdbc_url}" /> <property name= "username" value= "${jdbc_user}" /> <property name= "password" value= "${jdbc_password}" /> </bean> <!--構建SqlSessionFactory--> <bean id= "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" > <property name= "dataSource" ref= "dataSource" /> <property name= "configLocation" value= "classpath:config/mybatis-config.xml" /> <property name= "mapperLocations" value= "classpath:mappers/*.xml" /> </bean> <!--采用自動掃描方式創建Mapper Bean--> <bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name= "basePackage" value= "com.cnblogs.dao" ></property> </bean> <!--事務管理器--> <bean id= "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name= "dataSource" ref= "dataSource" /> </bean> <!--使用聲明式事務管理方式--> <tx:annotation-driven transaction-manager= "transactionManager" /> <!--視圖解析器--> <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name= "prefix" value= "/WEB-INF/content" ></property> <property name= "suffix" value= ".jsp" ></property> </bean> </beans> |
總結
以上所述是小編給大家介紹的MyBatis無縫對接Spring的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.jianshu.com/p/213479f25d84