MyBatis 基础CRUD全套实战学习笔记

前言

MyBatis 是后端开发主流持久层框架,用来简化 JDBC 数据库操作,不用手写繁琐的连接、释放资源代码。本文按课程分段完整梳理 MyBatis 基础增删改查全套操作,从环境搭建到条件查询全覆盖,适合零基础入门复习。

一、Day09-01 MyBatis 基础操作 - 环境准备

1. 核心步骤

  1. Maven 依赖导入 导入 MyBatis 核心包、对应数据库驱动(MySQL8.x)、单元测试 JUnit 依赖。

    org.mybatis mybatis 3.5.9 mysql mysql-connector-java 8.0.30
  2. 创建数据库与实体类 设计业务数据表(示例员工表emp),编写对应实体类Emp,属性与表字段一一对应,提供 get/set、无参构造。

  3. 编写 MyBatis 全局核心配置文件 mybatis-config.xml 配置数据库连接环境、开启日志打印(方便查看执行 SQL)、注册 Mapper 映射文件 / 注解 Mapper 接口。

  4. Mapper 两种开发方式二选一

  • XML 映射文件方式:EmpMapper.xml,编写 SQL 语句

  • 注解开发方式:@Select/@Insert/@Update/@Delete直接写在 Mapper 接口方法上

  1. 测试环境校验 通过SqlSessionFactory获取SqlSession,加载配置文件,验证数据库连通性。

学习重点

环境搭建是所有操作的基础,配置文件路径、数据库账号密码、Mapper 注册位置出错会直接报找不到 SQL、连接失败等异常。

二、Day09-02 MyBatis 基础操作 - 删除(基础删除)

1. 业务场景

根据主键 ID 删除单条数据。

2. 两种实现方式

方式 1:XML 映射
复制代码
<delete id="deleteById">
    delete from emp where id = #{id}
</delete>
方式 2:注解开发
复制代码
@Delete("delete from emp where id = #{id}")
void deleteById(Integer id);

3. 测试调用

复制代码
SqlSession sqlSession = factory.openSession(true); // true自动提交事务
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
mapper.deleteById(1);

坑点提醒

MyBatis 默认关闭自动提交,若openSession()不传 true,删除后必须手动sqlSession.commit(),否则数据库无变化。

三、Day09-03 MyBatis 基础操作 - 删除(预编译 SQL)

1. 什么是预编译 SQL

#{变量}底层会生成?占位符,JDBC 预编译语句PreparedStatement从根源防止 SQL 注入 。 对比危险拼接${id}:直接字符串拼接,存在注入漏洞,删除、新增、更新、查询优先使用#{}

2. 实战演示

  • 错误写法(拼接,注入风险):delete from emp where id = ${id}

  • 标准安全写法(预编译):delete from emp where id = #{id}

核心知识点

预编译是 MyBatis 安全核心特性,所有传参场景统一使用#{参数名},仅动态表名、排序字段才不得已使用${}

四、Day09-04 MyBatis 基础操作 - 新增

1. 新增单条数据基础语法

XML
复制代码
<insert id="insertEmp">
    insert into emp(name,gender,entrydate,update_time)
    values(#{name},#{gender},#{entrydate},#{updateTime})
</insert>
注解
复制代码
@Insert("insert into emp(name,gender,entrydate,update_time) values(#{name},#{gender},#{entrydate},#{updateTime})")
void insert(Emp emp);

2. 参数传递规则

传入实体类对象时,#{}内直接写实体类属性名,MyBatis 自动通过 getter 取值。

3. 事务说明

新增属于 DML 修改语句,和删除一样,不开启自动提交时需要手动 commit。

五、Day09-05 MyBatis 基础操作 - 新增(主键返回)

业务需求

插入数据后,立刻拿到数据库自增的主键 id,用于后续关联操作。

两种实现方案

方案 1:XML 标签配置
复制代码
<insert id="insertEmp" useGeneratedKeys="true" keyProperty="id">
    insert into emp(name,gender) values(#{name},#{gender})
</insert>
  • useGeneratedKeys="true":开启获取自增主键

  • keyProperty="id":把主键赋值给入参 Emp 对象的 id 属性

方案 2:注解实现
复制代码
@Insert("insert into emp(name,gender) values(#{name},#{gender})")
@Options(useGeneratedKeys = true, keyProperty = "id")
void insert(Emp emp);

使用效果

调用 insert 方法后,传入的 Emp 对象emp.getId()就能拿到刚插入数据的主键。

六、Day09-06 MyBatis 基础操作 - 更新

1. 根据主键修改数据

XML
复制代码
<update id="updateEmp">
    update emp set name=#{name},gender=#{gender},entrydate=#{entrydate} where id=#{id}
</update>
注解
复制代码
@Update("update emp set name=#{name},gender=#{gender} where id=#{id}")
void update(Emp emp);

2. 注意点

更新必须携带唯一条件(主键 id),否则会全表更新,造成数据事故;实际开发中尽量限制更新范围。

七、Day09-07 MyBatis 基础操作 - 查询(根据 ID 查询)

1. 单条精准查询

根据主键查询单条员工,返回单个 Emp 实体对象。

复制代码
@Select("select * from emp where id = #{id}")
Emp getById(Integer id);

2. 自动封装原理

MyBatis 查询结果集 ResultSet,会自动匹配列名与实体类属性:

  1. 字段名和属性名完全一致直接映射;

  2. 下划线命名(update_time)与驼峰命名(updateTime),可在全局配置开启驼峰自动转换。

3. 返回值说明

  • 确定只查 1 条数据:返回Emp对象

  • 不确定条数:使用集合List<Emp>接收,避免无数据时报空指针。

八、Day09-08 MyBatis 基础操作 - 查询(条件查询)

1. 多条件固定查询(本文开篇示例代码对应知识点)

需求:查询姓名含 "张"、性别 1、入职时间 2010-2020 之间的员工,按更新时间倒序。

注解完整示例
复制代码
//条件查询员工
@Select("select * from emp where name like '%张%' and gender = 1 and " +
        "entrydate between '2010-01-01' and '2020-01-01' order by update_time desc ")
List<Emp> list();

2. 核心 SQL 语法讲解

  1. like '%张%':模糊匹配,包含 "张" 的姓名;

  2. and:多条件同时满足;

  3. between A and B:区间筛选,包含起止日期;

  4. order by 字段 desc:倒序排序,最新数据在前。

3. 拓展动态条件(进阶)

硬编码条件灵活性差,真实开发会使用#{参数}动态传参,结合 MyBatis 动态 SQL 标签<if>实现可选条件查询。

4. 返回值

多条件查询会返回多条数据,统一使用List<Emp>集合接收。

九、Day09 整体学习总结

  1. 操作顺序逻辑:环境准备 → 删 / 增 / 改(DML,需要事务提交) → 查询(DQL,无需事务);

  2. 核心语法统一规范

    1. 传参全部使用#{}预编译,防 SQL 注入;

    2. 增删改必须注意事务提交;

    3. 新增自增主键通过useGeneratedKeys回写;

  3. 两种开发模式对比

    1. 注解开发:简单 CRUD 简洁直观,适合小型项目;

    2. XML 文件:复杂多条件动态 SQL 可读性更强,企业大型项目主流;

  4. 高频踩坑汇总

    1. 忘记提交事务,新增 / 删除 / 更新不生效;

    2. 实体类属性名和数据库字段不匹配,查询字段为 null;

    3. 混淆#{}${},引发 SQL 注入安全问题;

    4. 条件查询返回单对象,多条数据抛出转换异常,统一用 List 接收。

相关推荐
Flandern11117 小时前
从“能跑”到“可运营”:Agent Harness 工程化建设指南
学习·agent·claudecode·harness
hj2862517 小时前
Shell 脚本完整学习笔记
chrome·笔记·学习
智者知已应修善业7 小时前
【proteus交通灯故障检测的完善方案】2025-4-29
经验分享·笔记·单片机·嵌入式硬件·proteus
码片向量8 小时前
状态空间模型SSM学习笔记
笔记·学习·ssm·语音增强·状态空间
luoyayun3618 小时前
【音频基础学习】第 5 天,理解音量、增益和分贝
学习·音视频·音频基础学习
万亿少女的梦1688 小时前
基于微信小程序、Spring Boot与Vue3的智慧养老管理系统设计与实现
spring boot·redis·微信小程序·mybatis·vue3
万岳科技系统开发9 小时前
智慧医院小程序开发满足医疗机构多场景服务需求
数据库·学习·小程序
笑鸿的学习笔记9 小时前
C++笔记之内存映射、零拷贝与共享内存(学习三)-操作系统术语概念图
笔记·学习
既然如此,那就开摆9 小时前
ULIP总结
笔记·学习