Mybatis?Web中的數(shù)據(jù)庫操作方法舉例詳解
前言
MyBatis 是一個(gè)流行的持久層框架,主要用于簡(jiǎn)化 Java 應(yīng)用程序中對(duì)數(shù)據(jù)庫的訪問。與傳統(tǒng)的 JDBC(Java Database Connectivity)相比,MyBatis 提供了更高層次的抽象,幫助開發(fā)者更方便地進(jìn)行數(shù)據(jù)庫操作。
工作機(jī)制
MyBatis 的執(zhí)行流程是指在一個(gè)完整的數(shù)據(jù)庫操作中,MyBatis 如何從接收到用戶請(qǐng)求到最終執(zhí)行 SQL 并返回結(jié)果的整個(gè)過程。以下是 MyBatis 的典型執(zhí)行流程:
1. 加載配置文件:
- 加載主配置文件(mybatis-config.xml): MyBatis 在啟動(dòng)時(shí)會(huì)加載主配置文件,這個(gè)文件定義了數(shù)據(jù)庫連接池、事務(wù)管理器、以及其他全局設(shè)置。
- 加載映射文件(Mapper XML): 映射文件通常包括 SQL 語句及其與 Java 對(duì)象的映射關(guān)系。
2. 創(chuàng)建 SqlSessionFactory:
- MyBatis 使用配置文件中的信息創(chuàng)建
SqlSessionFactory對(duì)象。這個(gè)工廠對(duì)象是創(chuàng)建SqlSession實(shí)例的入口,每個(gè)SqlSession實(shí)例都表示一個(gè)與數(shù)據(jù)庫的會(huì)話。
3. 獲取 SqlSession:
- 使用
SqlSessionFactory來獲取SqlSession對(duì)象。SqlSession是執(zhí)行 SQL 語句的核心接口,它提供了執(zhí)行增刪改查操作的方法。
4. 獲取 Mapper 接口:
SqlSession提供了獲取 Mapper 接口實(shí)例的方法,MyBatis 會(huì)動(dòng)態(tài)生成該接口的實(shí)現(xiàn)類。Mapper 是 MyBatis 的核心組件,它將接口方法映射到具體的 SQL 語句。
5. 執(zhí)行 SQL 語句:
- 調(diào)用 Mapper 接口方法: 你可以通過調(diào)用 Mapper 接口的方法來執(zhí)行對(duì)應(yīng)的 SQL 語句。MyBatis 會(huì)根據(jù)方法簽名和參數(shù),自動(dòng)匹配并執(zhí)行相應(yīng)的 SQL。
- 參數(shù)處理: MyBatis 會(huì)將方法的參數(shù)傳遞給映射文件中定義的 SQL 語句,并對(duì)這些參數(shù)進(jìn)行必要的轉(zhuǎn)換和處理(如將對(duì)象的屬性值注入到 SQL 中)。
6. SQL 語句解析和執(zhí)行:
- 動(dòng)態(tài) SQL 解析: 如果 SQL 語句中包含動(dòng)態(tài) SQL 元素(如
<if>、<foreach>等),MyBatis 會(huì)根據(jù)實(shí)際傳入的參數(shù)對(duì) SQL 進(jìn)行動(dòng)態(tài)解析和生成。 - SQL 執(zhí)行: 生成的 SQL 語句通過 MyBatis 的底層執(zhí)行器(Executor)提交給數(shù)據(jù)庫執(zhí)行。
7. 結(jié)果映射:
- 結(jié)果集映射: 數(shù)據(jù)庫返回的結(jié)果集會(huì)被 MyBatis 自動(dòng)映射為 Java 對(duì)象。映射規(guī)則由映射文件中的
<resultMap>標(biāo)簽或注解指定,MyBatis 會(huì)根據(jù)這些配置將結(jié)果集轉(zhuǎn)換為預(yù)期的 Java 對(duì)象。 - 結(jié)果處理: MyBatis 會(huì)將映射后的 Java 對(duì)象返回給調(diào)用者,通常是一個(gè) POJO(Plain Old Java Object)或集合。
8. 事務(wù)管理:
- MyBatis 支持事務(wù)管理,
SqlSession提供了手動(dòng)提交和回滾事務(wù)的方法。在SqlSession關(guān)閉前,開發(fā)者可以選擇提交或回滾事務(wù)。
9. 關(guān)閉 SqlSession:
- 在操作完成后,必須關(guān)閉
SqlSession,以釋放數(shù)據(jù)庫連接等資源。通常情況下,SqlSession是在try-finally代碼塊中使用,以確保在異常發(fā)生時(shí)資源能夠被正確釋放。
10. 返回結(jié)果:
- 最終,
SqlSession返回結(jié)果給調(diào)用者,調(diào)用者可以直接使用這些映射后的 Java 對(duì)象。
總結(jié)來說,MyBatis 的執(zhí)行流程是從加載配置文件到生成 SQL、執(zhí)行 SQL,再到結(jié)果映射的一個(gè)完整過程。每一步都有相應(yīng)的組件和機(jī)制來保證 SQL 的正確執(zhí)行和結(jié)果的準(zhǔn)確返回。
與JDBC對(duì)比
相比于傳統(tǒng)的 JDBC,MyBatis 增加了豐富的功能,使得數(shù)據(jù)庫操作更加簡(jiǎn)潔、靈活且易于維護(hù)。它將大量繁瑣的手動(dòng)編碼工作自動(dòng)化,并且提供了強(qiáng)大的配置、擴(kuò)展和管理能力,極大地提高了開發(fā)效率和代碼質(zhì)量。
- 自動(dòng)對(duì)象映射
- 對(duì)象關(guān)系映射(ORM): MyBatis 能夠自動(dòng)將 SQL 查詢結(jié)果映射為 Java 對(duì)象,或者將 Java 對(duì)象的屬性映射為 SQL 參數(shù)。這避免了在 JDBC 中手動(dòng)處理結(jié)果集(ResultSet)和對(duì)象之間的映射。
- ResultMap 配置: 通過 ResultMap,MyBatis 提供了強(qiáng)大的映射配置,允許你精確地定義數(shù)據(jù)庫字段與 Java 對(duì)象屬性之間的關(guān)系。
- SQL 語句管理
- SQL 分離: 在 MyBatis 中,SQL 語句通常被寫在 XML 文件或注解中,這樣可以將 SQL 語句與 Java 代碼分離,避免了在代碼中嵌入大量的 SQL 字符串,使代碼更加清晰和易于維護(hù)。
- 動(dòng)態(tài) SQL: MyBatis 提供了動(dòng)態(tài) SQL 功能,允許你根據(jù)條件動(dòng)態(tài)生成 SQL 語句。這比在 JDBC 中手動(dòng)拼接 SQL 字符串更安全、更靈活,尤其在處理復(fù)雜查詢時(shí)非常有用。
- 簡(jiǎn)化的數(shù)據(jù)庫操作
- 簡(jiǎn)化 CRUD 操作: MyBatis 提供了非常簡(jiǎn)潔的 API 來執(zhí)行常見的數(shù)據(jù)庫操作(增刪改查)。例如,你只需要調(diào)用一個(gè) Mapper 方法就能執(zhí)行對(duì)應(yīng)的 SQL 操作,而不必像 JDBC 那樣手動(dòng)編寫大量的代碼來執(zhí)行這些操作。
- 批量操作支持: MyBatis 對(duì)批量插入、更新、刪除提供了很好的支持,這在 JDBC 中通常需要額外處理。
- 配置與管理
- 配置管理: MyBatis 通過 XML 或注解的方式集中管理 SQL 語句、數(shù)據(jù)庫連接信息等配置,使得配置更加集中化、規(guī)范化。
- 事務(wù)管理: MyBatis 提供了內(nèi)置的事務(wù)管理功能,能夠更方便地控制事務(wù)的提交和回滾,而不需要在每個(gè)數(shù)據(jù)庫操作中手動(dòng)管理事務(wù)。
- 插件機(jī)制
- 插件擴(kuò)展: MyBatis 提供了插件機(jī)制,允許開發(fā)者在執(zhí)行 SQL 語句的各個(gè)階段(如執(zhí)行前、執(zhí)行后、結(jié)果處理等)插入自定義邏輯。這使得你可以輕松地?cái)U(kuò)展 MyBatis 的功能,比如實(shí)現(xiàn)自定義的日志記錄、性能監(jiān)控等。
- 支持注解
- 注解支持: 除了 XML 配置,MyBatis 還支持使用 Java 注解來定義 SQL 語句和映射關(guān)系,這使得配置更加靈活,減少了 XML 的使用。
- 靈活的查詢和緩存機(jī)制
- 嵌套查詢與關(guān)聯(lián)查詢: MyBatis 支持嵌套查詢和關(guān)聯(lián)查詢,能夠處理復(fù)雜的數(shù)據(jù)關(guān)系,并將結(jié)果集映射到嵌套的 Java 對(duì)象中。
- 二級(jí)緩存: MyBatis 提供了二級(jí)緩存機(jī)制,允許你在同一個(gè) SqlSession 中緩存查詢結(jié)果,提高應(yīng)用性能。
- 更好的錯(cuò)誤處理
- 錯(cuò)誤處理: MyBatis 提供了更好的錯(cuò)誤處理機(jī)制,包括詳細(xì)的錯(cuò)誤日志和異常處理能力,能夠幫助開發(fā)者快速定位和解決問題。而在 JDBC 中,錯(cuò)誤信息通常較為粗糙,調(diào)試較為困難。
- 易于與其他框架集成
- Spring 集成: MyBatis 與 Spring 框架無縫集成,能夠利用 Spring 的事務(wù)管理和依賴注入功能,簡(jiǎn)化應(yīng)用程序的開發(fā)。
三個(gè)顯著特點(diǎn)
SQL映射動(dòng)態(tài)SQL對(duì)象關(guān)系映射(ORM)支持
我們將用一個(gè)簡(jiǎn)單的代碼演示,來理解這三個(gè)特點(diǎn)
以下是一個(gè)簡(jiǎn)單的示例,展示了MyBatis的基本用法和特點(diǎn),包括SQL映射、動(dòng)態(tài)SQL以及對(duì)象關(guān)系映射。
代碼示例
1. 配置MyBatis
首先,你需要一個(gè)MyBatis的配置文件(mybatis-config.xml),來配置數(shù)據(jù)庫連接和其他參數(shù)。
<?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/mybatis_demo"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
2. 創(chuàng)建數(shù)據(jù)庫表
創(chuàng)建一個(gè)簡(jiǎn)單的用戶表作為示例。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(50)
);
3. 創(chuàng)建POJO類
定義一個(gè)與數(shù)據(jù)庫表對(duì)應(yīng)的Java類User。
public class User {
private int id;
private String name;
private String email;
// Getters and Setters
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 getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
4. 編寫Mapper接口
MyBatis中Mapper接口用于定義與數(shù)據(jù)庫操作相關(guān)的方法。
public interface UserMapper {
User getUserById(int id);
List<User> getAllUsers();
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
5. 編寫SQL映射文件
UserMapper.xml用于定義SQL語句并將它們映射到Mapper接口的方法上。
<?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="UserMapper">
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
<select id="getAllUsers" resultType="User">
SELECT * FROM users
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<update id="updateUser" parameterType="User">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
<delete id="deleteUser">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
6. 使用MyBatis進(jìn)行數(shù)據(jù)庫操作
編寫主程序來演示如何使用MyBatis執(zhí)行數(shù)據(jù)庫操作。
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.util.List;
public class MyBatisExample {
public static void main(String[] args) throws IOException {
// 1. 讀取MyBatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2. 獲取SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
// 3. 插入新用戶
User newUser = new User();
newUser.setName("John Doe");
newUser.setEmail("john.doe@example.com");
mapper.insertUser(newUser);
session.commit(); // 提交事務(wù)
// 4. 查詢所有用戶
List<User> users = mapper.getAllUsers();
users.forEach(user -> System.out.println(user.getName() + ": " + user.getEmail()));
// 5. 更新用戶
User existingUser = users.get(0);
existingUser.setName("Jane Doe");
mapper.updateUser(existingUser);
session.commit();
// 6. 刪除用戶
mapper.deleteUser(existingUser.getId());
session.commit();
}
}
}
解釋:
- SQL 映射: SQL語句直接寫在XML文件中,并通過Mapper接口映射到方法上。
- 對(duì)象關(guān)系映射:
User對(duì)象與數(shù)據(jù)庫中的記錄相對(duì)應(yīng),MyBatis自動(dòng)將查詢結(jié)果映射為User對(duì)象。 - 動(dòng)態(tài)SQL: 在復(fù)雜查詢中可以使用動(dòng)態(tài)SQL標(biāo)簽(未在此示例中展示),比如
<if>、<foreach>等。
到此這篇關(guān)于Mybatis Web中數(shù)據(jù)庫操作方法的文章就介紹到這了,更多相關(guān)Mybatis Web數(shù)據(jù)庫操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java算法之時(shí)間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算
這篇文章主要介紹了Java算法之時(shí)間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05
swagger2隱藏在API文檔顯示某些參數(shù)的操作
這篇文章主要介紹了swagger2隱藏在API文檔顯示某些參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot中服務(wù)消費(fèi)的實(shí)現(xiàn)
本文主要介紹了SpringBoot中服務(wù)消費(fèi)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Java實(shí)現(xiàn)開箱即用的redis分布式鎖
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)開箱即用的基于redis的分布式鎖,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以收藏一下2022-12-12
手把手教你如何用JAVA連接MYSQL(mysql-connector-j-8.0.32.jar)
這篇文章主要介紹了關(guān)于如何用JAVA連接MYSQL(mysql-connector-j-8.0.32.jar)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01

