news 2026/7/18 20:19:47

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 接收。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/18 20:19:24

AI_Coding: Hooks

1. 一句话理解 Hooks Codex Hooks 是插入到 Codex 生命周期中的脚本回调机制&#xff1a;当会话开始、用户提交提示词、工具执行前后、申请权限、上下文压缩或任务准备结束时&#xff0c;Codex 可以自动执行指定脚本。 Hooks 更适合做“必须执行的机械动作”&#xff0c;例如…

作者头像 李华
网站建设 2026/7/18 20:17:34

2026新款爆款蓝牙耳机怎么选不踩坑?五款在售机型实测对比

每年618和双十一前后&#xff0c;总有人问我"200块以内有没有靠谱的降噪耳机"。说实话&#xff0c;2026年入耳式蓝牙耳机市场已经卷得很细了&#xff0c;2026新款爆款蓝牙耳机在百元价位就能买到带ANC主动降噪和ENC通话降噪的型号。但参数看着都差不多&#xff0c;戴…

作者头像 李华
网站建设 2026/7/18 20:11:55

MES 系统与 ERP 系统完整对比、区别与协同关系

一、核心定位ERP&#xff08;企业资源计划&#xff09;&#xff1a;管钱、管人、管物料、管订单&#xff0c;企业上层经营管理系统&#xff0c;面向计划层&#xff1b;MES&#xff08;制造执行系统&#xff09;&#xff1a;管车间生产、设备、工序、品质&#xff0c;工厂中层执…

作者头像 李华
网站建设 2026/7/18 20:11:18

LAN配置--配置静态DHCP

你现在在 用户视图 <H3C> 下&#xff0c;但 static-bind 命令需要在 DHCP 地址池视图 下执行。方案一&#xff1a;通过命令行配置&#xff08;最可靠&#xff09;MER3220 支持 Telnet/SSH 或 Console 口登录&#xff0c;用命令行绕过 Web 界面的 bug&#xff1a;1. 开启 …

作者头像 李华
网站建设 2026/7/18 20:09:21

一文搞懂什么是多模态大模型?为什么需要多模态大模型?

前言 “ 多模态大模型&#xff0c;就是支持多种数据格式的模型” 很多人都听说过多模态&#xff0c;也知道多模态大模型&#xff0c;但如果让你介绍一下什么是多模态大模型&#xff0c;它有什么优点和缺点&#xff0c;以及为什么需要多模态&#xff0c;这时可能就有点傻眼了。…

作者头像 李华