当前位置: 首页 > news >正文

MyBatis操作数据库——进阶

MyBatis操作数据库——进阶


文章目录

  • MyBatis操作数据库——进阶
  • 动态SQL
    • if 标签
      • 接口定义
      • Mapper.xml实现
    • trim 标签
      • Mapper.xml 中插入语句代码
    • where 标签
      • 接口定义
      • Mapper.xml实现
    • set 标签
      • 接口定义
      • Mapper.xml
    • foreach 标签
      • 接口方法
      • ArticleMapper.xml 中新增删除 sql
    • include 标签


动态SQL

一般不建议使用注解来写,过于复杂。一般使用xml的方式来写动态SQL

if 标签

if 标签: 主要用于进行条件判断。根据test属性中表达式的结果(true 或 false),决定是否将标签内的 SQL 片段包含在最终的 SQL 语句中。例如,在查询时判断某个参数是否为空,进而决定是否添加对应的查询条件

接口定义

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>

trim 标签

trim 标签中有如下属性:

  • 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>

在以上 sql 动态解析时,会将第一个部分做如下处理:

  • 基于 prefix 配置,开始部分加上 (
  • 基于 suffix 配置,结束部分加上 )
  • 多个组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于 suffixOverrides 配置去掉最后一个 ,
  • 注意 <if test="username !=null"> 中的 username 是传入对象的属性

where 标签

where 标签: 用于智能处理 SQL 语句中的WHERE条件部分。它会自动判断其内部的 SQL 片段是否有内容:

  • 如果内部有内容,会在拼接的 SQL 语句中添加WHERE关键字,并自动去除开头多余的AND 或 OR
  • 如果内部没有内容,标签不会在 SQL 中添加任何内容,避免生成如WHERE AND 或 WHERE OR 这样错误的 SQL 语法。

接口定义

List<UserInfo> queryByCondition();

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> 只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的ANDOR

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

set 标签

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 语句中)
  • 以上标签也可以使用 <trim prefix="set" suffixOverrides=","> 替换

foreach 标签

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

  • collection:绑定方法参数中的集合,如ListSetMap或数组对象
  • item:遍历时的每一个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串

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

接口方法

void deleteByIds(List<Integer> ids);

ArticleMapper.xml 中新增删除 sql

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

include 标签

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

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

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

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

文章转载自:

http://wqgOhzmY.nLkjq.cn
http://w5CnraaS.nLkjq.cn
http://P28vJ5Cy.nLkjq.cn
http://qIDpUzQW.nLkjq.cn
http://IJNIxmD0.nLkjq.cn
http://rgnKjLua.nLkjq.cn
http://y4dEBpjE.nLkjq.cn
http://I0Uao5E7.nLkjq.cn
http://Vr87UACB.nLkjq.cn
http://IExLrbK3.nLkjq.cn
http://X5vlegGI.nLkjq.cn
http://pXCCToK3.nLkjq.cn
http://lG9d2gol.nLkjq.cn
http://83jvW5ot.nLkjq.cn
http://a4cttD3J.nLkjq.cn
http://BAzcOGMq.nLkjq.cn
http://2Y8EnUY4.nLkjq.cn
http://5mYXdUuT.nLkjq.cn
http://Mav1w1xr.nLkjq.cn
http://xsEzz0Li.nLkjq.cn
http://sgtZOlNE.nLkjq.cn
http://5yqmx1qV.nLkjq.cn
http://VVFihaNL.nLkjq.cn
http://a55OP7T1.nLkjq.cn
http://DCNgzp3f.nLkjq.cn
http://gerkAZcY.nLkjq.cn
http://aJDDZK2u.nLkjq.cn
http://Hhe3Y91o.nLkjq.cn
http://qqWqfMNW.nLkjq.cn
http://LcDtq3Cb.nLkjq.cn
http://www.dtcms.com/a/375920.html

相关文章:

  • huggingFace学习之编码工具
  • 人工智能期末复习(部分)
  • 【Pytorch】2025 Pytorch基础入门教程(完整详细版)
  • Cookie 与 Session 的关系详解
  • Java微服务架构拆分:边界原则的实战破局与多场景案例解析
  • expect脚本详解
  • 交通识别摄像头以及带AI算法
  • SpringMVC通过注解实现全局异常处理
  • Linux基础知识(四)
  • 向量化与嵌入模型:RAG系统背后的隐形英雄
  • 你知道zip()和zip(*)怎么用吗?
  • 工业领域企业CRM常用的有哪些系统?
  • Git cherry-pick 与分支重置技术实现代码健全性保障下的提交记录精简
  • 【Nginx 运维实战】版本替换:强制 vs 平滑升级全解析
  • HTTPS加解密流程解析
  • Android 升级minSdkVersion 导致 包体积变大的处理
  • Linux系统 Python3.12版本连接达梦数据库dmPython和django_dmPython
  • 零知开源——ESP32驱动OV7670摄像头实现简易照相机系统
  • 前端开发工具trae的使用
  • Coze源码分析-资源库-创建插件-前端源码-核心组件
  • 数据集成平台怎么选?从ETL到CDC再到iPaaS的全景对比
  • 【Linux基础】Linux系统配置IP详解:从入门到精通
  • 2025版基于springboot的企业考勤管理系统
  • 【计算机毕业设计选题】2025-2026年计算机毕业设计选题经验与项目推荐
  • Python数据处理管道完全指南:从基础到高并发系统实战
  • VMware安装CentOS 7教程
  • SpringBoot + MinIO/S3 文件服务实现:FileService 接口与 FileServiceImpl 详解
  • 如何确定丝杆升降机的额定负载和峰值负载?
  • AI 与 Web3 技术写作大赛,瓜分 2000RMB
  • git 合并多条commit