MyBatis 簡單使用
1. 前言
在上一節(jié)中,我們搭建了 MyBatis 實(shí)驗(yàn)環(huán)境。本小節(jié),我們將一起學(xué)習(xí)如何使用 MyBatis,雖然在實(shí)際的開發(fā)中,你幾乎不會(huì)按照本小節(jié)所介紹的方式去使用 MyBatis,但是這對你熟悉 MyBatis 整體結(jié)構(gòu)有著重要作用,同時(shí)這也是面試的重點(diǎn)。
2. 編程式使用
MyBatis 官方文檔中并未詳細(xì)的介紹如何編程式使用 MyBatis,絕大多數(shù)情況下,我們都是通過 配置文件
來拿到配置然后開啟會(huì)話的。這樣的方式固然很方便,但是卻屏蔽了太多的細(xì)節(jié),因此我們想從點(diǎn)到面,層層遞進(jìn)給你介紹 MyBatis 的基礎(chǔ)用法。
接下來,我們一起來寫一個(gè)簡單的 demo 來使用一下 MyBatis。
2.1 啟動(dòng) MyBatis
在 mybatis-primer 項(xiàng)目中,有一個(gè)默認(rèn)的包com.imooc.mybatis
,在該包下,我們新建一個(gè)包名為pattern
,并在其中新建一個(gè)名為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
// 準(zhǔn)備jdbc事務(wù)類
JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
// 配置數(shù)據(jù)源
PooledDataSource dataSource =
new PooledDataSource("com.mysql.cj.jdbc.Driver",
"jdbc:mysql://localhost:3306/imooc?useSSL=false",
"root", "123456");
// 配置環(huán)境,向環(huán)境中指定環(huán)境id、事務(wù)和數(shù)據(jù)源
Environment environment = new Environment.Builder("development")
.transactionFactory(jdbcTransactionFactory)
.dataSource(dataSource).build();
// 新建 MyBatis 配置類
Configuration configuration = new Configuration(environment);
// 得到 SqlSessionFactory 核心類
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
// 開始一個(gè) sql 會(huì)話
SqlSession session = sqlSessionFactory.openSession();
// 得到 sql 連接并運(yùn)行 sql 語句
PreparedStatement preStatement = session
.getConnection()
.prepareStatement("SELECT * FROM imooc_user WHERE id = ?");
preStatement.setInt(1, 1);
ResultSet result = preStatement.executeQuery();
// 驗(yàn)證結(jié)果
while (result.next()) {
System.out.println("username: " + result.getString("username"));
}
// 關(guān)閉會(huì)話
session.close();
}
}
即使你不熟悉 MyBatis,也沒有必要被這段代碼給嚇到,因?yàn)樵趯?shí)際的開發(fā)中,你幾乎沒有機(jī)會(huì)去寫這段代碼。但是我們?nèi)孕枰榻B這段代碼,它可能是你面試的重點(diǎn)。
書寫完畢后,請?jiān)?PooledDataSource 類構(gòu)造函數(shù)中更改數(shù)據(jù)用戶名、密碼和 url 配置以滿足你所使用的數(shù)據(jù)庫環(huán)境。運(yùn)行一下這段代碼,如果一切順利,在控制臺中你會(huì)看到以下輸出內(nèi)容(只截取了部分內(nèi)容):
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 使用流程
在代碼中,我們添加了一定量的注釋說明了流程,接下來我們來總結(jié)一下。
對于 MyBatis 的基礎(chǔ)使用可大致分為以下3
步:
- 得到 MyBatis 配置信息,即代碼中的
Configuration
類。Configuration 負(fù)責(zé) MyBatis 架構(gòu)中的配置部分,例如:dataSource數(shù)據(jù)源信息都會(huì)交給 Configuration 去管理;這一步其實(shí)是比較繁雜的,Environment 是 Configuration 中的一部分,而 PooledDataSource 和 JdbcTransactionFactory 又是 Environment 中的一部分,它們是屬于層層遞進(jìn)的關(guān)系。其中 JdbcTransactionFactory 表示事務(wù)工廠,當(dāng) MyBatis 需要新建事務(wù)的時(shí)候,會(huì)通過它來新建;PooledDataSource 表示數(shù)據(jù)源,通過其構(gòu)造參數(shù),我們傳入了數(shù)據(jù)庫 url,數(shù)據(jù)庫用戶和密碼等配置;Configuration 可以有多個(gè) Environment,因此每個(gè) Environment 都必須有唯一的 id,即代碼中的 development,將這些配置搭配組合后就是一個(gè)可用的 Configuration。 - 通過 Configuration 來創(chuàng)建
SqlSessionFactory
。MyBatis 是通過會(huì)話的方式來執(zhí)行 SQL 的,因?yàn)槲覀儽仨殦碛幸粋€(gè)會(huì)話創(chuàng)建器,即會(huì)話工廠。 - 新建
SqlSession
來執(zhí)行 SQL。有了 SqlSessionFactory 后,我們就可以方便地新建會(huì)話,并通過會(huì)話來執(zhí)行 SQL 了。
而PreparedStatement
及以下的內(nèi)容,其實(shí)并不屬于 MyBatis,它們是 JDBC 提供的,在實(shí)際的 MyBatis 開發(fā)中,你也不會(huì)這樣去執(zhí)行 SQL,在這里我們只是為了展示 MyBatis 和 JDBC 的關(guān)系。
可以看到,編程式使用 MyBatis 其實(shí)是比較復(fù)雜,你需要十分熟悉 MyBatis 的 API,而且這種硬編碼的方式是比較笨重的,所以絕大多數(shù)資料都推薦配置的方式使用 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 的使用經(jīng)驗(yàn),那么你一定可以輕松的看懂配置項(xiàng),configuration
標(biāo)簽對應(yīng) Configuration 類,environment
標(biāo)簽對應(yīng) Environment 類,transactionManager
標(biāo)簽和dataSource
標(biāo)簽分別對應(yīng) JdbcTransactionFactory 和 PooledDataSource 類。
有了配置文件后,我們無需一個(gè)挨著一個(gè)的新建類,而是在配置文件中指定即可,如driver
的值指定為com.mysql.cj.jdbc.Driver
。當(dāng)后續(xù)需要修改的時(shí)候,也不需要去代碼中找,而是直接在配置文件中修改即可。
TIPS: 注意, 請?jiān)谀阕约旱呐渲梦募行薷臄?shù)據(jù)庫配置,以滿足你自己的數(shù)據(jù)庫環(huán)境。
3.2 啟動(dòng) MyBatis
同樣地,我們在 patter 包下新建另一個(gè)類,名為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);
// 新建會(huì)話
SqlSession session = sqlSessionFactory.openSession();
// 執(zhí)行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"));
}
// 關(guān)閉會(huì)話
session.close();
}
}
運(yùn)行代碼,你會(huì)看到跟上面一樣的結(jié)果。
3.3 使用流程
配置式使用 MyBatis,也可分為3
步:
- 讀取配置文件,即
mybatis-config.xml
。 - 通過配置文件來創(chuàng)建
SqlSessionFactory
。 - 新建
SqlSession
來執(zhí)行 SQL。
與編程式相比,配置式更為簡潔,更易維護(hù),所以使用廣泛,幾乎所有資料都推薦這種方式來使用 MyBatis。但是編程式并非沒有意義,它可以幫助你梳理 MyBatis 結(jié)構(gòu),有了編程式的基礎(chǔ),你才能更加容易地看懂配置文件中的內(nèi)容,在后續(xù)的學(xué)習(xí)中,我們都將默認(rèn)地使用配置式。
4. 小結(jié)
- 在實(shí)際的開發(fā)中,你都少有機(jī)會(huì)去按照本小節(jié)的方式去使用 MyBatis,但是這對你
深入理解MyBatis
結(jié)構(gòu)有重要作用。 - 編程式使用的 API 較多,我們沒有必要去死記硬背,熟練掌握其使用流程,能在需要的時(shí)候查閱即可。