MyBatis概述和簡介
1.1 MyBatis簡單介紹
MyBatis本是apache的一個開源專案iBatis,2010年這個專案由apache software foundation遷移到了google code,並且改名為MyBatis。2013年11月遷移到Github。
iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAOs)。
當前,最新版本是MyBatis 3.5.9,其釋出時間是2021年12月26日。
MyBatis 是一款優秀的持久層框架,它支援自定義 SQL、儲存過程以及高階對映。MyBatis 免除了幾乎所有的 JDBC 程式碼以及設定引數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和對映原始型別、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄。
官網地址:https://mybatis.org/mybatis-3/zh/index.html
1.2 什麼是持久層框架
持久化是將程式資料在持久狀態和瞬時狀態間轉換的機制。
- 即把資料(如記憶體中的物件)儲存到可永久儲存的儲存裝置中(如磁碟)。持久化的主要應用是將記憶體中的物件儲存在資料庫中,或者儲存在磁碟檔案中、XML資料檔案中等等。
- JDBC就是一種持久化機制。檔案IO也是一種持久化機制。
- 在生活中 : 將鮮肉冷藏,吃的時候再解凍的方法也是。將水果做成罐頭的方法也是。
為什麼需要持久化服務呢?那是由於記憶體本身的缺陷引起的
- 記憶體斷電後資料會丟失,但有一些物件是無論如何都不能丟失的,比如銀行賬號等,遺憾的是,人們還無法保證記憶體永不掉電。
- 記憶體過於昂貴,與硬碟、光碟等外存相比,記憶體的價格要高2~3個數量級,而且維持成本也高,至少需要一直供電吧。所以即使物件不需要永久儲存,也會因為記憶體的容量限制不能一直呆在記憶體中,需要持久化來快取到外存。
持久化框架(英語:persistence framework)是一種中介軟體,可協助並自動將程式資料儲存到資料庫(尤其是關係資料庫中。它作為應用程式和資料庫之間的一個抽象層,通常彌合兩者之間的任何概念差異。
許多永續性框架也是物件關係對映(ORM)工具(例如Hibernate、MyBatis SQL Maps、Entity Framework、ObjectiveSql(頁面存檔備份,存於網際網路檔案館)、Slick和Java Ultra-Lite Persistence)。此類框架將應用程式域中的物件對映到需要在資料庫中持久化的資料。可以使用XML
ORM 不僅僅是一面向物件語言和關係型資料庫之間的一種,也有可描述為面嚮物件語言對關係型資料庫的一種抽象,其它抽象類似於面嚮物件語言解釋現實業務領域,通過面向物件的方式解決關係資料庫的問題,封裝、重用、可擴充套件等特性應該被使用在ORM中。
傳統的SQL是面向資料分析人員使用的一種工作,其表現形式和內在的邏輯更加人性化,使得不懂程式設計的人員可以正常的使用。但隨著時代的進步,關係型資料的廣泛應用,SQL 與程式語言的融合越來越重要,SQL 的程式設計與傳統的程式語言的結合已經不是純字串的形式結合了,需要更加符合程式語言的方式出現。
1.3 MyBatis特點
- 簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar檔案+配置幾個sql對映檔案。易於學習,易於使用。通過文件和原始碼,可以比較完全的掌握它的設計思路和實現。
- 靈活:mybatis不會對應用程式或者資料庫的現有設計強加任何影響。 sql寫在xml裡,便於統一管理和優化。通過sql語句可以滿足操作資料庫的所有需求。
- 解除sql與程式程式碼的耦合:通過提供DAO層,將業務邏輯和資料訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和程式碼的分離,提高了可維護性。
- 提供對映標籤,支援物件與資料庫的orm欄位關係對映。
- 提供物件關係對映標籤,支援物件關係組建維護。
- 提供xml標籤,支援編寫動態sql。
1.4 第一個MyBatis程式
1.4.1 搭建實驗資料庫環境
CREATE DATABASE `test`;
USE `test`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`) values (1,'無涯子','123456'),(2,'Jack','abcdef'),(3,'haha','987654');
1.4.2 建立專案工程,匯入依賴
//mybatis依賴
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
//mysql驅動
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
//mybatis和spring整合依賴
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
//單元測試
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
//log4j日誌依賴
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
//mybatis分頁外掛依賴
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
1.4.3編寫配置檔案及工具類
每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的例項為核心的。SqlSessionFactory 的例項可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置檔案或一個預先配置的 Configuration 例項來構建出 SqlSessionFactory 例項。
<?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>
<!-- 匯入外部資料庫設定配置檔案-->
<properties resource="mybatis.properties"/>
<!-- 設定日誌配置和駝峰命名轉換 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--配置別名 -->
<typeAliases>
<package name="com.wyz.bean"/>
</typeAliases>
<!-- 資料庫環境配置 -->
<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="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
XML 配置檔案中包含了對 MyBatis 系統的核心設定,包括獲取資料庫連線例項的資料來源(DataSource)以及決定事務作用域和控制方式的事務管理器(TransactionManager)。environment 元素體中包含了事務管理和連線池的配置。mappers 元素則包含了一組對映器(mapper),這些對映器的 XML 對映檔案包含了 SQL 程式碼和對映定義資訊。
參考官網:https://mybatis.org/mybatis-3/zh/configuration.html
編寫一個Mybatis工具類
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
//載入配置檔案
static{
String resource = "mybatis-config.xml";
try {
InputStream is = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
//獲取SqlSession
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
}
1.4.4編寫Bean類、Dao介面和Mapper檔案
public class User {
private int id;
private String name;
private String pwd;
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
public interface UserDao {
List<User> getAll();
}
<?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="com.wyz.dao.UserDao">
<select id="getAll" resultType="user">
select id,name,pwd from user
</select>
</mapper>
一個語句既可以通過 XML 定義,也可以通過註解定義。在一個 XML 對映檔案中,可以定義無數個對映語句,這樣一來,XML 頭部和文件型別宣告部分就顯得微不足道了。文件的其它部分很直白,容易理解。 它在名稱空間 “com.wyz.dao.UserDao” 中定義了一個名為 “getList” 的對映語句,這樣你就可以用全限定名 “com.wyz.dao.UserDao.getList” 來呼叫對映語句了,就像上面例子中那樣。在之前版本的 MyBatis 中,名稱空間(Namespaces)的作用並不大,是可選的。 但現在,隨著名稱空間越發重要,你必須指定名稱空間。
名稱空間的作用有兩個,一個是利用更長的全限定名來將不同的語句隔離開來,同時也實現了你上面見到的介面繫結。就算你覺得暫時用不到介面繫結,你也應該遵循這裡的規定,以防哪天你改變了主意。 長遠來看,只要將名稱空間置於合適的 Java 包名稱空間之中,你的程式碼會變得更加整潔,也有利於你更方便地使用 MyBatis。
註冊到核心配置檔案
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
1.4.5 測試
SqlSession sqlSession = MyBatisUtil.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> lists = userDao.getAll();
for (User list : lists) {
System.out.println(list);
}
sqlSession.close();