什么是 MyBatis 孽糖?
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL毅贮、存儲(chǔ)過程以及高級(jí)映射办悟。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來配置和映射原生信息滩褥,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄病蛉。
Maven配置
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
關(guān)鍵類
SqlSessionFactory
每個(gè)基于 MyBatis 的應(yīng)用都是以一個(gè) SqlSessionFactory
的實(shí)例為中心的。SqlSessionFactory
的實(shí)例可以通過 SqlSessionFactoryBuilder
獲得瑰煎。而 SqlSessionFactoryBuilder
則可以從 XML 配置文件或一個(gè)預(yù)先定制的 Configuration
的實(shí)例構(gòu)建出 SqlSessionFactory
的實(shí)例铺然。
XML 配置文件(configuration XML)中包含了對(duì) MyBatis 系統(tǒng)的核心設(shè)置,包含獲取數(shù)據(jù)庫(kù)連接實(shí)例的數(shù)據(jù)源(DataSource
)和決定事務(wù)作用域和控制方式的事務(wù)管理器(TransactionManager
)酒甸。
<?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>
從 SqlSessionFactory 中獲取 SqlSession
既然有了 SqlSessionFactory
魄健,顧名思義,我們就可以從中獲得 SqlSession
的實(shí)例了插勤。SqlSession
完全包含了面向數(shù)據(jù)庫(kù)執(zhí)行 SQL 命令所需的所有方法沽瘦。你可以通過 SqlSession
實(shí)例來直接執(zhí)行已映射的 SQL 語(yǔ)句。例如:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
每個(gè)線程都應(yīng)該有它自己的 SqlSession
實(shí)例农尖。SqlSession
的實(shí)例不是線程安全的析恋,因此是不能被共享的,所以它的最佳的作用域是請(qǐng)求或方法作用域盛卡。絕對(duì)不能將 SqlSession
實(shí)例的引用放在一個(gè)類的靜態(tài)域助隧,甚至一個(gè)類的實(shí)例變量也不行。也絕不能將 SqlSession
實(shí)例的引用放在任何類型的管理作用域中窟扑,比如 Servlet
架構(gòu)中的 HttpSession
喇颁。如果你現(xiàn)在正在使用一種 Web
框架,要考慮 SqlSession
放在一個(gè)和 HTTP 請(qǐng)求對(duì)象相似的作用域中嚎货。換句話說橘霎,每次收到的 HTTP 請(qǐng)求,就可以打開一個(gè) SqlSession
殖属,返回一個(gè)響應(yīng)姐叁,就關(guān)閉它。這個(gè)關(guān)閉操作是很重要的洗显,你應(yīng)該把這個(gè)關(guān)閉操作放到finally
塊中以確保每次都能執(zhí)行關(guān)閉外潜。下面的示例就是一個(gè)確保 SqlSession
關(guān)閉的標(biāo)準(zhǔn)模式:
優(yōu)秀實(shí)踐:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
} finally {
session.close();
}
引用
MyBatis 入門