MyBatis 簡單使用
1. 前言
在上一節中,我們搭建了 MyBatis 實驗環境。本小節,我們將一起學習如何使用 MyBatis,雖然在實際的開發中,你幾乎不會按照本小節所介紹的方式去使用 MyBatis,但是這對你熟悉 MyBatis 整體結構有著重要作用,同時這也是面試的重點。
2. 編程式使用
MyBatis 官方文檔中并未詳細的介紹如何編程式使用 MyBatis,絕大多數情況下,我們都是通過 配置文件
來拿到配置然后開啟會話的。這樣的方式固然很方便,但是卻屏蔽了太多的細節,因此我們想從點到面,層層遞進給你介紹 MyBatis 的基礎用法。
接下來,我們一起來寫一個簡單的 demo 來使用一下 MyBatis。
2.1 啟動 MyBatis
在 mybatis-primer 項目中,有一個默認的包com.imooc.mybatis
,在該包下,我們新建一個包名為pattern
,并在其中新建一個名為StartNoXml.java
的類,并向該文件中填充如下代碼:
package com.imooc.mybatis.pattern;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@SuppressWarnings({"SqlResolve", "SqlNoDataSourceInspection", "Duplicates"})
public class StartNoXml {
public static void main(String[] args) throws SQLException {
// 無需xml配置的方式使用MyBatis
// 準備jdbc事務類
JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
// 配置數據源
PooledDataSource dataSource
new PooledDataSource("com.mysql.cj.jdbc.Driver",
"jdbc:mysql://localhost:3306/imooc?useSSL=false",
"root", "123456");
// 配置環境,向環境中指定環境id、事務和數據源
Environment environment = new Environment.Builder("development")
.transactionFactory(jdbcTransactionFactory)
.dataSource(dataSource).build();
// 新建 MyBatis 配置類
Configuration configuration = new Configuration(environment);
// 得到 SqlSessionFactory 核心類
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
// 開始一個 sql 會話
SqlSession session = sqlSessionFactory.openSession();
// 得到 sql 連接并運行 sql 語句
PreparedStatement preStatement = session
.getConnection()
.prepareStatement("SELECT * FROM imooc_user WHERE id = ?");
preStatement.setInt(1, 1);
ResultSet result = preStatement.executeQuery();
// 驗證結果
while (result.next()) {
System.out.println("username: " + result.getString("username"));
}
// 關閉會話
session.close();
}
}
即使你不熟悉 MyBatis,也沒有必要被這段代碼給嚇到,因為在實際的開發中,你幾乎沒有機會去寫這段代碼。但是我們仍需要介紹這段代碼,它可能是你面試的重點。
書寫完畢后,請在 PooledDataSource 類構造函數中更改數據用戶名、密碼和 url 配置以滿足你所使用的數據庫環境。運行一下這段代碼,如果一切順利,在控制臺中你會看到以下輸出內容(只截取了部分內容):
18:31:44.914 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
****
username: peter
****
18:31:45.413 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1234250905 to pool.
2.2 使用流程
在代碼中,我們添加了一定量的注釋說明了流程,接下來我們來總結一下。
對于 MyBatis 的基礎使用可大致分為以下3
步:
- 得到 MyBatis 配置信息,即代碼中的
Configuration
類。Configuration 負責 MyBatis 架構中的配置部分,例如:dataSource數據源信息都會交給 Configuration 去管理;這一步其實是比較繁雜的,Environment 是 Configuration 中的一部分,而 PooledDataSource 和 JdbcTransactionFactory 又是 Environment 中的一部分,它們是屬于層層遞進的關系。其中 JdbcTransactionFactory 表示事務工廠,當 MyBatis 需要新建事務的時候,會通過它來新建;PooledDataSource 表示數據源,通過其構造參數,我們傳入了數據庫 url,數據庫用戶和密碼等配置;Configuration 可以有多個 Environment,因此每個 Environment 都必須有唯一的 id,即代碼中的 development,將這些配置搭配組合后就是一個可用的 Configuration。 - 通過 Configuration 來創建
SqlSessionFactory
。MyBatis 是通過會話的方式來執行 SQL 的,因為我們必須擁有一個會話創建器,即會話工廠。 - 新建
SqlSession
來執行 SQL。有了 SqlSessionFactory 后,我們就可以方便地新建會話,并通過會話來執行 SQL 了。
而PreparedStatement
及以下的內容,其實并不屬于 MyBatis,它們是 JDBC 提供的,在實際的 MyBatis 開發中,你也不會這樣去執行 SQL,在這里我們只是為了展示 MyBatis 和 JDBC 的關系。
可以看到,編程式使用 MyBatis 其實是比較復雜,你需要十分熟悉 MyBatis 的 API,而且這種硬編碼的方式是比較笨重的,所以絕大多數資料都推薦配置的方式使用 MyBatis。
3. 配置式使用
接下來,我們一起來看一下如何通過配置來使用 MyBatis。
3.1 配置文件
首先,我們在resources
目錄下新建mybatis-config.xml
配置文件,并在其中添加上如下配置:
<?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="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/imooc?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
有了上面編程式 API 的使用經驗,那么你一定可以輕松的看懂配置項,configuration
標簽對應 Configuration 類,environment
標簽對應 Environment 類,transactionManager
標簽和dataSource
標簽分別對應 JdbcTransactionFactory 和 PooledDataSource 類。
有了配置文件后,我們無需一個挨著一個的新建類,而是在配置文件中指定即可,如driver
的值指定為com.mysql.cj.jdbc.Driver
。當后續需要修改的時候,也不需要去代碼中找,而是直接在配置文件中修改即可。
TIPS: 注意, 請在你自己的配置文件中修改數據庫配置,以滿足你自己的數據庫環境。
3.2 啟動 MyBatis
同樣地,我們在 patter 包下新建另一個類,名為StartWithXml.java
,并填充以下代碼:
package com.imooc.mybatis.pattern;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@SuppressWarnings({"SqlResolve", "SqlNoDataSourceInspection", "Duplicates"})
public class StartWithXml {
public static void main(String[] args) throws IOException, SQLException {
// 配置式使用MyBatis
String resource = "mybatis-config.xml";
// 讀取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 按照配置文件得到 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 新建會話
SqlSession session = sqlSessionFactory.openSession();
// 執行SQL
PreparedStatement preStatement = session.getConnection().prepareStatement("SELECT * FROM imooc_user WHERE id = ?");
preStatement.setInt(1, 1);
ResultSet result = preStatement.executeQuery();
while (result.next()) {
System.out.println("username: " + result.getString("username"));
}
// 關閉會話
session.close();
}
}
運行代碼,你會看到跟上面一樣的結果。
3.3 使用流程
配置式使用 MyBatis,也可分為3
步:
- 讀取配置文件,即
mybatis-config.xml
。 - 通過配置文件來創建
SqlSessionFactory
。 - 新建
SqlSession
來執行 SQL。
與編程式相比,配置式更為簡潔,更易維護,所以使用廣泛,幾乎所有資料都推薦這種方式來使用 MyBatis。但是編程式并非沒有意義,它可以幫助你梳理 MyBatis 結構,有了編程式的基礎,你才能更加容易地看懂配置文件中的內容,在后續的學習中,我們都將默認地使用配置式。
4. 小結
- 在實際的開發中,你都少有機會去按照本小節的方式去使用 MyBatis,但是這對你
深入理解MyBatis
結構有重要作用。 - 編程式使用的 API 較多,我們沒有必要去死記硬背,熟練掌握其使用流程,能在需要的時候查閱即可。