1.單獨使用MyBatis
單獨使用MyBatis,不結合其他框架,主要步驟是:
1.創建SqlSessionFactory對象
創建方法是通過SqlSessionFactoryBuilder這個類從mybatis的XML配置文件,或者porperties,或者URL獲取相關數據庫的配置信息。
2.從sqlSessionFactory獲取SqlSession。
3.使用SqlSession提供的API,對數據庫進行增刪改查,以及事務管理。
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)
2.SqlSessionFactoryBean,實現FactoryBean接口,通過注入DataSource對象,以及MyBatis的相關配置信息,返回SQLSessionFactory對象。
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的代碼寫多了,這時候會發現,每次的數據庫操作,步驟都是要先
①獲取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反射原理