什么是 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; //IDprivate String username; //用户名private String password; //密码private String name; //姓名private Short gender; //性别 , 1 男, 2 女private String image; //图像urlprivate Short job; //职位 , 1 班主任 , 2 讲师 , 3 学工主管 , 4 教研主管 , 5 咨询师private LocalDate entrydate; //入职日期private Integer deptId; //部门IDprivate 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 mapperPUBLIC "-//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 desclimit #{start},#{pageSize}</select><delete id="delete">deletefrom empwhere 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>:创建变量并在当前上下文使用