什麼是MyBatis?
MyBatis 是支持普通 SQL 查詢,存儲過程和高級映射的優秀持久層框架。 MyBatis 消除了幾乎所有的 JDBC代碼和參數的手工設置以及結果集的檢索。 MyBatis 使用簡單的XML或註解用於配置和原始映射,將接口和 Java 的 POJOs( Plan OldJava Objects,普通的 Java對象)映射成數據庫中的記錄。
每一個mybatis應用都以一個SqlSessionFactory對象的實例爲核心。SqlSessionFactory可以通過SqlSessionFactoryBuilder對象來獲得,SqlSessionFactoryBuilder對象可以從XML配置文件,或從Configuration類的實例中構建SqlSessionFactory對象。
從XML中創建SqlSessionFactory
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元素體中包含對事務管理和連接池的環境配置 -->
<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 -->
<!-- mappers元素是包含所有mapper(映射器)的列表,這些mapper的XML文件包含SQL代碼和映射定義信息 -->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml" />
</mappers>
</configuration>
SqlSessionFactory對象由SqlSessionFactoryBuilder創建。
它的主要功能是創建SqlSession對象,和SqlSessionFactoryBuilder對象一樣,沒有必要每次訪問Mybatis就創建一次SqlSessionFactory,通常的做法是創建一個全局的對象就可以了。
實例:
private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
private static SqlSessionFactory sqlSessionFactory;
private static void init() throws IOException {
String resource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);
}
SqlSession
SqlSession對象的主要功能是完成一次數據庫的訪問和結果的映射。每個線程都應該有它自己的SqlSession 實例。 SqlSession 的實例不能被共享,也是線程不安全的。因此最佳的範圍是請求或方法範圍。絕對不能將SqlSession 實例的引用放在一個類的靜態字段甚至是實例字段中。也絕不能將SqlSession 實例的引用放在任何類型的管理範圍中,比如Serlvet 架構中的 HttpSession。
關閉 Session很重要,你應該確保使用 finally 塊來關閉它。下面的示例就是一個確保 SqlSession 關閉的基本模式:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
Mapper實例
通過 SqlSession和 Mapper 對象到底執行了什麼操作?(已映射的SQL語句是關鍵)
我們先來看看:
語句是可以通過 XML 或註解定義的,我們先看看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 namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
package org.mybatis.example;
//接口
public interface BlogMapper {
Blog selectBlog(int id);
}
操作執行
SqlSession session = sqlSessionFactory.openSession();
try {
//getMapper 獲取mapper對象
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
再來看看如何使用java註解來替換寫映射語句的xml
使用註解要更加清晰,但是對於複雜的sql來說就會很亂,對於複雜的sql建議使用xml
package org.mybatis.example;
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}