java—MyBatis框架

簡介

什么是 MyBatis?
MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。

以上內容摘自于MyBatis中文官網:MyBatis中文官網

歷史

mybatis原本是apache的一個開源項目ibatis, 2010遷移至谷歌, 改名為 Mybatis, 版本升級為3.0

特點

①Mybatis 是一款優秀的持久層框架
②Mybatis 對 jdbc 進行封裝, 簡化了操作
③Mybatis 使用 xml 或注解方式, 將數據庫記錄映射到 java 對象中,
④是一種 orm(Object Relational Mapping 對象關系映射) 實現
⑤它支持動態 SQL 以及數據緩存

搭建

????????1.先在數據庫創建一張表,在創建一個 maven 項目,創建一個實體類(應該于數據庫中的表對應)
????????2.導入 MyBatis 和 mysql 的 jar 包,創建 MyBatis 核心配置文件

其中步驟 2 為使用MyBatis框架所要用到的操作

mysql相關操作

-- 創建數據庫 ssmdb
CREATE DATABASE ssmdb CHARSET utf8-- 創建表
-- 管理員表
CREATE TABLE admin(id INT PRIMARY KEY AUTO_INCREMENT,account VARCHAR(12) UNIQUE NOT NULL,`password` VARCHAR(32) NOT NULL,`name` VARCHAR(20) NOT NULL,gender CHAR(1)
)-- 添加測試用例
INSERT INTO admin (account, `password`, `name`, gender)
VALUES
('000000', '000000', 'JSON', '男'),
('000001', '000000', '張三', '男')-- 查詢 admin 表中所有數據
SELECT * FROM admin

項目選擇

創建Admin類

package com.flash.mybatis.model;/*** @author flash* @date 2024/06/01 14:34* 功能描述:Admin類*/
public class Admin {private int id;private String name;private String account;private String password;private char gender;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 getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}@Overridepublic String toString() {return "Admin{" +"id=" + id +", name='" + name + '\'' +", account='" + account + '\'' +", password='" + password + '\'' +", gender=" + gender +'}';}
}

其中get, set方法不可缺, 底層會使用到

導入 MyBatis 和 mysql 的jar包

所需依賴,在 pom.xml 文件中完成配置即可

<dependencies><!-- MyBtais --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.2</version></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency>
</dependencies>

創建 MyBatis 核心配置文件

在resources目錄中創建一個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><settings><!-- 打印日志,添加此設置,會在運行時打印出此次操作的日志 --><setting name="logImpl" value="STDOUT_LOGGING"/></settings><typeAliases><!-- 指定到某一個目錄下,如果沒有此配置,需要在配置sql管理文件時,填入完整的類地址,
如:com.flash.mybatis.model.Admin --><package name="com.flash.mybatis.model"/></typeAliases><environments default="development"><environment id="development"><!-- 事物管理方式:就是一次對數據庫操作過程中, 執行多條sql的管理轉賬:從A賬戶向B賬戶轉錢A-500代碼, 異常B+500把所有的操作都成功執行后, 再提交事務, 讓數據庫最終執行本次提交的所有sql--><transactionManager type="JDBC"/><!-- 使用jdbc事務管理 --><!-- 數據庫鏈接池配置頻繁的創建與校徽數據庫的連接對象比較浪費時間,可以在池子中默認創建若干個連接對象, 有請求使用時, 直接從連接池中取出一個對象,用完還回去但不銷毀, 減少了創建和銷毀的時間開銷如果連接個數不夠用時仍然需要創建連接對象,數據庫連接池中有一個下限和一個上線,默認最多為10,最少為5個--><dataSource type="POOLED"><!-- 數據庫鏈接 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 配置SQL管理文件 --><mappers><mapper resource="mappers/AdminMapper.xml"/></mappers>
</configuration>

創建與數據庫交互所需的接口

package com.flash.mybatis.dao;import com.flash.mybatis.model.Admin;import java.util.List;// 定義功能
public interface AdminDao {/*根據id查詢管理員對象*/Admin findAdminById(int id);List<Admin> findAdmins();int addAdmin(Admin admin);
}

創建xml文件管理sql

如圖所示


該文件內容如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.jorg//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.flash.mybatis.dao.AdminDao"><insert id="addAdmin" parameterType="Admin">INSERT INTO admin (account, `password`, `name`, gender)VALUE(#{account}, #{password}, #{name}, #{gender})</insert><!--id必須與方法名一致parameterType 接口中定義的方法所需要的參數類型resultType    查詢結果返回類型#{account}    相當于調用 Admin 對象的 account 變量--><select id="findAdminById" parameterType="int" resultType="Admin">select * from admin where id = #{id}</select><select id="findAdmins" resultType="Admin">select * from admin</select>
</mapper>

測試類

package com.flash.mybatis.test;import com.flash.mybatis.dao.AdminDao;
import com.flash.mybatis.model.Admin;
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.Reader;
import java.util.List;/*** @author flash* @date 2024/06/01 17:35* 功能描述:測試類*/
public class Test {public static void main(String[] args) throws IOException {// 讀入 mybatis 核心配置文件Reader reader = Resources.getResourceAsReader("mybatis.xml");// 創建 SqlSessionFactory 對象// sqlSessionFactory 是用來創建 sqlSession的, 由于 sqlSessionFactory 對象創建的開銷較大,// 所以一個項目只創建一個 sqlSessionFactory 對象, 不用關閉SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 創建SqlSession對象// sqlSession 對象與數據庫交互的, 每次與數據庫交互, 都需要一個新的連接對象// 用完關閉即可SqlSession sqlSession = sqlSessionFactory.openSession();// 為接口創建一個代理對象// 由代理對象調用接口中對應的方法AdminDao adminDao = sqlSession.getMapper(AdminDao.class);Admin admin = adminDao.findAdminById(1);System.out.println(admin);List<Admin> admins = adminDao.findAdmins();for (Admin admin1 : admins) {System.out.println(admin1);}admin = new Admin();admin.setAccount("000002");admin.setPassword("000000");admin.setName("李四");admin.setGender('女');System.out.println("count = " + adminDao.addAdmin(admin));sqlSession.commit();// 提交數據庫事物, 事物只針對 增刪改, 查詢不需要提交事務// 關閉與數據庫的會話對象sqlSession.close();}
}

sqlSession.commit();特別說明

????????如果對數據庫進行查詢操作,那么對數據庫不會產生任何影響。如果是增刪改操作,會對數據庫中的數據進行一定改動。

????????試想一種場景:A 給 B 轉賬 200 元,我們需要對數據庫執行兩部操作,A 中減去 200,B中增加 200,如果 兩步中如有一步發生錯誤那么都會產生數據錯誤。解決方法,A 給 B 轉賬 200 元作為事件,java代碼執行無誤,將整個事件提交再來完成轉賬的操作,如果某一步發生錯誤將不會執行對應的sql語句。

? ? ? ? 總結:由于查詢操作不會對數據庫數據產生影響,直接查詢即可,不需要提交;如果是增刪改操作,則需要將事務提交后參會執行對應的sql語句

簡化測試

上面提到有些對象之需要創建一次, 那么我們就可以把他裝入到一個工具類中來讓我們每一次使用時直接調用即可, 但是由于要創建一個對象, 所以將他設置為靜態對象, 并在static靜態代碼塊中完成初始化, 見代碼:

工具類:

package com.flash.mybatis.util;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.Reader;/*** @author flash* @date 2024/06/01 17:32* 功能描述:*/
public class MybatisUtil {private static Reader reader;public static SqlSessionFactory sqlSessionFactory;static {// 讀入 mybatis 核心配置文件try {reader = Resources.getResourceAsReader("mybatis.xml");} catch (IOException e) {e.printStackTrace();}// 創建 SqlSessionFactory 對象sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);}
}

測試類:

package com.flash.mybatis.test;import com.flash.mybatis.dao.AdminDao;
import com.flash.mybatis.model.Admin;
import com.flash.mybatis.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;
import java.util.List;/*** @author flash* @date 2024/06/01 15:23* 功能描述:將一些重復的代碼封裝后使用的案例*/
public class Test2 {public static void main(String[] args) throws IOException {SqlSession sqlSession = MybatisUtil.sqlSessionFactory.openSession();// 為接口創建一個代理對象// 由代理對象調用接口中對應的方法AdminDao adminDao = sqlSession.getMapper(AdminDao.class);Admin admin = adminDao.findAdminById(1);System.out.println(admin);List<Admin> admins = adminDao.findAdmins();for (Admin admin1 : admins) {System.out.println(admin1);}admin = new Admin();admin.setAccount("000002");admin.setPassword("000000");admin.setName("李四");admin.setGender('女');adminDao.addAdmin(admin);sqlSession.commit();// 提交數據庫事物, 事物只針對 增刪改, 查詢不需要提交事務// 關閉與數據庫的會話對象sqlSession.close();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20919.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20919.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20919.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件公司為什么必須要使用低代碼系統?

在當今軟件行業全國比較內卷的大環境下&#xff0c;軟件公司面臨著前所未有的挑戰。為了在這個競爭激烈的市場中生存并脫穎而出&#xff0c;馳騁低代碼設計者認為&#xff0c;軟件公司必須要使用低代碼系統。以下是幾個關鍵的原因&#xff1a; 時代發展的必然選擇 低代碼系統是…

領導力中的說服藝術

本文主要介紹了亞里士多德修辭三角理論&#xff0c;即演講者在說服聽眾時如何運用品格&#xff08;Ethos&#xff09;、情感&#xff08;Pathos&#xff09;和邏輯&#xff08;Logos&#xff09;三種基本的修辭手法。原文: The Art of Persuasion in Leadership 亞里士多德的說…

Kubernetes面試題分享

目錄 前言 1.Kubernetes的控制平面包括哪些核心組件&#xff1f;它們各自的作用是什么&#xff1f; 2.Kubernetes的數據平面涉及哪些組件&#xff1f;它們如何協作&#xff1f; 3.什么是Pod&#xff1f;為什么它是Kubernetes的基本單元&#xff1f; 4.Service如何實現服務…

【自動駕駛技術】自動駕駛汽車AI芯片匯總——地平線篇

0. 前言 按照國際慣例&#xff0c;首先聲明&#xff1a;本文只是我自己學習的理解&#xff0c;雖然參考了他人的寶貴見解及成果&#xff0c;但是內容可能存在不準確的地方。如果發現文中錯誤&#xff0c;希望批評指正&#xff0c;共同進步。 本篇文章是這個系列的第二篇&#x…

[AIGC] DAG任務調度的概述與實踐

DAG(Directed Acyclic Graph&#xff0c;有向無環圖)作為任務調度的基礎模型&#xff0c;在大規模數據處理和計算過程中有著廣泛的應用。本文將對DAG模型的原理進行解釋并列出一些常用的任務調度工具。 文章目錄 一、什么是DAG&#xff1f;二、DAG任務調度的原理三、常用的DAG任…

50個常用的Docker命令及如何使用

這里整理了50個常用的Docker命令以及每個命令的使用方法。 docker version:顯示Docker版本信息。 示例:docker version docker info:顯示Docker系統信息。 示例:docker info docker pull <image>:從Docker Hub下載鏡像。 示例:docker pull ubuntu docker run <i…

spring xml配置文件中的bean標簽屬性

概述 在Spring框架中&#xff0c; 標簽用于定義和配置 Spring 容器管理的對象&#xff08;即 bean&#xff09;。 標簽有許多屬性&#xff0c;每個屬性都用來配置 bean 的特定方面。下面是一些主要屬性及其默認值的詳細說明。 屬性 1 id 說明: 用于標識 bean 的唯一標識符。…

一文帶你了解python

一文帶你了解python 簡單介紹 python是腳本語言,不需要在使用變量前進行聲明,代碼不需要編譯,由解釋器來解釋執行。python簡潔的語法可以讓你寫出比靜態語言更短的程序。使用交互式解釋器時,會自動打印輸入的一些包含值的東西;在非交互式的程序中,需要使用print函數打印…

Python獲取文件MD5值方法

Python的標準庫中提供了一個名為hashlib的模塊&#xff0c;可以用來生成MD5值。 下面是兩個方法的實現&#xff1a; 1. 通過文件路徑獲取MD5值&#xff1a; import hashlibdef calculate_md5_file(file_path):md5 hashlib.md5()with open(file_path, "rb") as f:…

啟發式算法教程(個人總結版)

1. 引言 1.1 什么是啟發式算法 啟發式算法是一類用于尋找復雜優化問題近似解的方法&#xff0c;特別適用于在計算資源有限的情況下求解大型問題。與精確算法不同&#xff0c;啟發式算法不保證找到全局最優解&#xff0c;但能在可接受的時間內提供一個質量較高的解。 1.2 啟發…

CMake編譯安裝、生成可執行程序、生成靜態動態庫以及靜態動態庫的鏈接

1 CMake介紹 CMake是一個開源的、跨平臺的構建系統&#xff0c;用于管理軟件從源代碼到可執行文件的整個構建過程。它最初由Kitware公司為ITK&#xff08;Insight Segmentation and Registration Toolkit&#xff09;和VTK&#xff08;Visualization Toolkit&#xff09;等開源…

在Linux kali下載、安裝Perl環境

目錄 Perl介紹 下載安裝 官網下載 在Windows安裝 在Linux和Mac OS安裝 Perl介紹 Perl一種功能豐富的計算機程序語言&#xff0c;運行在超過100種計算機平臺上&#xff0c;適用廣泛&#xff0c;從最初是為文本處理而開發的&#xff0c;現在用于各種任務&#xff0c;包括系統…

C語言編程數學:探索、挑戰與深度應用

C語言編程數學&#xff1a;探索、挑戰與深度應用 C語言&#xff0c;作為計算機編程的基石之一&#xff0c;不僅廣泛應用于系統級編程&#xff0c;還在數學計算領域發揮著重要作用。本文將圍繞C語言在數學編程中的四個方面、五個方面、六個方面和七個方面展開探討&#xff0c;帶…

面試官:Spring中都應用了哪些設計模式?

設計模式是我們項目中經常會涉及到的項目進行重構、解構時的一種方法。 比如我們常見的單例模式、工廠模式、策略模式、裝飾器模式等都是比較常用的&#xff1b;關于 23 種設計模式&#xff0c;大家可以找本書專門去學習一下&#xff0c;在 Java 框架的源碼中也不例外&#xf…

SRE養成計劃之01-基本命令(持續更新)

基本命令&#xff08;續&#xff09; 軟連接 軟連接 --> 原始文檔 --> 文檔數據格式&#xff1a;ln -s 原始文件或目錄 軟連接文件若原始文件或目錄被刪除&#xff0c;鏈接文件將失效軟連接可存放在不同分分區/文件系統 硬鏈接 硬鏈接 --> 文檔數據格式&#xff1…

如何用python做一個用戶登錄界面——潯川python社

1 需解決的問題&#xff1a; 1.1如何用python做一個用戶登錄界面&#xff1f; 1.2需要用到哪些庫、模塊&#xff1f; 2 問題解決&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;無標準回答。 2.2 回答 1.2 &#xff1a;tk庫&#xff08;縮寫&#xff09;、GUL界面…

C++20實戰之channel

C20實戰之channel 繼前面兩節的直播&#xff0c;講解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法與底層實現&#xff0c;那么如何基于這些知識實現一個小項目呢&#xff1f; 于是引出了這篇&#xff0c;寫一個channel出來。 注&#xff1a…

【算法】快速冪

算法-快速冪 前置知識 倍增 思路 我們要求 a n a^n an。 簡單的方法是 a n a n ? 1 ? a a^na^{n-1}\cdot a anan?1?a 但是我們不妨使用倍增的思想 若 2 ∣ n 2\mid n 2∣n&#xff0c;則 a n a n 2 2 a^n{a^{\frac n 2}}^2 ana2n?2 若 2 ? n 2\nmid n 2?n&…

【AI】設計師人人必備的Ai課程,AIGC實戰教學

課程介紹 專為設計師定制的AI繪畫視覺課程&#xff0c;包含排版、插畫、海報和動漫等。共43節課程&#xff0c;2.06G視頻&#xff0c;教授AI應用技巧&#xff0c;提高設計效率和質量。內容涵蓋詞生圖方法、AI風格設計等&#xff0c;幫助學員在設計領域取得成就。 1_01-ai課程…

Flutter 中的 SliverPersistentHeader 小部件:全面指南

Flutter 中的 SliverPersistentHeader 小部件&#xff1a;全面指南 Flutter 是一個功能強大的 UI 工具集&#xff0c;用于創建美觀、高性能的移動和 web 應用。在 Flutter 的滾動組件中&#xff0c;SliverPersistentHeader 是一個特殊的組件&#xff0c;它用于在 CustomScroll…