簡介
什么是 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();}
}