MyBatis 大幅簡化你的代碼并力圖保持其簡潔、容易理解和維護。
為了使得 SQL 映射更加優秀,MyBatis 3 引入了許多重要的改進。
1 目錄結構
MyBatis 非常靈活,你可以隨意安排你的文件。
但和其它框架一樣,目錄結構有一種最佳實踐。
/example
? /src/main/java
? ? /org/mybatis/example
? ? ? /action
? ? ? /domain
? ? ? /mapper
? ? ? /service
? /src/main/resources
? ? /org/mybatis/example
? ? ? /mapper
? /src/test/java
? /src/test/resources
? /web
當然,這是推薦的目錄結構,并非強制要求。
但使用一個通用的目錄結構將更有利于大家溝通。
2 SqlSession
使用 MyBatis 的主要 Java 接口就是 SqlSession。
SqlSessions 是由 SqlSessionFactory 實例創建的。
而 SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 創建的。
SqlSessionFactoryBuilder 有五個 build() 方法,每一種都允許你從不同的資源中創建一個 SqlSessionFactory 實例。
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)
第一種方法是最常用的,它接受一個指向 XML 文件(也就是之前討論的 mybatis-config.xml 文件)的 InputStream 實例。
以下給出一個從 mybatis-config.xml 文件創建 SqlSessionFactory 的示例:
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
Resources 會從類路徑下、文件系統或一個 web URL 中加載資源文件。 在略讀該類的源代碼后,你會發現一整套相當實用的方法。 這里給出一個簡表:
URL getResourceURL(String resource)
URL getResourceURL(ClassLoader loader, String resource)
InputStream getResourceAsStream(String resource)
InputStream getResourceAsStream(ClassLoader loader, String resource)
Properties getResourceAsProperties(String resource)
Properties getResourceAsProperties(ClassLoader loader, String resource)
Reader getResourceAsReader(String resource)
Reader getResourceAsReader(ClassLoader loader, String resource)
File getResourceAsFile(String resource)
File getResourceAsFile(ClassLoader loader, String resource)
InputStream getUrlAsStream(String urlString)
Reader getUrlAsReader(String urlString)
Properties getUrlAsProperties(String urlString)
Class classForName(String className)
SqlSessionFactory 有六個方法創建 SqlSession 實例。
SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();
默認的 openSession() 方法沒有參數,它會創建具備如下特性的 SqlSession:
事務作用域將會開啟(也就是不自動提交)。
將由當前環境配置的 DataSource 實例中獲取 Connection 對象。
事務隔離級別將會使用驅動或數據源的默認設置。
預處理語句不會被復用,也不會批量處理更新。
正如之前所提到的,SqlSession 在 MyBatis 中是非常強大的一個類。 它包含了所有執行語句、提交或回滾事務以及獲取映射器實例的方法。 SqlSession 類的方法超過了 20 個,為了方便理解,我們將它們分成幾種組別。
語句執行方法
這些方法被用來執行定義在 SQL 映射 XML 文件中的 SELECT、INSERT、UPDATE 和 DELETE 語句。
事務控制方法
有四個方法用來控制事務作用域。
void commit()
void commit(boolean force)
void rollback()
void rollback(boolean force)
確保 SqlSession 被關閉
void close()
SqlSession session = null;
try {
// 從類路徑下加載資源文件mybatis-config.xml
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 由 SqlSessionFactoryBuilder創建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 由 SqlSessionFactory創建SqlSession
session = sqlSessionFactory.openSession();
// ...
session.commit();
} catch (IOException e) {
e.printStackTrace();
session.rollback(true);
} finally {
session.close();
}
使用映射器
<T> T getMapper(Class<T> type)
上述的各個 insert、update、delete 和 select 方法都很強大,但也有些繁瑣,它們并不符合類型安全,對你的 IDE 和單元測試也不是那么友好。
因此,使用映射器類來執行映射語句是更常見的做法。
下面的示例展示了一些方法簽名以及它們是如何映射到 SqlSession 上的。
public interface AuthorMapper {
Author selectAuthor(int id);
List<Author> selectAuthors();
int insertAuthor(Author author);
int updateAuthor(Author author);
int deleteAuthor(int id);
}
映射器注解
設計初期的 MyBatis 是一個 XML 驅動的框架。配置信息是基于 XML 的,映射語句也是定義在 XML 中的。
MyBatis 3 構建在全面且強大的基于 Java 語言的配置 API 之上。它是 XML 和注解配置的基礎。
注解提供了一種簡單且低成本的方式來實現簡單的映射語句。
@Insert("insert into author (id, username, password, email, bio, favourite_section) "
+ "values(#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection})")
int insertAuthorAnnotation(Author author);
@Update("update author set username = #{username}, password = #{password},"
+ " email = #{email}, bio = #{bio}, favourite_section = #{favouriteSection}" + " where id = #{id}")
int updateAuthorAnnotation(Author author);
@Delete("delete from author where id = #{id}")
public void deleteAuthorAnnotation(@Param("id") int id);