尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

MyBatis 基础CRUD全套实战学习笔记
📅 发布时间:2026/7/18 20:24:09

前言

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

相关新闻

  • 苹果起诉 OpenAI,表面争机密,实际争的是 AI 硬件入口
  • 郑州墙角发霉、窗边渗水?用“架构排错思维”拆解外墙漏水:基于窜水路径的数据化检测与避坑指南
  • 卡地亚中国官方售后服务中心|官方电话和详细网点地址权威信息通告(2026年7月最新) - 卡地亚服务中心

最新新闻

  • 2026年广州GEO优化服务:本地企业GEO增长获客工具深度解析与服务商选型七维指南 - 企业新闻快传
  • 哪家团队有真实的GEO优化实测数据?
  • STM32F103+BMP180 气压温度传感器 + OLED 完整教程|软件 I2C 驱动、补偿算法、海拔计算全解析
  • 2026 年岳阳楼比较好的热收缩膜机批发厂家哪家可靠,别再浪费钱!揭秘膜机如何让生产成本骤降 - 行业推荐官【认证】
  • 新疆纯玩团多少钱?2026旺季真实价格表+费用拆解+避坑指南 - 旅行分享
  • 帝舵中国官方售后服务中心|服务热线及详细地址权威信息通告(2026年7月更新) - 帝舵中国官方服务中心

日新闻

  • 宝珀中国官方售后服务中心|官方热线和维修地址权威信息声明(2026年7月更新) - 宝珀官方售后服务中心
  • # 2026年北京知识产权律师推荐怎么选?看这五点关键不踩雷 - 本地品牌推荐
  • 2026实测教程:生成的拼豆图纸不满意怎么修改才省事 - 省事研究所

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号