什麼是MyBatis?
MyBatis 是支持普通 SQL 查詢,存儲過程和高級映射的優秀持久層框架。 MyBatis 消除了幾乎全部的 JDBC代碼和參數的手工設置以及結果集的檢索。 MyBatis 使用簡單的XML或註解用於配置和原始映射,將接口和 Java 的 POJOs( Plan OldJava Objects,普通的 Java對象)映射成數據庫中的記錄。html
每個mybatis應用都以一個SqlSessionFactory對象的實例爲核心。SqlSessionFactory能夠經過SqlSessionFactoryBuilder對象來得到,SqlSessionFactoryBuilder對象能夠從XML配置文件,或從Configuration類的實例中構建SqlSessionFactory對象。
java
從XML中建立SqlSessionFactorysql
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建立。session
它的主要功能是建立SqlSession對象,和SqlSessionFactoryBuilder對象同樣,沒有必要每次訪問Mybatis就建立一次SqlSessionFactory,一般的作法是建立一個全局的對象就能夠了。mybatis
實例:
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。app
關閉 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); }