What is MyBatis?
MyBatis是一個一流的支持自定義SQL,存儲過程和高級映射的持久化框架。
MyBatis隱藏了幾乎所有的JDBC代碼、參數的手動設置和結果檢索。
它通過簡單的XML或註解來實現映射器層,所謂映射器層,是用於在對象和數據庫之間搬運數據,同時保證對象、數據庫以及映射器本身都相互獨立。
(MyBatis 本是apache的一個開源項目 iBatis , 2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis)
MyBatis與ORM的不同?
我們已經有了Hibernate,還有JPA這種標準規範,爲什麼還需要MyBatis?
MyBatis與O/RM不同:他不是直接把類映射爲數據庫表或者說把類的字段映射爲數據庫列,而是“把SQL語句的參數和結果映射爲類”。
使用SQL進行管理的好處:
1、易用性 -- 我們很多程序員是善於寫SQL的,但是,他們在學習Hibernate這種存持久框架的時候感到有些困難,因爲Hibernate真實用起來並不是傳說中那麼簡單。MyBatis是一種混合型的持久層解決方案,這個持久層框架廣泛使用了SQL,他使得SQL更容易使用、更容易集成到現代的面向對象軟件中。
2、靈活性 -- MyBatis在數據庫和類之間建立了一個額外的間接層,這就爲在類和數據庫直接建立映射關係帶來了更大的靈活性,使得不用改變數據庫模型或者對象模型的情況下改變他們的映射關係成爲可能。(這裏的間接層就是SQL)
3、增強部門間溝通 -- 經常數據庫的管理權限不屬於自己部門的,使用MyBatis可以讓SQL徹底暴漏出來,增強和DBA的溝通。
何時不該使用MyBatis?
當你的團隊大多都對Hibernate比較熟悉,且能很好的應用Hibernate達到項目的性能要求。因爲畢竟Hibernate更節省代碼量。
(個人推薦,如果沒有特殊需求,還是用Hibernate)
helloworld
(iBatis更名爲MyBatis後,從主要變化可以看出正向Hibernate靠攏)
(導讀,具體配置含義,我們下一章有詳細解釋,這裏,你要保證的是,你大體能看懂它們的含義)
第一步:獲取Connection HelloWorld
MyBatis和Hibernate一樣也有一個SessionFactory,全名爲:SqlSessionFactory。
SqlSessionFactory通過SqlSessionFactoryBuilder創建,但是SqlSessionFactoryBuilder需要傳入一個XML文件,也就是我們MyBatis的主文件(類似於Hibernate的hibernate.cfg.xml,我們這裏起名爲mybatis-config.xml)。
1、mybatis-config.xml
這個XML配置文件包含MyBatis的核心設置,包括一個數據庫配置標籤dataSource,事務管理方式相關transactionManager。
具體配置含義,我們後面有具體解釋,先看一個簡單的配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!--iBatis 和 MyBatis 的全局配置文件使用不同的 DTD 約束,在將應用由 iBatis 升級至 MyBatis 時需要注意(兩者的映射文件
DTD 約束也不相同) -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 這是根標籤 -->
<configuration>
<!-- 元素允許在主配置文件之外提供一個properties格式對應文件,從而使得主配置文件更加通用。這樣對部署非常有用 -->
<properties resource="mysql.properties" />
<!-- 配置數據源相關的信息 -->
<environments default="demo">
<environment id="demo">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property value="${driver}" name="driver" />
<property value="${url}" name="url" />
<property value="${username}" name="username" />
<property value="${password}" name="password" />
</dataSource>
</environment>
</environments>
</configuration>
2、對配置文件測試下
public static void main(String[] args) throws IOException {
//獲取配置文件的輸入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//獲取我們的SqlSessionFactory(相當於Hibernate的SessionFactory);SqlSessionFactoryBuilder有點類似於Hibernate的Configuration。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//獲取一個Session
System.out.println(sqlSessionFactory.openSession().getConnection());
}
打印了一個Connection,證明已經連接成功
(現在自己動手實現一下)
我們獲取到了連接,總要做些什麼吧?
第二步:執行查詢,獲取返回結果HelloWorld
session的具體操作也和Hibernate很類似,不同的是,我們前面概念中提到的:MyBatis與O/RM不同,他不是直接把類映射爲數據庫表或者說把類的字段映射爲數據庫列,而是“把SQL語句的參數和結果映射爲類”。
那麼我們可以推測到,MyBatis無非就是需要我們做兩點:1、配置我們要執行的SQL;2、配置輸入參數和返回結果的相對於SQL的映射關係。
我們先學習一下第一點,因爲第二點MyBatis大部分情況下會自動幫我買完成(在後面章節會介紹第二點):
兩種配置方式:XML、註解;
1、XML
我們以前學Hibernate的時候,常用的做法是把每一張表和對應Entity的對應放入單獨的XML中,而MyBatis是把一組相關SQL查詢放入一個XML中。
示例:
我們查詢出User表的所有數據,並打印所有獲取結果。
主要分爲四小步完成:
1:我們創建了接收返回結果的POJO(注意這裏POJO字段的名字和數據庫字段名字相同)
public class User {
private Integer id;
private String username;
private String password;
2:創建包含SQL的XML
/mybatis_hello/src/main/java/com/partner4java/demo2/User.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper爲我們的根元素 -->
<mapper namespace="user">
<!-- 查詢的元素爲select,沒什麼好說的,先記住;id爲我們後面需要用到的。resultType爲我們的返回Java類型 -->
<select id="selectUser" resultType="com.partner4java.demo2.User">
select * from user
</select>
</mapper>
3:把XML交給mybatis-config.xml
用到了mappers,和我們Hibernate裏的命名規則一樣
<!-- mybatis-config.xml -->
<mappers>
<mapper resource="com/partner4java/demo2/User.xml"/>
</mappers>
4:測試
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config4.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
//雖然我們沒有指定SQL返回結果列和POJO列的映射關係,但是它會自動把返回數據給我們塞進POJO,很容易想到是因爲名字相同。
List<User> users = session.selectList("user.selectUser");
for(User user:users){
System.out.println(user);
}
}
(當然我們還應該關閉各種資源,這裏我們只是最初步的展示,後面會一一道來)
不管你信不信,MyBatis就是如此簡單。
在接下來章節我們會詳細介紹MyBatis各配置。