起因
以前剛學習java三大框架的時候持久層框架我是自學的是hibernate..感覺蠻好用的,so easy..后來大三實習公司用的是jpa(hibernate外包裝一層)...再后來工作1年多用的是spring data(jpa外包裝一層)...一直感覺蠻好用的,尤其是Spring data..愛不釋手...感覺基本都不用寫SQL...
現在換了新公司,用的是mybatis..用了2個多月了...感覺..在一些情況下會比Spring data還要傻瓜式操作....有很多有趣的地方值得記錄...
這篇文章主要介紹我怎么把mybatis與Spring集成.
配置
我覺得XXX框架與Spring集成很多時候其實是一樣的套路...本來XXX框架自己單獨使用的時候基本都是配置1個自己的Factory加載自己的配置....生成一個核心的Facade類....然后與Spring集成的時候就是配置一個Spring的XXXFactoryBean.然后加載XXX配置....生成XXX框架的Factory...
比如與Spring data或者hibernate集成的時候配置一個LocalContainerEntityManagerFactoryBean生成了entityManagerFactory,可以生成核心的Facade類EntityManager.
mybatis似乎是配置SqlSessionFactoryBean可以生成SqlSessionFactory.然后生成核心的Facade類SqlSession...
按照這個套路配置是這樣的

1 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" 2 xmlns:context="http://www.springframework.org/schema/context" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:repository="http://www.springframework.org/schema/data/repository" 3 xmlns:jee="http://www.springframework.org/schema/jee" 4 xsi:schemaLocation=" 5 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 6 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 8 http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 9 http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository.xsd 10 http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 11 "> 12 <!-- 基於注釋的事務,當注釋中發現@Transactional時,使用id為“transactionManager”的事務管理器 --> 13 <!-- 如果沒有設置transaction-manager的值,則spring以缺省默認的事務管理器來處理事務,默認事務管理器為第一個加載的事務管理器 --> 14 <tx:annotation-driven transaction-manager="transactionManager" /> 15 16 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 17 <property name="driverClassName" value="${jdbc.driverClassName}" /> 18 <property name="url" value="${jdbc.url}" /> 19 <property name="username" value="${jdbc.username}" /> 20 <property name="password" value="${jdbc.password}" /> 21 </bean> 22 23 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 24 <property name="dataSource" ref="dataSource" /> 25 </bean> 26 27 <!-- 創建SqlSessionFactory,同時指定數據源 --> 28 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 29 <property name="dataSource" ref="dataSource" /> 30 <property name="mapperLocations" value="classpath:mapper/*.xml"></property> 31 <property name="configLocation" value="classpath:spring/mybatis/mybatis-config.xml" /> 32 </bean> 33 34 <!-- Mapper接口所在包名,Spring會自動查找其下的Mapper --> 35 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 36 <property name="basePackage" value="com.labofjet" /> 37 </bean> 38 </beans>
然后把這個配置在spring自己的配置里引入就可以了.
1 <import resource="classpath*:/spring/mybatis/mybatis-context.xml" />
此外因為mybatis我用到了pagehelper...所以額外配置了mybatis-config..在里面配置pagehelper的interceptor...我覺得這個pagehelper的原理大概是mybatis發送SQL之前攔截並在外面嵌套一層加上分頁條件吧.....
這個配置(mybatis-config)是我百度的....

1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <!-- 配置管理器 --> 6 <configuration> 7 <plugins> 8 <!-- com.github.pagehelper為PageHelper類所在包名 --> 9 <plugin interceptor="com.github.pagehelper.PageHelper"> 10 <!-- 4.0.0以后版本可以不設置該參數 --> 11 <property name="dialect" value="mysql" /> 12 <!-- 該參數默認為false --> 13 <!-- 設置為true時,會將RowBounds第一個參數offset當成pageNum頁碼使用 --> 14 <!-- 和startPage中的pageNum效果一樣 --> 15 <property name="offsetAsPageNum" value="true" /> 16 <!-- 該參數默認為false --> 17 <!-- 設置為true時,使用RowBounds分頁會進行count查詢 --> 18 <property name="rowBoundsWithCount" value="false" /> 19 <!-- 設置為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 --> 20 <!-- (相當於沒有執行分頁查詢,但是返回結果仍然是Page類型) --> 21 <property name="pageSizeZero" value="false" /> 22 <!-- 3.3.0版本可用 - 分頁參數合理化,默認false禁用 --> 23 <!-- 啟用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最后一頁 --> 24 <!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空數據 --> 25 <property name="reasonable" value="false" /> 26 <!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 --> 27 <!-- 增加了一個`params`參數來配置參數映射,用於從Map或ServletRequest中取值 --> 28 <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默認值 --> 29 <!-- 不理解該含義的前提下,不要隨便復制該配置 --> 30 <!-- <property name="params" value="pageNum=start;pageSize=limit;" /> --> 31 <!-- 支持通過Mapper接口參數來傳遞分頁參數 --> 32 <property name="supportMethodsArguments" value="true" /> 33 <!-- always總是返回PageInfo類型,check檢查返回類型是否為PageInfo,none返回Page --> 34 <property name="returnPageInfo" value="check" /> 35 </plugin> 36 </plugins> 37 </configuration>
這樣便整合完成了....
實際使用效果: