MyBatis 基础CRUD全套实战学习笔记
前言
MyBatis 是后端开发主流持久层框架,用来简化 JDBC 数据库操作,不用手写繁琐的连接、释放资源代码。本文按课程分段完整梳理 MyBatis 基础增删改查全套操作,从环境搭建到条件查询全覆盖,适合零基础入门复习。
一、Day09-01 MyBatis 基础操作 - 环境准备
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>创建数据库与实体类设计业务数据表(示例员工表
emp),编写对应实体类Emp,属性与表字段一一对应,提供 get/set、无参构造。编写 MyBatis 全局核心配置文件
mybatis-config.xml配置数据库连接环境、开启日志打印(方便查看执行 SQL)、注册 Mapper 映射文件 / 注解 Mapper 接口。Mapper 两种开发方式二选一
XML 映射文件方式:
EmpMapper.xml,编写 SQL 语句注解开发方式:
@Select/@Insert/@Update/@Delete直接写在 Mapper 接口方法上
测试环境校验通过
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,会自动匹配列名与实体类属性:
字段名和属性名完全一致直接映射;
下划线命名(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 语法讲解
like '%张%':模糊匹配,包含 “张” 的姓名;and:多条件同时满足;between A and B:区间筛选,包含起止日期;order by 字段 desc:倒序排序,最新数据在前。
3. 拓展动态条件(进阶)
硬编码条件灵活性差,真实开发会使用#{参数}动态传参,结合 MyBatis 动态 SQL 标签<if>实现可选条件查询。
4. 返回值
多条件查询会返回多条数据,统一使用List<Emp>集合接收。
九、Day09 整体学习总结
操作顺序逻辑:环境准备 → 删 / 增 / 改(DML,需要事务提交) → 查询(DQL,无需事务);
核心语法统一规范
传参全部使用
#{}预编译,防 SQL 注入;增删改必须注意事务提交;
新增自增主键通过
useGeneratedKeys回写;
两种开发模式对比
注解开发:简单 CRUD 简洁直观,适合小型项目;
XML 文件:复杂多条件动态 SQL 可读性更强,企业大型项目主流;
高频踩坑汇总
忘记提交事务,新增 / 删除 / 更新不生效;
实体类属性名和数据库字段不匹配,查询字段为 null;
混淆
#{}与${},引发 SQL 注入安全问题;条件查询返回单对象,多条数据抛出转换异常,统一用 List 接收。
