基于MyBatis的數(shù)據(jù)持久化框架的使用詳解
一、MyBatis是什么
1.1、概述
Mybatis是一個優(yōu)秀的開源、輕量級持久層框架,它對JDBC操作數(shù)據(jù)庫的過程進(jìn)行封裝,簡化了加載驅(qū)動、創(chuàng)建連接、創(chuàng)建 statement 等繁雜的過程,使開發(fā)者只需要關(guān)注sql本身。
我們原來使用JDBC操作數(shù)據(jù)庫,需要手動的寫代碼去注冊驅(qū)動、獲取connection、獲取statement等等,現(xiàn)在Mybaits幫助我們把這些事情做了,我們只需要關(guān)注我們的業(yè)務(wù)sql即可,這樣可以提高我們的開發(fā)效率。
MyBatis屬于半自動的ORM框架
MyBatis 支持定制化 SQL、存儲過程以及高級映射,可以在實(shí)體類和 SQL 語句之間建立mapping映射關(guān)系,是一種半自動化的 ORM 實(shí)現(xiàn)。其封裝性低于 Hibernate,但性能優(yōu)秀、小巧、簡單易學(xué)、應(yīng)用廣泛。
1.2、什么是持久化
數(shù)據(jù)持久化是將內(nèi)存中的數(shù)據(jù)模型轉(zhuǎn)換為存儲模型,以及將存儲模型轉(zhuǎn)換為內(nèi)存中數(shù)據(jù)模型的統(tǒng)稱。例如,文件的存儲、數(shù)據(jù)的讀取以及對數(shù)據(jù)表的增刪改查等都是數(shù)據(jù)持久化操作。
1.3、什么是ORM
ORM(Object Relational Mapping,對象關(guān)系映射)是一種數(shù)據(jù)持久化技術(shù),它在對象模型和關(guān)系型數(shù)據(jù)庫之間建立起對應(yīng)關(guān)系,并且提供了一種機(jī)制,通過 JavaBean 對象去操作數(shù)據(jù)庫表中的數(shù)據(jù)。
1.4、MyBatis主要內(nèi)容
MyBatis 前身為 iBatis,2002 年由 Clinton Begin 發(fā)布。2010 年從 Apache 遷移到 Google,并改名為 MyBatis,2013 年又遷移到了 Github。
MyBatis 的主要思想是將程序中的大量 SQL 語句剝離出來,使用 XML 文件或注解的方式實(shí)現(xiàn) SQL 的靈活配置,將 SQL 語句與程序代碼分離,在不修改程序代碼的情況下,直接在配置文件中修改 SQL 語句。MyBatis與其它持久性框架最大的不同是,MyBatis 強(qiáng)調(diào)使用 SQL,而其它框架(例如 Hibernate)通常使用自定義查詢語言,即 HQL(Hibernate查詢語言)或EJB QL(Enterprise JavaBeans查詢語言)。
1.5、優(yōu)點(diǎn)
MyBatis是免費(fèi)且開源的。
與 JDBC 相比,減少了 50% 以上的代碼量。
MyBatis是最簡單的持久化框架,體積小巧并且學(xué)習(xí)門檻低。
MyBatis相當(dāng)靈活,不會對應(yīng)用程序或者數(shù)據(jù)庫的現(xiàn)有設(shè)計強(qiáng)加任何影響,SQL 寫在 XML 中,和程序邏輯代碼分離,降低耦合度,便于同一管理和優(yōu)化,提高了代碼的可重用性。
提供 XML 標(biāo)簽,支持編寫動態(tài) SQL語句。
提供映射標(biāo)簽,支持實(shí)體對象與數(shù)據(jù)庫的表字段關(guān)系映射。
1.6、缺點(diǎn)
編寫 SQL語句工作量較大,對開發(fā)人員編寫 SQL 語句的功底有一定要求。
SQL語句依賴于數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫移植性差,不能隨意更換數(shù)據(jù)庫。
二、MyBatis架構(gòu)
2.1、mybatis所依賴的jar包
lib 文件夾下的 jar 文件是 MyBatis的依賴包(mybatis-3.5.10.jar是MyBatis的核心包)

將需要的核心包全部添加進(jìn)項(xiàng)目構(gòu)建路徑中
2.2、MyBatis準(zhǔn)備工作

①創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)
②創(chuàng)建實(shí)體類
在 src 目錄下創(chuàng)建一個名為com.my.entity 的包,在該包中創(chuàng)建實(shí)體類 Website。
package com.my.entity;
import java.util.Date;
//網(wǎng)站信息實(shí)體類
public class Website {
private int id;
private String name;
private String url;
private int age;
private String country;
private Date createtime;
@Override
public String toString() {
return "Website [id=" + id + ", name=" + name + ", url=" + url + ", age=" + age + ", country=" + country
+ ", createtime=" + createtime + "]";
}
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 getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
}注意:在類中聲明的屬性名稱與數(shù)據(jù)表 website 的字段名稱,保持完全一致。
③ SQL映射文件(在 src 目錄下創(chuàng)建 com.my.mapper 包,在該包下創(chuàng)建映射文件 WebsiteMapper.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">
<!-- SQL映射文件:配置執(zhí)行的SQL語句 -->
<mapper namespace="com.my.mapper.WebsiteMapper">
<!-- 添加操作的SQL映射 -->
<insert id = "insertNewWebsite" parameterType="com.my.entity.Website">
insert into website(name,url,age,country)values(#{name},#{url},#{age},#{country})
</insert>
<!-- 查詢所有網(wǎng)站信息 -->
<select id="selectWebsiteList" resultType="com.my.entity.Website">
select * from website
</select>
</mapper>上述代碼中,<mapper> 元素是配置文件的根元素,它包含了 namespace屬性,該屬性值通常設(shè)置為“包名+SQL映射文件名”,用于指定唯一的命名空間。
子元素 <select>、<insert> 中的信息用于執(zhí)行查詢、添加操作。
在定義的 SQL語句中,“#{}”表示一個占位符,相當(dāng)于“?”,而“#{name}”表示該占位符用于接收參數(shù)中的名稱為 name的參數(shù)值。
④核心配置文件
MyBatis 核心配置文件主要用于配置數(shù)據(jù)庫連接和 MyBatis運(yùn)行時所需的各種特性,包含了設(shè)置和影響 MyBatis 行為的屬性。
在 src 目錄下創(chuàng)建 MyBatis的核心配置文件 mybatis-config.xml,在該文件中配置了數(shù)據(jù)庫環(huán)境和映射文件的位置,具體內(nèi)容如下:
<?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>
<!-- 框架參數(shù) -->
<settings>
<!-- 配置日志為LOG4J -->
<setting name="logImpl" value="LOG4J" />
</settings>
<!-- 配置mybatis運(yùn)行環(huán)境 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC的事務(wù)管理 -->
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<!-- MySQL數(shù)據(jù)庫驅(qū)動 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<!-- 連接數(shù)據(jù)庫的URL -->
<property name="url"
value="jdbc:mysql://localhost:3306/my_bank?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8" />
<property name="username" value="xxxx" />
<property name="password" value="xxxxxx" />
</dataSource>
</environment>
</environments>
<!-- 將mapper文件加入到配置文件中 -->
<mappers>
<mapper resource="com/my/mapper/EarthquakeMapper.xml" />
</mappers>
</configuration>⑤日志文件
MyBatis 默認(rèn)使用 log4j 輸出日志信息,如果開發(fā)者需要查看控制臺輸出的 SQL 語句,可以在 classpath 路徑下配置其日志文件。在 mybatisDemo 的 src 目錄下創(chuàng)建 log4j.properties 文件
# Global logging configuration log4j.rootLogger=ERROR,stdout # MyBatis logging configuration... log4j.logger.com.apesource=DEBUG # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
三、MyBatis 核心對象
MyBatis 的核心接口和類包括:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。

使用步驟:
1首先,獲取 SqlSessionFactoryBuilder對象,可以根據(jù) XML 配置文件或者 Configuration 類的實(shí)例構(gòu)建該對象。
2其次,通過 SqlSessionFactoryBuilder對象來獲取 SqlSessionFactory 對象。
3最后,獲取 SqlSessionFactory 對象之后,就可以進(jìn)一步獲取 SqlSession 實(shí)例。SqlSession 對象中完全包含以數(shù)據(jù)庫為背景的所有執(zhí)行 SQL 操作的方法,用該實(shí)例可以直接執(zhí)行已映射的 SQL 語句。
核心對象的生命周期和作用域
SqlSessionFactoryBuilder
這個類可以被實(shí)例化、使用和丟棄,一旦創(chuàng)建了SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實(shí)例的最佳作用域是方法作用域(也就是局部方法變量)。 可以重用 SqlSessionFactoryBuilder 來創(chuàng)建多個 SqlSessionFactory 實(shí)例。
SqlSessionFactory
SqlSessionFactory 一旦被創(chuàng)建就應(yīng)該在應(yīng)用的運(yùn)行期間一直存在,沒有任何理由丟棄它或重新創(chuàng)建另一個實(shí)例。 使用 SqlSessionFactory 的最佳實(shí)踐是在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞習(xí)慣”。因此 SqlSessionFactory 的最佳作用域是"應(yīng)用作用域"。即隨著應(yīng)用程序的生命周期一直存在。這種“存在于整個應(yīng)用運(yùn)行期間,并且只存在一個對象實(shí)例”。例如使用單例模式。
SqlSession
每個線程都應(yīng)該有它自己的 SqlSession 實(shí)例。SqlSession 的實(shí)例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 實(shí)例的引用放在一個類的靜態(tài)域,甚至一個類的實(shí)例變量也不行。為了確保每次都能執(zhí)行關(guān)閉操作,你應(yīng)該把這個關(guān)閉操作放到 finally 塊中。
將其代入實(shí)例中封裝為MyBatis工具類和實(shí)
工具類
package com.my.dao;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisDBUtils {
private static SqlSessionFactory factory = null;
static {
try {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
SqlSession session = null;
if(factory != null) {
session = factory.openSession();
}
return session;
}
}實(shí)現(xiàn)類
public class Test04 {
public static void main(String[] args) {
//每1000條執(zhí)行一次批處理,并獲取主鍵回填
try (SqlSession sqlSession = MybatisDBUtils.getBatchSqlSession()) {
WebsiteMapper websiteMapper = sqlSession.getMapper(WebsiteMapper.class);
for(int i = 1;i <= 10;i++) {
Website website = new Website("神碼搜索","www.shenma.com",((int)(Math.random()*10)),"CN");
}
}
}到此這篇關(guān)于基于MyBatis的數(shù)據(jù)持久化框架的使用詳解的文章就介紹到這了,更多相關(guān)MyBatis數(shù)據(jù)持久化框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot日志基礎(chǔ)使用之如何設(shè)置日志級別
這篇文章主要介紹了Spring?Boot日志基礎(chǔ)使用設(shè)置日志級別的方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
Java搭建一個springboot3.4.1項(xiàng)目?JDK21的詳細(xì)過程
這篇文章詳細(xì)介紹了如何使用IntelliJ IDEA搭建一個基于Spring Boot 3.4.1的項(xiàng)目,并使用JDK 21和Maven 3.6.3,涵蓋了環(huán)境準(zhǔn)備、項(xiàng)目創(chuàng)建、依賴管理、Maven配置、以及解決常見問題的步驟,感興趣的朋友跟隨小編一起看看吧2025-01-01
Java中的MapStruct知識點(diǎn)總結(jié)
這篇文章主要介紹了Java中的MapStruct知識點(diǎn)總結(jié),MapStruct是一個Java注解處理器,用于生成類型安全的映射代碼,它可以自動處理源對象和目標(biāo)對象之間的映射,減少了手動編寫重復(fù)的映射代碼的工作量,需要的朋友可以參考下2023-10-10
基于Java實(shí)現(xiàn)緩存Cache的深入分析
本篇文章是對Java實(shí)現(xiàn)緩存Cache進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
java8中的Collectors.groupingBy用法詳解
這篇文章主要介紹了java8中的Collectors.groupingBy用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

