day09-Mybatis

news2025/1/22 9:20:06

一、Mybatis 基础操作

1 需求

功能列表:

  1. 查询
    根据主键ID查询
    条件查询
  2. 新增
  3. 更新
  4. 删除
    根据主键ID删除
    根据主键ID批量删除

2 准备

实施前的准备工作:

  1. 准备数据库表
  2. 创建一个新的 springboot 工程,选择引入对应的起步依赖(mybatis、mysql 驱动、lombok)
  3. application.properties 中引入数据库连接信息
  4. 创建对应的实体类 Emp(实体类属性采用驼峰命名)
  5. 准备 Mapper 接口 EmpMapper

3 删除

3.1 功能实现

当我们点击后面的"删除"按钮时,前端页面会给服务端传递一个参数,也就是该行数据的 ID。我们接收到 ID 后,根据 ID 删除数据即可。

@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 {

    @Autowired
    private EmpMapper empMapper;

    //根据ID删除
    @Test
    public void testDelete(){
        //int delete = empMapper.delete(16);
        //System.out.println(delete);
        empMapper.delete(18);
    }
}

3.2 日志输入

在 Mybatis 当中我们可以借助日志,查看到 sql 语句的执行、执行传递的参数以及执行结果。具体操作如下:

  1. 打开 application.properties 文件
  2. 开启 mybatis 的日志,并指定输出到控制台
#指定mybatis输出日志的位置,输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

3.3 预编译 SQL

预编译 SQL 有两个优势:

  1. 性能更高
  2. 更安全(防止 SQL 注入)

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

在 Mybatis 中提供的参数占位符有两种:${…} 、#{…}

  1. #{…}
    执行 SQL 时,会将#{…}替换为?,生成预编译 SQL,会自动设置参数值
    使用时机:参数传递,都使用#{…}
  2. ${…}
    拼接 SQL。直接将参数拼接在 SQL 语句中,存在 SQL 注入问题
    使用时机:如果对表名、列表进行动态设置时使用

4 新增

4.1 基本新增

@Mapper
public interface EmpMapper {

    @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            " values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    public void insert(Emp emp);
}
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {

    @Autowired
    private EmpMapper empMapper;

    //新增员工
    @Test
    public void testInsert(){
        //构造员工对象
        Emp emp = new Emp();
        emp.setUsername("Tom3");
        emp.setName("汤姆3");
        emp.setImage("1.jpg");
        emp.setGender((short)1);
        emp.setJob((short)1);
        emp.setEntrydate(LocalDate.of(2000,1,1));
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        emp.setDeptId(1);

        //执行新增员工信息操作
        empMapper.insert(emp);
        
    }
}

4.2 主键返回

默认情况下,执行插入操作时,是不会主键值返回的。如果我们想要拿到主键值,需要在 Mapper 接口中的方法上添加一个 Options 注解,并在注解中指定属性 useGeneratedKeys = true 和 keyProperty ="实体类属性名

@Mapper
public interface EmpMapper {

	@Options(useGeneratedKeys = true, keyProperty = "id")
    @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            " values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    public void insert(Emp emp);
}

5 更新

@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);
}

6 查询

6.1 根据ID查询

@Mapper
public interface EmpMapper {

	@Select("select * from emp where id = #{id}")
    public Emp getById(Integer id);
}

6.2 数据封装

实体类属性名 和 数据库表查询返回的字段名一致,mybatis 会自动封装。
如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。
在这里插入图片描述

  1. 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。
	//方案一: 给字段起别名, 让别名与实体类属性一致
    @Select("select id, username, password, name, gender, image, job, entrydate, " +
            "dept_id deptId, create_time createTime, update_time updateTime from emp where id = #{id}")
    public Emp getById(Integer id);
  1. 手动结果映射:通过 @Results及@Result 进行手动结果映射。
	//方案二: 通过@Results, @Result注解手动映射封装
	@Results({
            @Result(column = "dept_id", property = "deptId"),
            @Result(column = "create_time", property = "createTime"),
            @Result(column = "update_time", property = "updateTime")
    })
    @Select("select * from emp where id = #{id}")
    public Emp getById(Integer id);
  1. 开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis 会自动通过驼峰命名规则映射。在 application.properties 中添加:
#开启驼峰命名自动映射,即从数据库字段名 a_column 映射到Java 属性名 aColumn。
mybatis.configuration.map-underscore-to-camel-case=true

6.3 条件查询

  1. 方式一
    模糊查询使用${…}进行字符串拼接,这种方式呢,由于是字符串拼接,并不是预编译的形式,所以效率不高、且存在sql注入风险。
@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);
}
  1. 方式二(解决SQL注入风险)
    使用 MySQL 提供的字符串拼接函数:concat(‘%’ , ‘关键字’ , ‘%’)
@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);
}

6.4 参数名说明

在这里插入图片描述

二、Mybatis 的 XML 配置文件

1 XML 配置文件规范

规范

  • XML 映射文件的名称与 Mapper 接口名称一致,并且将 XML 映射文件和 Mapper 接口放置在相同包下 (同包同名)
  • XML 映射文件的 namespace 属性为 Mapper 接口全限定名一致。
  • XML 映射文件中sql语句的 id 与 Mapper 接口中的方法名一致,并保持返回类型一致。

在这里插入图片描述

2 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 mapper
        PUBLIC "-//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>

3 MybatisX 的使用

MybatisX 是一款基于 IDEA 的快速开发 Mybatis 的插件,为效率而生。
在这里插入图片描述

使用 Mybatis 的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的 SQL 功能,建议使用 XML 来配置映射语句。

官方说明:https://mybatis.net.cn/getting-started.html

三、Mybatis 动态 SQL

1 什么是动态SQL

SQL 语句会随着用户的输入或外部条件的变化而变化,我们称为:动态 SQL。

2 动态 SQL-if

2.1 条件查询

  • <if>:用于判断条件是否成立。使用 test 属性进行条件判断,如果条件为 true,则拼接 SQL。
  • <where>:where 元素只会在子元素有内容的情况下才插入 where 子句。而且会自动去除子句的开头的 AND 或 OR。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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>

2.2 更新员工

  • <set>:动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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>

3 动态 SQL-foreach

@Mapper
public interface EmpMapper {

	//批量删除员工
    public void deleteByIds(List<Integer> ids);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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>

4 动态 SQL-sql&include

在这里插入图片描述
在这里插入图片描述

  • :定义可重用的 SQL 片段。
  • :通过属性 refid,指定包含的 sql 片段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1529408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DevOps趣味篇】你为什么要数程序员的代码行数?

【DevOps趣味篇】你为什么要数程序员的代码行数&#xff1f; 目录 【DevOps趣味篇】你为什么要数程序员的代码行数&#xff1f;代码行数统计方法手动计数代码行数统计命令使用语句统计代码行数IL指令 需要计算代码行数吗&#xff1f; 推荐超级课程&#xff1a; Docker快速入门…

「Swift」AttributedString常见使用方法

前言&#xff1a;AttributedString是Apple推出的可以实现单个字符或字符范围带相应属性的字符串。属性提供了一些文本特性&#xff0c;可以让文本展示的样式更加丰富。在日常开发过程中&#xff0c;我通常用于同一个Label中包含不同的字体大小或字体颜色的样式编写中。 使用举…

002——编译鸿蒙(Liteos -a)

目录 一、鸿蒙是什么 二、Kconfig 2.1 概述 2.2 编译器 2.3 make使用 本文章引用了很多韦东山老师的教程内容&#xff0c;算是我学习过程中的笔记吧。如果侵权请联系我。 一、鸿蒙是什么 这里我补充一下对鸿蒙的描述 这张图片是鸿蒙发布时使用的&#xff0c;鸿蒙是一个很…

数据预处理:重复值

数据重复值处理 数据重复值出现情况重复的记录用于分析演变规律重复的记录用于样本不均衡处理重复的记录用于检测业务规则问题 数据重复值出现情况 数据集中的重复值包括以下两种情况&#xff1a; 数据值完全相同的多条数据记录。这是最常见的数据重复情况。数据主体相同但匹…

ConKI: Contrastive Knowledge Injection for Multimodal Sentiment Analysis

文章目录 ConKI&#xff1a;用于多模态情感分析的对比知识注入文章信息研究目的研究内容研究方法1.总体结构2.Encoding with Knowledge Injection2.1 Pan-knowledge representations2.2 Knowledge-specific representations 3.Hierarchical Contrastive Learning4.损失函数5.训…

五个跟进方法,让你的老外客户不再跑路!

一、不同客户该怎么跟进? 1.已报价的客户 在向客户报过价之后&#xff0c;过几天要记得再询问一下对方是否收到了报价&#xff0c;如果没收到就提醒一下客户必要时将价格再发过去&#xff0c;如果客户已收到还要再进一步了解其对于报价的想法。 如果客户有兴趣也有需要&…

外包2月,技术倒退警钟长鸣。。。。。

曾经的我&#xff0c;作为一名大专生&#xff0c;在湖南某软件公司从事功能测试工作近四年。日复一日的工作让我陷入舒适区&#xff0c;不思进取。直到今年8月&#xff0c;我才意识到自己的技术停滞不前&#xff0c;女友的离开更是让我痛定思痛&#xff0c;决定改变现状&#x…

如何选择合适的奶瓶?五大超实用选购技巧,新手宝妈必看

奶瓶什么品牌好&#xff1f;奶瓶是每个新生宝宝都需要用到的辅喂产品&#xff0c;然而市场上许多网红品牌为了赚快钱&#xff0c;往往凭借外观设计、性价比和广告营销来吸引消费者。这些品牌由于缺乏专业技术&#xff0c;往往没有对选材用料和安全性进一步的优化&#xff0c;从…

使用jQuery的autocomplete实现数据查询一次,联想自动补全

书接上回&#xff0c;上次说到在jsp页面中&#xff0c;通过监听输入框的数值变化&#xff0c;实时查询数据库&#xff0c;得到返回值使用autocomplete属性自动补全&#xff0c;实现一个联想补全辅助操作&#xff0c;链接&#xff1a;使用jquery的autocomplete属性实现联想补全操…

Redis数据结构对象中的类型检查与命令多态、内存回收

类型检查与命令多态 概述 redis中用于操作键的命令基本上可以分为两种类型。其中一种命令可以对任何类型的键执行&#xff0c;比如说DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等. 而另一种命令只能对特定类型的键执行&#xff0c;比如说 1.SET、GET、APPEND、…

Vector Magic:矢量图像转换神器,轻松驾驭Mac与Win双平台

在数字化时代&#xff0c;图像已经成为我们生活和工作中不可或缺的一部分。无论是设计师、艺术家&#xff0c;还是普通用户&#xff0c;都对图像质量有着极高的要求。而矢量图像&#xff0c;以其清晰度高、可无限放大的特点&#xff0c;逐渐受到广大用户的青睐。今天&#xff0…

打破沟通壁垒:跨部门需求冲击与IT部门的应对智慧

引言 在快节奏、高要求的互联网行业&#xff0c;跨部门间的有效沟通是确保项目顺利进行和公司业务稳定发展的基石。然而&#xff0c;需求突袭往往成为打乱这一稳定局面的重要因素。 事件的背景 作为一IT部门负责人&#xff0c;在跨部门的领导层沟通会议上&#xff0c;一个在事…

深度解析深度学习中的长短期记忆网络(LSTM)(含代码实现)

在深度学习中&#xff0c;长短期记忆网络&#xff08;LSTM&#xff09;是一种强大的循环神经网络结构&#xff0c;能够更好地处理长序列数据并减轻梯度消失的问题。本文将介绍LSTM的工作原理&#xff0c;并使用PyTorch实现一个简单的LSTM模型来展示其在自然语言处理中的应用。 …

使用 wxWidgets 的 wxAUI 界面库,创建功能丰富的软件界面

目录 前言&#xff1a; wxAUI 的优势&#xff1a; 使用 wxAUI 创建软件界面的步骤&#xff1a; 以下是一些使用 wxAUI 创建软件界面的技巧&#xff1a; 案例&#xff1a; 总结&#xff1a; 前言&#xff1a; 软件界面是用户与软件交互的重要桥梁&#xff0c;一个好的界面…

应用测评要求解读-三级

身份鉴别&#xff1a; a)应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换&#xff1b; 1. 在未登录状态下尝试直接访问任意操作页面或功能&#xff0c;查看是否具有登陆界面。 2&#xff0e;询问或者测试…

《你就是孩子最好的玩具·升级版》笔记(四)给父母的话

经典摘录 两岁到三岁之间是最具有挑战性的一段时期。在这个阶段&#xff0c;你的工作最多&#xff0c;责任也最大&#xff0c;因为你将极大地影响并决定孩子的情感发育。“当妈妈本来就不容易&#xff0c;你并不需要时时刻刻都开心&#xff0c;这很正常。” 【●反省自己生气的…

Vue技能树总结01

Vue vs React 相似之处: 它们都有使用 Virtual DOM&#xff1b;提供了响应式&#xff08;Reactive&#xff09;和组件化&#xff08;Composable&#xff09;的视图组件。将注意力集中保持在核心库&#xff0c;而将其他功能如路由和全局状态管理交给相关的库。React 比 Vue 有更…

MySQL数据自动同步到Es

Logstash 测试数据准备 DROP DATABASE IF EXISTS es;CREATE DATABASE es DEFAULT CHARACTER SET utf8;USE es;CREATE TABLE book (id INT NOT NULL,title VARCHAR(20),author VARCHAR(20),price DECIMAL(6,2),PRIMARY KEY(id) );DROP PROCEDURE IF EXISTS batchInsertBook;DELI…

极大似然估计和最大参数后验估计

概率是已知模型和参数&#xff0c;推数据&#xff1b;统计&#xff08;似然&#xff09;是已知数据&#xff0c;推模型和参数。对于函数 x表示某一个具体的数据&#xff1b;θ表示模型的参数。 如果θ是已知确定的&#xff0c;x 是变量&#xff0c;这个函数叫做概率函数(prob…

全国人口密度分布数据

数据福利是专门为关注小编博客及公众号的朋友定制的&#xff0c;未关注用户不享受免费共享服务&#xff0c;已经被列入黑名单的用户和单位不享受免费共享服务。参与本号发起的数据众筹&#xff0c;向本号捐赠过硬盘以及多次转发、评论的朋友优先享有免费共享服务。 对人口数量、…