Mybatis(day09)
Mybatis基础操作
功能列表:
- 查询
根据主键ID查询
条件查询 - 新增
- 更新
- 删除
根据主键ID删除
根据主键ID批量删除
准备
实施前的准备工作:
- 准备数据库表
- 创建一个新的 springboot 工程,选择引入对应的起步依赖(mybatis、mysql 驱动、lombok)
- application.properties 中引入数据库连接信息
- 创建对应的实体类 Emp(实体类属性采用驼峰命名)
- 准备 Mapper 接口 EmpMapper

删除
功能实现
当我们点击后面的"删除"按钮时,前端页面会给服务端传递一个参数,也就是该行数据的 ID。我们接收到 ID 后,根据 ID 删除数据即可。
SQL语句:![]()
接口方法:

注意:如果mapper接口方法形参只有一个普通类型的参数,#{…} 里面的属性名可以随便写,如:#{id}、#{value}。
完整代码:
@Mapper
public interface EmpMapper {//根据ID删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);//public int delete(Integer id);
}
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {@Autowiredprivate EmpMapper empMapper;//根据ID删除@Testpublic void testDelete(){//int delete = empMapper.delete(16);//System.out.println(delete);empMapper.delete(18);}
}
日志输入
在 Mybatis 当中我们可以借助日志,查看到 sql 语句的执行、执行传递的参数以及执行结果。具体操作如下:
- 打开 application.properties 文件
- 开启 mybatis 的日志,并指定输出到控制台
#指定mybatis输出日志的位置,输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

预编译 SQL
预编译 SQL 有两个优势:
- 性能更高
- 更安全(防止 SQL 注入)

SQL 注入
SQL 注入:是通过操作输入的数据来修改事先定义好的 SQL 语句,以达到执行代码对服务器进行攻击的方法。
参数占位符

在 Mybatis 中提供的参数占位符有两种:${…} 、#{…}
#{…}
执行 SQL 时,会将#{…}替换为?,生成预编译 SQL,会自动设置参数值
使用时机:参数传递,都使用#{…}
${…}
拼接 SQL。直接将参数拼接在 SQL 语句中,存在 SQL 注入问题
使用时机:如果对表名、列表进行动态设置时使用
插入&新增
SQL语句:
insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)
values ('songyuanqiao','宋远桥',1,'1.jpg',2,'2012-10-09',2,'2022-10-01 10:00:00','2022-10-01 10:00:00');
接口方法:

新增(主键返回)
描述:在数据添加成功后,需要获取插入数据库数据的主键。如:添加套餐数据时,还需要维护套餐菜品关系表数据。
默认情况下,执行插入操作时,是不会主键值返回的。如果我们想要拿到主键值,需要在 Mapper 接口中的方法上添加一个 Options 注解,
并在注解中指定属性 useGeneratedKeys = true 和 keyProperty ="实体类属性名
实现:

更新
SQL语句(根据ID更新员工信息)
接口方法
@Mapper
public interface EmpMapper {//更新员工@Update("update emp set username = #{username}, name = #{name}, gender = #{gender}, image = #{image}," +" job = #{job}, entrydate = #{entrydate}, dept_id = #{deptId},update_time = #{updateTime} where id = #{id}")public void update(Emp emp);
}
查询
根据ID查询
SQL语句(根据ID查询)![]()
接口方法
@Mapper
public interface EmpMapper {@Select("select * from emp where id = #{id}")public Emp getById(Integer id);
}
数据封装
实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装。
如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。
数据封装---解决方法
起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。
手动结果映射:通过 @Results及@Result 进行手动结果映射。
开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。
条件查询
SQL语句(条件查询)
select * from emp where name like '%张%' and gender = 1 and entrydate between '2010-01-01' and '2020-01-01 ' order by update_time desc;
接口方法

方式一
模糊查询使用${…}进行字符串拼接,这种方式呢,由于是字符串拼接,并不是预编译的形式,所以效率不高、且存在sql注入风险。方式二(解决SQL注入风险)
使用 MySQL 提供的字符串拼接函数:concat(‘%’ , ‘关键字’ , ‘%’)
@Mapper
public interface EmpMapper {//条件查询员工//方式一@Select("select * from emp where name like '%${name}%' and gender = #{gender} and " +"entrydate between #{begin} and #{end} order by update_time desc ")public List<Emp> list(String name, Short gender, LocalDate begin , LocalDate end);
}@Mapper
public interface EmpMapper {//条件查询员工//方式二@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and " +"entrydate between #{begin} and #{end} order by update_time desc ")public List<Emp> list(String name, Short gender, LocalDate begin , LocalDate end);
}
参数名说明

Mybatis 的 XML 配置文件
XML 配置文件规范
规范:
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
XML映射文件的namespace属性为Mapper接口全限定名一致。
XML映射文件中sql语句的id与Mapper 接口中的方法名一致,并保持返回类型一致。
XML 配置文件实现
@Mapper
public interface EmpMapper {//动态条件查询public List<Emp> list(String name, Short gender, LocalDate begin , LocalDate end);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"><!--resultType: 单条记录封装的类型--><select id="list" resultType="com.itheima.pojo.Emp">select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc</select></mapper>
XML映射文件 MybatisX
MybatisX 是一款基于 IDEA 的快速开发Mybatis的插件,为效率而生。

使用 Mybatis 的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的 SQL 功能,建议使用 XML 来配置映射语句。
官方说明:入门_MyBatis中文网
Mybatis动态SQL
什么是动态SQL
SQL 语句会随着用户的输入或外部条件的变化而变化,我们称为:动态 SQL。
Mybatis动态SQL <if>
- <if>:用于判断条件是否成立。使用 test 属性进行条件判断,如果条件为 true,则拼接 SQL。
- <where>:where 元素只会在子元素有内容的情况下才插入 where 子句。而且会自动去除子句的开头的 AND 或 OR。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"><!--resultType: 单条记录封装的类型--><select id="list" resultType="com.itheima.pojo.Emp">select * from emp <where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where>order by update_time desc</select></mapper>
更新员工
- <set>:动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"><!-- 动态更新员工--><update id="update2">update emp<set><if test="username != null">username = #{username},</if><if test="name != null">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id = #{id}</update></mapper>

动态 SQL-foreach <foreach>
批量删除员工 (18,19,20)
![]()

@Mapper
public interface EmpMapper {//批量删除员工public void deleteByIds(List<Integer> ids);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"><!--批量删除员工 (18,19,20)--><!--collection: 遍历的集合item: 遍历出来的元素separator: 分隔符open: 遍历开始前拼接的SQL片段close: 遍历结束后拼接的SQL片段--><delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete></mapper>
动态 SQL-sql&include
- <sql>:定义可重用的 SQL 片段。
- <include>:通过属性 refid,指定包含的 sql 片段。


上一节:
Mybatis入门(day08)-CSDN博客
下一节:
相关文章:
Mybatis(day09)
Mybatis基础操作 功能列表: 查询 根据主键ID查询 条件查询新增更新删除 根据主键ID删除 根据主键ID批量删除 准备 实施前的准备工作: 准备数据库表创建一个新的 springboot 工程,选择引入对应的起步依赖(mybatis、mysql 驱动、…...
模式识别与机器学习 | 十一章 概率图模型基础
隐马尔科夫模型(Hidden Markov Model,HMM) HMM是建模序列数据的图模型 1、第一个状态节点对应一个初始状态概率分布 2、状态转移矩阵A, 3、发射矩阵概率B 4、对特定的(x,y)的联合概率可以表示为 α递归计算——前向算法β递归…...
深圳知识产权保护中心再发力,两大产业专利预审服务全新升级
在当今科技迅猛发展、市场竞争日益激烈的时代,知识产权保护对于产业发展的重要性不言而喻。深圳知识产权保护中心又有大动作,为高端装备制造和珠宝加工产业带来了专利预审服务的新突破。这一举措不仅为这两个产业注入了强大的发展动力,也为深…...
同步与并发:Java的同步舞蹈
现在,我们将深入探讨同步与并发,这是确保多线程程序正确性和效率的关键,就像是Java的同步舞蹈。 1 并发的概念 并发是指在多处理器系统中,多个操作或多个线程同时进行执行。在Java中,这意味着能够有效地利用多核处理…...
Kafka详解 ③ | Kafka集群操作与API操作
目录 1、Kafka集群操作 1.1、创建 topic 1.2、查看主题命令 1.3、生产者生产 1.4、消费者消费数据 1.5、运行 describe topics命令 1.6、增加 topic分区数 1.7、增加配置 1.8、删除配置 1.9、删除 topic 2、Kafka的Java API操作 2.1、生产者代码 2.2、消费者代 2…...
k8s基础(1)—Kubernetes-Pod
一、Pod简介 Pod是Kubernetes(k8s)系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型。Pod是由一个或多个容器组成的,这些容器共享存储和网络资源,可以看作是一个逻辑的主机。…...
iOS - 数组的真实类型
1. NSArray 类簇 // 1. __NSArray0 (空数组) NSArray *empty [];// 2. __NSArrayI (不可变数组) NSArray *immutable [1, 2, 3];// 3. __NSArrayM (可变数组) NSMutableArray *mutable [NSMutableArray array];// 4. __NSSingleObjectArrayI (单元素数组) NSArray *single …...
k8s启动报错
执行kubeadm init --image-repository registry.aliyuncs.com/google_containers 出现如下结果: [api-check] The API server is not healthy after 4m0.000885686s Unfortunately, an error has occurred: context deadline exceeded This error is likely caused by:…...
git:指令集
以下是对这些 Git 新特性和命令的更详细解读和实际用例分析,帮助更好地理解它们的作用及适用场景: 1. git switch 和 git restore 背景: 传统上,git checkout 是一个多功能命令,用于切换分支、检出文件、创建分支等&…...
自闭症家庭:建立支持系统与平衡生活
在自闭症家庭的世界里,每一天都充满了挑战与希望。自闭症,这一复杂的神经发育障碍,不仅影响着孩子的成长轨迹,也对整个家庭的生活方式产生了深远的影响。面对这一挑战,许多家庭都在努力寻找有效的支持系统和平衡生活的…...
html+css+js网页设计 美食 美食天下2个页面(里面包含php和mysql)
htmlcssjs网页设计 美食 美食天下2个页面(里面包含php和mysql) 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编…...
高阶知识库搭建实战七、(知识库雏形开发:qianwen-plus+Faiss)(练习推荐)
构建知识库:结合Faiss和qianwen-plus大模型的实践 环境搭建参考前面几篇文章:基础环境搭建、Faiss向量数据库安装 在当今信息爆炸的时代,如何高效地管理和检索海量知识成为了一个重要课题。知识库的构建为我们提供了一种有效的解决方案,它能够将分散的信息整合起来,方便…...
麒麟服务器安装kafka--亲测
我这安装的是单机版本的: 下载地址:Index of /kafka/3.9.0 我下载的是:https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…...
微机——8086微处理器的数据传送指令
目录 数据传送指令: 通用数据传送指令: MOV指令: 堆栈操作指令: PUSH指令: POP指令: 交换指令XCHG: XCHG指令: 换码指令XLAT: 换码指令XLAT: 8086 …...
vue3中onUpdated钩子函数和nextTick的具体使用场景和区别
在 Vue 3 中,onUpdated 钩子函数和 nextTick 方法都用于处理 DOM更新后的操作,但它们的使用场景和触发时机有所不同。以下是它们的具体使用场景和区别,结合代码示例进行解释: onUpdated 钩子函数 使用场景:适用于需要…...
colnames看似简单,却能优化数据处理流程
引言 在数据处理和分析中,变量名称是至关重要的,它们决定了数据的可读性和操作的简便性。在R语言中,colnames 函数以其简单的语法设计,提供了高效管理数据框列名的能力,尤其是在复杂的爬虫任务中显得尤为重要。本篇文…...
欧几里得距离在权重矩阵中的物理意义
欧几里得距离在权重矩阵中的物理意义 目录 欧几里得距离在权重矩阵中的物理意义**衡量神经元差异程度**:**反映模型变化程度**:**聚类和分组的依据**:自然语言处理中的模型更新:**神经网络聚类分组**:欧几里得距离在权重矩阵中的物理意义衡量神经元差异程度: 在神经网络中…...
AI编程辅助开发网站
咋用AI工具快速鼓捣出个网站? 咱都知道,现在这年月,干啥都讲究个效率,做网站更是如此。好在有了那些AI小帮手,不管你是专业搞开发的老手,想让活儿干得更快些,还是从没做过网站的小白࿰…...
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。 关键词 打卡提醒状态管理定时任务输入校验UI交互 一、功能说明 打卡提醒小应用包含以下功能: 提醒时间输入与…...
基于单片机洗衣机控制器的设计(论文+源码)
1需求分析 在智能洗衣机系统设计中,考虑到洗衣机在实际应用过程中,需要满足用户对于不同衣物清洁、消毒的应用要求,对设计功能进行分析,具体如下: 通过按键实现洗衣机不同工作模式的切换,包括标准模式&…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...


