1 spring和mybatis整合
1.1 整合思路
需要spring通過單例方式管理SqlSessionFactory。
spring和mybatis整合生成代理對象,使用SqlSessionFactory創建SqlSession。(spring和mybatis整合自動完成)
持久層的mapper都需要由spring進行管理。
1.2 整合環境
創建一個新的java工程(接近實際開發的工程結構)
主要3部分jar包:
1,mybatis3.2.7相關的jar包 2,spring3.2.0相關的jar包 3,mybatis和spring的整合包(mybatis-spring-1.2.2.jar):早期ibatis和spring整合是由spring官方提供,現在mybatis和spring整合由mybatis提供。
全部jar包:
1.3 sqlSessionFactory
在applicationContext.xml配置sqlSessionFactory和數據源(sqlSessionFactory類在mybatis-spring的整合包(mybatis-spring-1.2.2.jar)下。)
(ps:包括幾個內容:1,加載資源標簽;2,基礎數據源類(BasicDataSource);3,sql會話工廠類(SqlSessionFactoryBean)(和只使用mybatis不是同一個類)
<!-- 加載配置文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 數據源,使用dbcp --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="10" /> <property name="maxIdle" value="5" /> </bean> <!-- sqlSessinFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加載mybatis的配置文件 --> <property name="configLocation" value="mybatis/SqlMapConfig.xml" /> <!-- 數據源 --> <property name="dataSource" ref="dataSource" /> </bean>
1.4 原始dao開發(和spring整合后)
1.4.1 User.xml
在SqlMapconfig.xml中加載User.xml
1.4.2 dao(實現類繼承SqlSessionDaoSupport)
dao接口實現類需要注入SqlSessoinFactory,通過spring進行注入。
這里spring聲明配置方式,配置dao的bean:
讓UserDaoImpl實現類繼承SqlSessionDaoSupport(因為它提供了注入需要的屬性(sqlSessionFactory工廠類)的set方法)
1.4.3 配置dao
在applicationContext.xml中配置dao。
(ps:dao模式,可以通過注解的方式,省略需要配置多個bean的情況)
1.4.4 測試程序
1.5 mapper代理開發
1.5.1 mapper.xml和mapper.java
1.5.2 通過MapperFactoryBean創建代理對象
(ps:mapper代理的方式,只定義了接口(自動生成的實現),使用spring框架要想得到代理實現,需要其提供的MapperFactoryBean類得到mapper代理對象)
此方法問題:
需要針對每個mapper進行配置,麻煩。
1.5.3 通過MapperScannerConfigurer進行mapper掃描(建議使用)
(ps:注入屬性名稱用sqlSessionFactoryBeanName而不是sqlSessionFactory是因為這個兩個屬性賦值的時機是不一樣的,
上面bean那個應該是被動調用執行,當前這個bean是自動掃描
注意:sqlSessionFactoryBeanName要用value而不用ref. 在mybatis-spring1.1.0以前,
是通過<property name="sqlSessionFactory" ref="sqlSessionFactory"/>將SqlSessionFactory對象注入到sqlSessionFactory,
這樣做可能會有一個問題,就是在初始化MyBatis時,jdbc.properties文件還沒被加載進來,
dataSource的屬性值沒有被替換,就開始構造sqlSessionFactory類,屬性值就會加載失敗。
在1.1.0以后,
MapperScannerConfigure提供了String類型的sqlSessionFactoryBeanName,這樣將bean name注入到sqlSessionFactoryBeanName,
這樣就會等到spring初始化完成后,再構建sqlSessionFactory。
(ps:spring自動掃描mapper接口和對應xml配置,那么mybatis中的對應映射(或者自動掃描包)就可以去掉了)
1.5.4 測試代碼