Mybatis使用簡述
什么是 MyBatis?
MyBatis 是一款優秀的 Java 持久層框架,它通過 XML 或注解的方式將 Java 對象與數據庫中的記錄進行映射。與傳統的 JDBC 相比,MyBatis 極大地簡化了數據庫操作代碼,讓開發者能夠更專注于業務邏輯而不是繁瑣的數據訪問細節。
MyBatis 的核心特點:
簡化了 JDBC 的復雜操作
支持動態 SQL,能夠根據條件靈活構建查詢語句
提供了強大的映射機制,支持復雜的對象關系映射
與 Spring 等主流框架無縫集成
學習曲線平緩,配置靈活
為什么選擇 MyBatis?
與其它持久層框架的對比
相比于 Hibernate 這樣的全自動 ORM 框架,MyBatis 提供了更多的靈活性。MyBatis 允許你直接編寫原生 SQL,這在處理復雜查詢或需要優化 SQL 性能時具有明顯優勢。
主要優勢:
靈活性:可以編寫原生 SQL,靈活控制查詢邏輯
性能優化:直接控制 SQL 語句,便于性能調優
簡化開發:減少了大量 JDBC 模板代碼
易于學習:學習曲線平緩,上手快速
與 Spring 集成良好:可以無縫集成到 Spring 框架中
環境搭建
創建springboot項目

導入mybatis起步依賴、mysql驅動及其他需求(首次使用下載時間會較長)

連接數據源


建立數據庫
范例代碼:
-- 創建數據庫 CREATE DATABASE IF NOT EXISTS demo; USE demo; -- 創建員工表 CREATE TABLE employees ( id INT PRIMARY KEY AUTO_INCREMENT, employee_id VARCHAR(20) UNIQUE NOT NULL, name VARCHAR(50) NOT NULL, gender ENUM('男', '女') NOT NULL, age INT, department VARCHAR(50) NOT NULL, position VARCHAR(50) NOT NULL, salary DECIMAL(10,2), hire_date DATE NOT NULL, email VARCHAR(100), phone VARCHAR(20), address VARCHAR(200), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 插入示例數據 INSERT INTO employees (employee_id, name, gender, age, department, position, salary, hire_date, email, phone, address) VALUES ('EMP001', '張三', '男', 28, '技術部', '軟件工程師', 15000.00, '2020-03-15', 'zhangsan@company.com', '13800138001', '北京市海淀區'), ('EMP002', '李四', '女', 32, '人力資源部', 'HR經理', 12000.00, '2018-06-20', 'lisi@company.com', '13800138002', '北京市朝陽區'), ('EMP003', '王五', '男', 35, '財務部', '財務主管', 18000.00, '2016-09-10', 'wangwu@company.com', '13800138003', '北京市西城區'), ('EMP004', '趙六', '女', 26, '市場部', '市場專員', 8000.00, '2021-01-08', 'zhaoliu@company.com', '13800138004', '北京市東城區'), ('EMP005', '錢七', '男', 30, '技術部', '高級工程師', 20000.00, '2019-11-25', 'qianqi@company.com', '13800138005', '北京市豐臺區'), ('EMP006', '孫八', '女', 29, '銷售部', '銷售經理', 16000.00, '2020-07-30', 'sunba@company.com', '13800138006', '北京市石景山區'), ('EMP007', '周九', '男', 27, '技術部', '前端開發', 13000.00, '2021-03-12', 'zhoujiu@company.com', '13800138007', '北京市通州區'), ('EMP008', '吳十', '女', 33, '行政部', '行政主管', 11000.00, '2017-05-18', 'wushi@company.com', '13800138008', '北京市昌平區'), ('EMP009', '鄭十一', '男', 31, '財務部', '會計', 10000.00, '2019-08-22', 'zhengshiyi@company.com', '13800138009', '北京市大興區'), ('EMP010', '王芳', '女', 25, '市場部', '市場助理', 7000.00, '2022-02-14', 'wangfang@company.com', '13800138010', '北京市房山區');
范例效果:

若已有數據庫,則直接連接

在application.properties文件中配置數據庫連接信息:

spring.application.name=demo #驅動類名稱 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #數據庫連接的url spring.datasource.url=jdbc:mysql://localhost:3306/demo #連接數據庫的用戶名 spring.datasource.username=root #連接數據庫的密碼 spring.datasource.password=1234
實體類設計
在 MyBatis 中,實體類對應數據庫中的表結構。良好的實體類設計是使用 MyBatis 的基礎。
@Data @NoArgsConstructor @AllArgsConstructor public class Emp { private Integer id; //ID private String username; //用戶名 private String password; //密碼 private String name; //姓名 private Short gender; //性別 , 1 男, 2 女 private String image; //圖像url private Short job; //職位 , 1 班主任 , 2 講師 , 3 學工主管 , 4 教研主管 , 5 咨詢師 private LocalDate entrydate; //入職日期 private Integer deptId; //部門ID private LocalDateTime createTime; //創建時間 private LocalDateTime updateTime; //修改時間 }
Mapper 接口設計
Mapper 接口定義了數據訪問的方法,可以使用注解完成接口的實現。(例如實例代碼中“分頁查詢”“查詢數據總數”“新增員工”“根據id查詢員工信息”這些功能的實現)
@Mapper public interface EmpMapper { //分頁查詢 @Select("select * from emp limit #{start},#{pageSize}") List<Emp> page(Integer start, Integer pageSize); //條件分頁查詢 List<Emp> list(Integer start, Integer pageSize,String name, Short gender, LocalDate begin, LocalDate end); //查詢數據總數 @Select("select count(*) from emp") Long count(); //批量刪除員工 void delete(List<Integer> ids); //新增員工 @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " + "value(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})") void save(Emp emp); //根據id更新員工信息 void update(Emp emp); //根據id查詢員工信息 @Select("select * from emp where id = #{id}") Emp getById(Integer id); }
Mapper XML 映射文件
XML 映射文件是 MyBatis 的核心,它定義了 SQL 語句和結果映射。在sql語句較復雜的情況下,不建議使用注解實現mapper接口(這樣會使得代碼顯得雜亂不易閱讀),而是在XML映射文件中編寫sql語句。需要注意的是,XML映射文件的路徑名稱必須于mapper接口路徑名稱相同。(EmpMapper接口文件路徑名稱為:cn.nuist.tlias.mapper.EmpMapper,XML映射文件路徑名稱也為:cn.nuist.tlias.mapper.EmpMapper)

mapper接口中的“分頁條件查詢”“批量刪除員工信息”和“根據id更新員工信息”功能在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"> <mapper namespace="cn.nuist.tlias.mapper.EmpMapper"> <select id="list" resultType="cn.nuist.tlias.pojp.Emp"> select * from emp <where> <if test="name != null and name != ''"> name like concat('%',#{name},'%') </if> <if test="gender != null"> and gender = #{gender} </if> <if test="begin != null and end != null"> and entrydate between #{begin} and #{end} </if> </where> order by update_time desc limit #{start},#{pageSize} </select> <delete id="delete"> delete from emp where id in <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete> <update id="update"> update emp <set> <if test="username != null and username != ''"> username = #{username} </if> <if test="name != null and name != ''"> name = #{name} </if> <if test="gender != null"> gender = #{gender} </if> <if test="image != null and image != ''"> image = #{image} </if> <if test="job != null"> job = #{job} </if> <if test="entrydate != null"> entrydate = #{entrydate} </if> <if test="deptId != null"> dept_id = #{deptId} </if> <if test="updateTime != null"> update_time = #{updateTime} </if> </set> where id = #{id} </update> </mapper>
動態 SQL:靈活構建查詢
MyBatis 的強大特性之一就是動態 SQL,它允許你根據條件動態生成 SQL 語句。
<if> :根據條件包含 SQL 片段
<choose>, <when>, <otherwise>:實現類似 switch-case 的邏輯
<where>:智能處理 WHERE 條件,自動去除多余的 AND/OR
<set>:用于 UPDATE 語句,智能處理 SET 子句
<foreach>:遍歷集合,常用于 IN 條件或批量操作
<trim>:更靈活的字符串修剪功能
<bind>:創建變量并在當前上下文使用

浙公網安備 33010602011771號