1.單獨使用MyBatis
單獨使用MyBatis,不結合其餘框架,主要步驟是:html
1.建立SqlSessionFactory對象java
建立方法是經過SqlSessionFactoryBuilder這個類從mybatis的XML配置文件,或者porperties,或者URL獲取相關數據庫的配置信息。mysql
2.從sqlSessionFactory獲取SqlSession。spring
3.使用SqlSession提供的API,對數據庫進行增刪改查,以及事務管理。sql
1
2
3
4
5
6
7
|
String resource =
"org/mybatis/example/mybatis-config.xml"
;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new
SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
session.insert(
"BlogMapper.selectBlog"
,
101
);
session.commit();
sesssion.close();
|
2.結合Spring框架使用MyBatis
MyBatis + Spring的使用方式,通常是在Spring的配置文件裏,配置如下內容:數據庫
1.數據源(DataSource)express
2.SqlSessionFactoryBean,實現FactoryBean接口,經過注入DataSource對象,以及MyBatis的相關配置信息,返回SQLSessionFactory對象。apache
1
2
3
4
5
6
|
<
jee:jndi-lookup
id="dataSource" jndi-name="jdbc/mysql"></
jee:jndi-lookup
>
<
bean
id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<
property
name="dataSource" ref="dataSource" />
<
property
name="configLocation" value="classpath:mybatis/mybatis-config.xml"></
property
>
<
property
name="mapperLocations" value="classpath:mybatis/*/*.xml"></
property
>
</
bean
>
|
加入以上的配置信息就能夠Dao類裏,直接引用sqlSessionFactory這個對象,對數據庫進行操做(跟1的代碼同樣)。編程
若是Dao的代碼寫多了,這時候會發現,每次的數據庫操做,步驟都是要先session
①獲取SqlSession對象->②調用數據庫操做的方法->③提交事務->④關閉SqlSession
其中①③④這三個步驟會一直環繞在每一個Dao的方法裏。
這時候會這麼想,可否提供這樣一個功能,在調用方法以前自動獲取SqlSession對象,在調用方法以後自動提交事務和關閉SqlSession對象。這樣①③④這樣重複的代碼就能夠剔除了,整個Dao類的代碼也變得更加簡潔。
3.SqlSessionTemplate的應用
上面提到的,在調用方法以前和調用方法以後,各執行一些操做。這種技術一會兒就聯想到就是AOP編程方式。
AOP是Spring的第二個核心功能,因此天然它也提供了這樣的是一個實現類,就是SqlSessionTemplate
1
2
3
4
5
6
7
8
9
10
11
|
<
jee:jndi-lookup
id="dataSource" jndi-name="jdbc/mysql"></
jee:jndi-lookup
>
<
bean
id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<
property
name="dataSource" ref="dataSource" />
<
property
name="configLocation" value="classpath:mybatis/mybatis-config.xml"></
property
>
<
property
name="mapperLocations" value="classpath:mybatis/*/*.xml"></
property
>
</
bean
>
<
bean
id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<
constructor-arg
ref="sqlSessionFactory" />
</
bean
>
|
引入SqlSessionTemplate這個類,在寫Dao時,每一個方法,在執行以前,自動獲取SqlSession對象,執行以後,自動提交事務和關閉會話。
1
2
3
|
public
Object save(String str, Object obj)
throws
Exception {
return
sqlSessionTemplate.insert(str, obj);
}
|
如今代碼一會兒變得更簡潔了,只剩下數據操做的方法。
4.SqlSessionTemplate原理解析思路
爲何SqlSessionTemplate可以在每一個方法,在執行以前,自動獲取SqlSession對象,執行以後,自動提交事務和關閉會話。
要知道這個原理,其實至關於要了解Spring AOP原理。
要了解Spring AOP原理,就必須知道Java技術裏,動態代理的原理。
Java的動態代理主要是涉及到JDK裏java.lang.reflect包下的InvocationHandler接口和Proxy類裏建立代理對象的方法。
SqlSessionTemplate的源碼解析
SqlSessionTemplate的構造方法裏,建立了一個SqlSession的代理對象。
在這個代理對象,每次SQLSession的方法被調用,都執行如下操做。
上面代碼涉及到的知識點比較多,要徹底理解,須要掌握下面列出的幾點。
5.知識點概括
1.MyBatis中的SqlSessionFactory和SqlSession
2.Spring中的SqlSessionFactoryBean和SqlSessionTemplate
3.Spring AOP原理
4.Java動態代理原理
5.Java反射原理
Spring與Mybatis四種整合方法
一、採用數據映射器(MapperFactoryBean)的方式,不用寫mybatis映射文件,採用註解方式提供相應的sql語句和輸入參數。
(1)Spring配置文件:
- <context:property-placeholder location="jdbc.properties"/>
-
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${driver}"/>
- <property name="url" value="${url}"/>
- <property name="username" value="${username}"/>
- <property name="password" value="${password}"/>
- <property name="initialSize" value="${initialSize}"/>
- <property name="maxActive" value="${maxActive}"/>
- <property name="maxIdle" value="${maxIdle}"/>
- <property name="minIdle" value="${minIdle}"/>
- </bean>
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- </bean>
-
- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
- <property name="mapperInterface" value="com.xxt.ibatis.dbcp.dao.UserMapper" />
- <property name="sqlSessionFactory" ref="sqlSessionFactory" />
- </bean>
- <bean id="userDaoImpl2" class="com.xxt.ibatis.dbcp.dao.impl.UserDaoImpl2">
- <property name="userMapper" ref="userMapper"/>
- </bean>
(2)數據映射器UserMapper,代碼以下:
- public interface UserMapper {
- @Select("SELECT * FROM user WHERE id = #{userId}")
- User getUser(@Param("userId") long id);
- }
(3) dao接口類UserDao,代碼以下:
- public interface UserDao {
- public User getUserById(User user);
- }
(4)dao實現類UserDaoImpl2,,代碼以下:
- public class UserDaoImpl2 implements UserDao {
- private UserMapper userMapper;
- public void setUserMapper(UserMapper userMapper) {
- this.userMapper = userMapper;
- }
- public User getUserById(User user) {
- return userMapper.getUser(user.getId());
- }
- }
二、採用接口org.apache.ibatis.session.SqlSession的實現類org.mybatis.spring.SqlSessionTemplate。
mybatis中, sessionFactory可由SqlSessionFactoryBuilder.來建立。MyBatis- Spring 中,使用了SqlSessionFactoryBean來替代。SqlSessionFactoryBean有一個必須屬性 dataSource,另外其還有一個通用屬性configLocation(用來指定mybatis的xml配置文件路徑)。
(1)Spring配置文件:
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
-
- <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
-
- <!- - <property name="mapperLocations" value="classpath*:com/xxt/ibatis/dbcp/**/*.xml"/> -->
- </bean>
- <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg index="0" ref="sqlSessionFactory" />
- </bean>
- <bean id="UserDaoImpl " class="com.xxt.ibatis.dbcp.dao.impl.UserDaoImpl">
-
- <property name="sqlSessionTemplate" ref="sqlSession" />
- -->
- </bean>
(2)mybatis總配置文件sqlMapConfig.xml:
- <configuration>
- <typeAliases>
- <typeAlias type="com.xxt.ibatis.dbcp.domain.User" alias="User" />
- </typeAliases>
- <mappers>
- <mapper resource="com/xxt/ibatis/dbcp/domain/user.map.xml" />
- </mappers>
- </configuration>
(3)實體類映射文件user.map.xml:
- <mapper namespace="com.xxt.ibatis.dbcp.domain.User">
- <resultMap type="User" id="userMap">
- <id property="id" column="id" />
- <result property="name" column="name" />
- <result property="password" column="password" />
- <result property="createTime" column="createtime" />
- </resultMap>
- <select id="getUser" parameterType="User" resultMap="userMap">
- select * from user where id = #{id}
- </select>
- <mapper/>
(4)dao層接口實現類UserDaoImpl:
- public class UserDaoImpl implements UserDao {
- public SqlSessionTemplate sqlSession;
- public User getUserById(User user) {
- return (User)sqlSession.selectOne("com.xxt.ibatis.dbcp.domain.User.getUser", user);
- }
- public void setSqlSession(SqlSessionTemplate sqlSession) {
- this.sqlSession = sqlSession;
- }
- }
三、採用抽象類org.mybatis.spring.support.SqlSessionDaoSupport提供SqlSession。
(1)spring配置文件:
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
-
- </bean>
- <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg index="0" ref="sqlSessionFactory" />
- </bean>
- <bean id="userDaoImpl3" class="com.xxt.ibatis.dbcp.dao.impl.UserDaoImpl3">
-
- <property name="sqlSessionTemplate" ref="sqlSession" />
-
-
- </bean>
(2) dao層接口實現類UserDaoImpl3:
- public class UserDaoImpl3 extends SqlSessionDaoSupport implements UserDao {
- public User getUserById(User user) {
- return (User) getSqlSession().selectOne("com.xxt.ibatis.dbcp.domain.User.getUser", user);
- }
- }
四、採用org.mybatis.spring.mapper.MapperFactoryBean或者org.mybatis.spring.mapper.MapperScannerConfigurer
- <beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <beans:property name="dataSource" ref="simpleDataSource" />
- <beans:property name="configLocation"
- value="classpath:conf/core/mybatis-config.xml" />
- </beans:bean>
-
- <beans:bean id="sqlSessionFactory_contact" class="org.mybatis.spring.SqlSessionFactoryBean">
- <beans:property name="dataSource" ref="simpleDataSource_contact" />
- <beans:property name="configLocation"
- value="classpath:conf/core/mybatis-config-contact.xml" />
- </beans:bean>
-
- <beans:bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <beans:property name="dataSource" ref="simpleDataSource" />
- </beans:bean>
-
- <beans:bean id="transactionManager_contact"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <beans:property name="dataSource" ref="simpleDataSource_contact" />
- </beans:bean>
-
-
- <!-- <tx:annotation-driven transaction-manager="transactionManager" />
- <tx:annotation-driven transaction-manager="transactionManager_contact" />
- -->
- <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
- <property name="mapperInterface" value="com.mybatis.UserDao"></property>
- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
- </bean>
-
- <bean id="userService" class="com.mybatis.UserServiceImpl">
- <property name="userDao" ref="userDao"></property>
- </bean>
-
-
- <beans:bean name="mapperScannerConfigurer"
- class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <beans:property name="basePackage" value="com.elong.hotel.crm.data.mapper" />
- <beans:property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></beans:property>
- </beans:bean>
- <beans:bean name="mapperScannerConfigurer_contact"
- class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <beans:property name="basePackage"
- value="com.elong.hotel.crm.data.contact.mapper" />
- <beans:property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_contact"></beans:property>
- </beans:bean>
-
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <tx:attributes>
-
- <tx:method name="save*" propagation="REQUIRED" />
- <tx:method name="insert*" propagation="REQUIRED" />
- <tx:method name="add*" propagation="REQUIRED" />
- <tx:method name="del*" />
- <tx:method name="update*" />
- <tx:method name="find*" read-only="true" />
- <tx:method name="get*" read-only="true" />
- <tx:method name="search*" read-only="true" />
- </tx:attributes>
- </tx:advice>
-
- <tx:advice id="txAdvice_contact" transaction-manager="transactionManager_contact">
- <tx:attributes>
-
- <tx:method name="save*" propagation="REQUIRED" />
- <tx:method name="insert*" propagation="REQUIRED" />
- <tx:method name="add*" propagation="REQUIRED" />
- <tx:method name="del*" />
- <tx:method name="update*" />
- <tx:method name="find*" read-only="true" />
- <tx:method name="get*" read-only="true" />
- <tx:method name="search*" read-only="true" />
- </tx:attributes>
- </tx:advice>
-
- <aop:config>
- <aop:pointcut expression="execution(* com.elong.hotel.crm.service..*.*(..))"
- id="pointcut" />
- <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
- <aop:advisor advice-ref="txAdvice_contact" pointcut-ref="pointcut" />
- </aop:config>