【MyBatis】深入解析MyBatis:高效操作数据库技术详解

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【MyBatis】深入解析MyBatis:高效操作数据库技术详解

动态SQL

动态SQL是Mybatis的强大特性之⼀,能够完成不同条件下不同的sql拼接

1. <if>标签

在注册用户的时候,可能会有这样⼀个问题,如下图所示:

注册分为两种字段:必填字段和非必填字段,那如果在添加用户的时候有不确定的字段传入,程序应该如何实现呢?

这个时候就需要使用动态标签来判断了,比如添加的时候性别gender为非必填字段,具体实现如下:

Integer insertUserByCondition(UserInfo userInfo);

Mapper.xml实现:

<insert id="insertUserByCondition">
  INSERT INTO userinfo (
  username,
  `password`,
  age,
  
  <if test="gender != null">
    gender,
  </if>
  
  phone)
  VALUES (
  #{username},
  #{age},
  
  <if test="gender != null">
    #{gender},
  </if>
  
  #{phone})
</insert>

注意test中的gender,是传入对象中的属性,不是数据库字段

Q:可不可以不进行判断,直接把字段设置为null呢?

A:不可以,这种情况下,如果gender字段有默认值,就会设置为默认值

2. <trim>标签

之前的插入用户功能,只是有⼀个gender字段可能是选填项,如果有多个字段,⼀般考虑使用标签结合标签,对多个字段都采取动态生成的方式。

标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀

调整Mapper.xml的插入语句为:

<insert id="insertUserByCondition">
  INSERT INTO userinfo
  <trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="username !=null">
      username,
    </if>
    
    <if test="password !=null">
      `password`,
    </if>
    
    <if test="age != null">
      age,
    </if>
    
    <if test="gender != null">
      gender,
    </if>
    
    <if test="phone != null">
      phone,
    </if>
  </trim>
  
  VALUES
  <trim prefix="(" suffix=")" suffixOverrides=",">
  
    <if test="username !=null">
      #{username},
    </if>
    
    <if test="password !=null">
      #{password},
    </if>
    
    <if test="age != null">
      #{age},
    </if>
    
    <if test="gender != null">
      #{gender},
    </if>
    
    <if test="phone != null">
      #{phone}
    </if>
    
  </trim>
</insert>

3. <where>标签

看下⾯这个场景,系统会根据我们的筛选条件,动态组装where条件

需求:传入的用户对象,根据属性做where条件查询,用户对象中属性不为null的,都为查询条件

原有SQL:

SELECT * FROM userinfo WHERE age = 18 AND gender = 1 AND delete_flag =0

Mapper.xml实现

<select id="queryByCondition" resultType="com.example.demo.model.UserInfo">
  select id, username, age, gender, phone, delete_flag, create_time,update_timefrom userinfo
  
  <where>
  
  <if test="age != null">
    and age = #{age}
  </if>
  
  <if test="gender != null">
    and gender = #{gender}
  </if>
  
  <if test="deleteFlag != null">
    and delete_flag = #{deleteFlag}
  </if>
  
  </where>
</select>

只会在子元素有内容的情况下才插入where子句,⽽且会⾃动去除子句的开头的AND或OR

以上标签也可以使用 替换,但是此种情况下,当子元素都没有内容时,where关键字也会保留

4. <set>标签

需求:根据传入的用户对象属性来更新用户数据,可以使用标签来指定动态内容.

接口定义:根据传入的用户id属性,修改其他不为null的属性

Integer updateUserByCondition(UserInfo userInfo);

Mapper.xml

<update id="updateUserByCondition">
  update userinfo
  <set>
    <if test="username != null">
      username = #{username},
    </if>
    
    <if test="age != null">
      age = #{age},
    </if>
    
    <if test="deleteFlag != null">
      delete_flag = #{deleteFlag},
    </if>
  </set>
  where id = #{id}
</update>

<set> :动态的在SQL语句中插入set关键字,并会删掉额外的逗号.(用于update语句中)

以上标签也可以使用 替换。

5. <foreach>标签

对集合进行遍历时可以使用该标签。标签有如下属性:

• collection:绑定方法参数中的集合,如List,Set,Map或数组对象

• item:遍历时的每⼀个对象

• open:语句块开头的字符串

• close:语句块结束的字符串

• separator:每次遍历之间间隔的字符串

需求:根据多个userid,删除用户数据

接口方法:

void deleteByIds(List<Integer> ids);

ArticleMapper.xml中新增删除sql:

<delete id="deleteByIds">
  delete from userinfo
  where id in
  
  <foreach collection="ids" item="id" separator="," open="(" close=")">
    #{id}
  </foreach>
</delete>

6. <include>标签

问题分析:

  • 在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会存在很多冗余的代码

我们可以对重复的代码片段进行抽取,将其通过 标签封装到⼀个SQL片段,然后再通过<include> 标签进行引用。

  • :定义可重用的SQL片段
  • :通过属性refid,指定包含的SQL片段
<sql id="allColumn">
id, username, age, gender, phone, delete_flag, create_time, update_time
</sql>

通过 标签在原来抽取的地方进行引用。操作如下:

<select id="queryAllUser" resultMap="BaseMap">
  select
  <include refid="allColumn"></include>
  from userinfo
</select>
<select id="queryById" resultType="com.example.demo.model.UserInfo">
  select
  <include refid="allColumn"></include>
  from userinfo where id= #{id}
</select>
相关文章
|
18天前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
103 61
|
12天前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
86 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
3天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
22 3
|
3天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
13 2
|
6天前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
21 3
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
思通数科AI平台在尽职调查中的技术解析与应用
思通数科AI多模态能力平台结合OCR、NLP和深度学习技术,为IPO尽职调查、融资等重要交易环节提供智能化解决方案。平台自动识别、提取并分类海量文档,实现高效数据核验与合规性检查,显著提升审查速度和精准度,同时保障敏感信息管理和数据安全。
62 11
|
8天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
9天前
|
自然语言处理 并行计算 数据可视化
免费开源法律文档比对工具:技术解析与应用
这款免费开源的法律文档比对工具,利用先进的文本分析和自然语言处理技术,实现高效、精准的文档比对。核心功能包括文本差异检测、多格式支持、语义分析、批量处理及用户友好的可视化界面,广泛适用于法律行业的各类场景。
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
16天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
30 3

推荐镜像

更多