一、什麼是mybatis
MyBatis 是支持普通SQL 查詢,存儲過程和高級映射的優秀持久層框架。
MyBatis 消除 了幾乎所有的JDBC 代碼和參數的手工設置以及結果集的檢索。
MyBatis 使用簡單的XML 或註解用於配置和原始映射,將接口和Java 的POJOs (Plan Old Java Objects ,普通的Java 對象)映射成數據庫中的記錄。
MyBatis 的簡化並且規範了JDBC的持久化方式,同時又相對與hibernate更加靈活,可以說是介於JDBC和HIBERNATE之間的優秀持久化框架。
MyBatis的前身就是IBATIS,只是版本更新後由於某些事情進行了更名。
二、入門
1》使用順序:
1、通過XML,或從Configuration 類的習慣準備的實例中構建的方式,創建SqlSessionFactoryBuilder 對象。
2、通過SqlSessionFactoryBuilder 獲取SqlSessionFactory。
1-1》XML方式示例獲取SqlSessionFactoryBuilder
String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
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="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
當然,在XML配置文件中還有很多可以配置的,上面的示例指出的則是最關鍵的部分。要注意 XML 頭部的聲明,需要用來驗證 XML文檔正確性。environment 元素體中包含對事
務管理和連接池的環境配置。 mappers 元素是包含所有 mapper (映射器) 的列表,這些 mapper
的 XML文件包含 SQL代碼和映射定義信息。
1-2》不使用XML獲取SqlSessionFactoryBuilder
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new
JdbcTransactionFactory();
Environment environment =
new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(configuration);
注意這種情況下配置是添加映射類。映射類是 Java 類,這些類包含 SQL 映射語句的注
解從而避免了 XML文件的依賴, XML映射仍然在大多數高級映射(比如:嵌套 Join 映射)
時需要。出於這樣的原因,如果存在 XML配置文件的話,MyBatis 將會自動查找和加載一
個對等的 XML 文件(這種情況下,基於類路徑下的 BlogMapper.class 類的類名,那麼
BlogMapper.xml將會被加載)。
2-1》從 SqlSessionFactory中獲取 SqlSession
方法1:
SqlSession session = sqlMapper.openSession();
try {
Blog blog = (Blog) session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
session.close();
}
方法2:
例如:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
3-1》我們還需要一個映射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.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
上面代碼的BlogMapper(相當於一個對象),ID=“selectBlog” 相當於表明一個SQL的ID值(方法),用於調用SQL。
上文就可以“Blog blog = (Blog) session.selectOne( "org.mybatis.example.BlogMapper.selectBlog", 101); ” 這樣來調用了。
基本上可以用JAVA的對象和方法來理解。
最後:
1、如 BlogMapper 這樣的映射器類來說,還有一個妙招。它們中間映射的語句可以不需要
在 XML中來寫,而可以使用 Java 註解來替換。比如,上面的 XML示例可以如下來替換:
package org.mybatis.example;
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
對於簡單語句來說,使用註解代碼會更加清晰,然而 Java 註解對於複雜語句來說就會混亂,應該限制使用。因此,如果你不得不做複雜的事情,那麼最好使用 XML來映射語句。
當然這也取決於你和你的項目團隊的決定,看哪種更適合你來使用,還有以長久方式來
使用映射語句的重要性。也就是說,不要將自己侷限在一種方式中。你可以輕鬆地將註解換
成 XML映射語句,反之亦然。
2、命名解析:爲了減少輸入量,MyBat is 對所有的命名配置元素使用如下的命名解析規則,包括語句,結果映射,緩存等。
》直接查找完全限定名(比如“com.mypackage.MyMapper.selectAllThings”),如果發現就使用。
》短名稱(比如“selectAllThings”)可以用來引用任意含糊的對象。而如果有兩個或兩個以上的(比如“com.foo.selectAllThings”和“com.bar.selectAllThings”),那麼就會得到錯誤報告,說短名稱是含糊的,因此就必須使用完全限定名。