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

📅 2026/7/18 20:24:09 👁️ 阅读次数 📝 编程学习
MyBatis 基础CRUD全套实战学习笔记

前言

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

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

1. 核心步骤

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

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

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

  3. 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 接收。