1. 入門
1.1 引JAR包
要使用mybatis,只需將mybatis-x.x.x.jar,文件置於classpath中便可。html
若是使用maven來構建項目,則須要將dependency代碼置於pom.xml文件中:java
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependency>
1.2 從XML中構建SQLSessionFactory
每一個基於 MyBatis 的應用都是以一個SqlSessionFactory的實例爲中心的。SqlSessionFactory的實例能夠經過 SqlSessionFactoryBuilder得到。而SqlSessionFactoryBuilder則能夠從XML配置文件或一個預先定製的Configuration的實例構建出SqlSessionFactory的實例。mysql
從 XML 文件中構建 SqlSessionFactory 的實例很是簡單,建議使用類路徑下的資源文件進行配置。可是也可使用任意的輸入流(InputStream)實例,包括字符串形式的文件路徑或者 file:// 的 URL 形式的文件路徑來配置。MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,可以使從 classpath 或其餘位置加載資源文件更加容易。sql
String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
XML 配置文件(configuration XML)中包含了對 MyBatis 系統的核心設置,包含獲取數據庫鏈接實例的數據源(DataSource)和決定事務做用域和控制方式的事務管理器(TransactionManager)。XML 配置文件的詳細內容後面再探討,這裏先給出一個簡單的示例: 數據庫
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.25.84:3306/test"/> <property name="username" value="root"/> <property name="password" value="mysql"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/mapper/UserMapper.xml"/> </mappers> </configuration>
固然,還有不少能夠在XML 文件中進行配置,上面的示例指出的則是最關鍵的部分。要注意 XML 頭部的聲明,用來驗證 XML 文檔正確性。environment 元素體中包含了事務管理和鏈接池的配置。mappers 元素則是包含一組 mapper 映射器(這些 mapper 的 XML 文件包含了 SQL 代碼和映射定義信息)。 安全
1.3 從SqlSessionFactory中獲取SqlSession
既然有了 SqlSessionFactory ,顧名思義,咱們就能夠從中得到 SqlSession 的實例了。SqlSession 徹底包含了面向數據庫執行 SQL 命令所需的全部方法。你能夠經過 SqlSession 實例來直接執行已映射的 SQL 語句。例如:session
SqlSession session = sqlSessionFactory.openSession(); try { UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUser(1); User u = session.selectOne("org.mybatis.mapper.UserMapper.selectUser", 2); 舊版本的使用方式 System.out.println(user.getUser_name()); System.out.println(u.getUser_name()); } finally { session.close(); }
1.4 映射SQL語句
MyBatis 提供的所有特性能夠利用基於 XML 的映射語言來實現。mybatis
<?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 namespace="org.mybatis.mapper.UserMapper"> <select id="selectUser" resultType="org.mybatis.mapper.User"> select * from user where id = #{id} </select> </mapper>
在一個 XML 映射文件中,你想定義多少個映射語句都是能夠的。架構
在命名空間org.mybatis.mapper.UserMapper中定義一個名爲selectUser的映射語句,這樣就容許你使用指定的徹底限定名org.mybatis.mapper.UserMapper.selectUser來調用映射語句。併發
對於像UserMapper這樣的映射器類來講,還有另外一處理方法,他們的映射語句能夠不須要用XML來作,取而代之的可使用Java註解。好比,上面XML可被替換爲:
package org.mybatis.mapper; public interface UserMapper { @Select("SELECT * FROM userWHERE id = #{id}") User selectUser(int id); }
對於簡單語句來講,註解使代碼顯得更加簡潔,然而 Java 註解對於稍微複雜的語句就會力不從心而且會顯得更加混亂。所以,若是你須要作很複雜的事情,那麼最好使用 XML 來映射語句。
選擇何種方式以及映射語句的定義的一致性對你來講有多重要這些徹底取決於你和你的團隊。換句話說,永遠不要拘泥於一種方式,你能夠很輕鬆的在基於註解和 XML 的語句映射方式間自由移植和切換。
1.5 做用域(scope)和生命週期
理解咱們目前已經討論過的不一樣做用域和生命週期類是相當重要的,由於錯誤的使用會致使很是嚴重的併發問題。
依賴注入框架能夠建立線程安全的,基於事務的SqlSession和映射器並將他們直接注入到你的bean中,所以能夠直接忽略他們的生命週期。
1.5.1 SqlSessionFactoryBuilder
這個類能夠被實例化、使用和丟棄,一旦建立了SqlSessionFactory,就不在須要它了。所以SqlSessionFactoryBuilder實例的最佳做用域是方法做用域(也就是局部方法變量)。能夠重用SqlSessionFactoryBuilder來建立多個SqlSessionFactory實例,可是最好仍是不要讓其一直存在以保證全部的XML解析資源開放給更重要的事情。
1.5.2 SqlSessionFactory
SqlSessionFactory 一旦被建立就應該在應用的運行期間一直存在,沒有任何理由對它進行清除或重建。使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複建立屢次,屢次重建 SqlSessionFactory 被視爲一種代碼「壞味道(bad smell)」。所以 SqlSessionFactory 的最佳做用域是應用做用域。有不少方法能夠作到,最簡單的就是使用單例模式或者靜態單例模式。
1.5.3 SqlSession
每一個線程都應該有它本身的 SqlSession 實例。SqlSession 的實例不是線程安全的,所以是不能被共享的,因此它的最佳的做用域是請求或方法做用域。絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。也毫不能將 SqlSession 實例的引用放在任何類型的管理做用域中,好比 Servlet 架構中的 HttpSession。若是你如今正在使用一種 Web 框架,要考慮 SqlSession 放在一個和 HTTP 請求對象類似的做用域中。換句話說,每次收到的 HTTP 請求,就能夠打開一個 SqlSession,返回一個響應,就關閉它。這個關閉操做是很重要的,你應該把這個關閉操做放到 finally 塊中以確保每次都能執行關閉。下面的示例就是一個確保 SqlSession 關閉的標準模式:
SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }
在你的全部的代碼中一致性地使用這種模式來保證全部數據庫資源都能被正確地關閉。
1.5.4 映射器實例(Mapper Instances)
映射器是一個你建立來綁定你映射的語句的接口。映射器接口的實例是從 SqlSession 中得到的。所以從技術層面講,任何映射器實例的最大做用域是和請求它們的 SqlSession 相同的。儘管如此,映射器實例的最佳做用域是方法做用域。也就是說,映射器實例應該在調用它們的方法中被請求,用過以後便可廢棄。並不須要顯式地關閉映射器實例,儘管在整個請求做用域(request scope)保持映射器實例也不會有什麼問題,可是很快你會發現,像 SqlSession 同樣,在這個做用域上管理太多的資源的話會難於控制。因此要保持簡單,最好把映射器放在方法做用域(method scope)內。下面的示例就展現了這個實踐:
SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); // do work } finally { session.close(); }
2. demo
2.1 建立maven工程
pom.xml文件添加以下依賴:
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.36</version> </dependency> </dependencies>
2.2 建立工程目錄結構
如圖
其中
(1)App.java是業務運行主類;
public class App { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); SqlSession session = sqlSessionFactory.openSession(); try { UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUser(1); User u = session.selectOne("org.mybatis.mapper.UserMapper.selectUser", 2); System.out.println(user.getUser_name()); System.out.println(u.getUser_name()); } finally { session.close(); } } }
(2)User.java與數據庫映射的實體類;
public class User { private int id; private String user_name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUser_name() { return user_name; } public void setUser_name(String user_name) { this.user_name = user_name; } }
其中,數據庫中表user的結構和數據以下:
(3)UserMapper.java映射器接口;
public interface UserMapper { User selectUser(int id); }
(4)UserMapper.xml映射器的sql定義等;
<?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 namespace="org.mybatis.mapper.UserMapper"> <select id="selectUser" resultType="org.mybatis.mapper.User"> select * from user where id = #{id} </select> </mapper>
(5)mybatis-config.xml引入的mybatis的基本配置,注意:與包是同級的;
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.25.84:3306/test"/> <property name="username" value="root"/> <property name="password" value="mysql"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/mapper/UserMapper.xml"/> </mappers> </configuration>
2.3 運行及結果
當成正常的java工程運行,運行App.java類,運行結果以下:
x. 參考資料
http://www.mybatis.org/mybatis-3/zh/getting-started.html