1 簡介:
每個MyBatis應用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。
以上簡介是MyBatis官方文檔的介紹,我以這個爲切入點,結合我們的項目,學習瞭解XML配置文件,SqlSessionFactory的獲取,SqlSession的獲取和使用。
2. 從XML中構建SqlSessionFactory(爲後面的MyBatis-Spring打基礎):
String resource ="com/accp/mybatis/data/Configuration.xml";
Reader reader =Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
那看看XML中配置了什麼?
2.1 xml配置文件如下:
<configuration> <properties resource="properties/datasource.properties" />
<typeAliases> <typeAlias type="com.accp.mybatis.model.Blog" alias="Blog"/> </typeAliases>
<environments default="accp"> <environment id="accp"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="driver.encoding" value="${encoding}" /> </dataSource> </environment> </environments>
<mappers> <mapper resource="com/accp/mybatis/data/BlogMapper.xml" /> </mappers> </configuration> |
由此可知xml配置文件的核心設置,以及這樣配置的作用:
數據源:獲取數據庫實例
事物管理器:決定事物的範圍和控制
mapper:告訴MyBatis 去哪尋找映射SQL 的語句。
typeAliases:配置Java對象的別名(Mapper配置需要使用)。
Java中的JDBC執行步驟是:
C(Class.forName()),
C(Connection),
S(Statement) ,
R(ResultSet)。
結合JDBC,個人是這樣理解這些配置的:
數據源是爲了獲取Connection(對應CC),
mapper以及transactionManager是爲了執行SQL(對應S),
(具體的Mapper.xml文件中有SQL語句,Java對象與SQL返回類型的映射。MyBatis中SQL執行結果是Map<String,Object>,這樣配置以後,MyBatis可以將執行結果轉換爲我們想要的Java對象。)
2.2 SqlSessionFactory
一個environment對應一個SqlSessionFactory,SqlSessionFactory 應該在應用執行期間都存在,可以通過單例模式使其生命週期在一個應用範圍內。
3. SqlSession
3.1 SqlSession的獲取:從SqlSessionFactory獲取SqlSession。
SqlSession session = sqlSessionFactory.openSession(); try { // do work Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101); } finally { session.close(); } |
SqlSession介紹:
Sqlsession對應着一次數據庫會話,每次訪問數據庫時都需要創建它,會話結束後要關閉session。
3.2使用SqlSession執行SQL語句:
3.2.1 只使用Map文件編程:
SqlSession提供了許多方法供我們使用,在我們項目中常用的有如下方法:
select(), selectOne(), insert(), update(),delete()。
項目中使用這種方式,用法和以下這句Java是一樣的:
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101); |
3.2.2 以接口方式編程:
本項目中未用。
BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101); |
原理和使用全名調用Java對象的方法是相似的,編寫一個映射類,使用一個名稱, 參數和返回值和已映射的查詢 語句都一樣的方法即可。
4.Mapper XML文件
在Mapper XML文件中可以配置SQL語句和result映射,相比較JDBC,可以節省大量的代碼量,而且又是以SQL語句爲核心。我個人覺得這個是它強大處之一,順便可以讓我練習寫SQL語句(Hibernate讓我快遺忘掉SQL了)。
結合我們項目:以下是文件中常用的元素:
sql – 可以重用的 SQL 塊,也可以被其他語句引用。 insert – 映射插入語句 update – 映射更新語句 delete – 映射刪除語句 select – 映射查詢語句 resultMap – 將數據庫結果集轉換爲你設置的對象 <![CDATA[ ]]> - 被包裹的內容會被解析器忽略(忽略特殊字符) |
動態SQL,在項目中沒怎麼用到,我就不寫了,用到的時候可以查看官網:http://mybatis.github.io/mybatis-3/zh/dynamic-sql.html
5. 和Hibernate比較:
Hibernate和mybatis有一個共同點:
1. 從配置文件(通常是XML配置文件中)得到 sessionfactory.
2. 由sessionfactory 產生 session
3. 在session 中完成對數據的增刪改查和事務提交等.
4. 在用完之後關閉session 。
5. 都可以將查詢的結果集映射爲Java對象
我Hibernate用的不是很多,從個人使用和網上搜來的結果,簡單總結了如下:
Hibernate特點:
1. 功能強大,DAO層開發簡單
2. 比較笨重,不方便優化
MyBatis特點:
1. 比較輕,可以細緻優化SQL
2. MyBatis容易掌握,而Hibernate門檻較高。