MyBatis操作--进阶

news/2024/11/14 3:47:48/

 博主主页: 码农派大星.

    数据结构专栏:Java数据结构

 数据库专栏:MySQL数据库

JavaEE专栏:JavaEE

软件测试专栏:软件测试

关注博主带你了解更多知识

1. 动态SQL

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

1.1 <if>标签

比如说注册分为两种字段:必填字段和⾮必填字段,⾮必填字段该如何实现呢,这就需要使⽤动态标签了

接⼝定义:

Integer insertByCondition(UserInfo userInfo);

Mapper.xml实现:

   <insert id="insertByCondition">insert into user_info (username, password,<if test="age!=null">age,</if>gender,phone)values (#{username}, #{password},<if test="age!=null">#{age},</if>#{gender},#{phone})</insert>

 

测试:

@Testvoid insertByCondition() {UserInfo userInfo = new UserInfo();userInfo.setUsername("zhangwu222");userInfo.setPassword("zhangwu222");userInfo.setGender(0);// userInfo.setAge(16);//注释掉age,看它怎么测出结果userInfo.setPhone("123456789");userInfoXmlMapper.insertByCondition(userInfo);}

<if>标签判断age是否为null,如果为null,就会拼接后面的phone属性 

 注解⽅式(不推荐) 

使用<script></script>方式

 @Insert("<script> insert into user_info (username, password,\n" +"        <if test='age!=null'>age,</if>\n" +"        gender," +"        phone" +"        )" +"        values (#{username}, #{password}," +"        <if test='age!=null'>#{age},</if>" +"        #{gender}," +"        #{phone}" +"        )</script>")Integer insertByCondition(UserInfo userInfo);

测试: 

@Testvoid insertByCondition() {UserInfo userInfo = new UserInfo();userInfo.setUsername("zhangwu222");userInfo.setPassword("zhangwu222");userInfo.setGender(0);// userInfo.setAge(16);userInfo.setPhone("123456789");userInfoMapper.insertByCondition(userInfo);}

1.2 <trim>标签

prefix:表⽰整个语句块,以prefix的值作为前缀

suffix:表⽰整个语句块,以suffix的值作为后缀

prefixOverrides:表⽰整个语句块要去除掉的前缀

suffixOverrides:表⽰整个语句块要去除掉的后缀

  <insert id="insertByCondition">insert into user_info<trim prefixOverrides="," 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 prefixOverrides="," 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>

测试

@Testvoid insertByCondition() {UserInfo userInfo = new UserInfo();userInfo.setUsername("zhangwu222");userInfo.setPassword("zhangwu222");userInfo.setGender(0);// userInfo.setAge(16);// userInfo.setPhone("123456789");userInfoXmlMapper.insertByCondition(userInfo);}

1.3 <where>标签  

 List<UserInfo> selectByCondition(UserInfo userInfo);
 <select id="selectByCondition" resultType="com.mybatis.model.UserInfo">select * from user_info<where><if test="username!=null">username = #{username}</if><if test="age!=null">and age = #{age}</if><if test="gender!=null">and gender = #{gender}</if></where></select>
 @Testvoid insertByCondition() {UserInfo userInfo = new UserInfo();userInfo.setUsername("zhangwu222");userInfo.setPassword("zhangwu222");userInfo.setGender(0);// userInfo.setAge(16);// userInfo.setPhone("123456789");userInfoXmlMapper.insertByCondition(userInfo);}

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

1.4 <set>标签

根据传⼊的⽤⼾对象属性来更新⽤⼾数据,可以使⽤标签来指定动态内容

 <update id="updateByCondition2">update user_info<set><if test="username!=null">username=#{username},</if><if test="password!=null">password=#{password},</if><if test="age!=null">age=#{age}</if></set><where><if test="id!=null">id=#{id}</if></where></update>

测试 

 @Testvoid updateByCondition() {UserInfo userInfo = new UserInfo();userInfo.setUsername("cxk");userInfo.setPassword("cxk");userInfo.setId(3);userInfo.setAge(12);userInfoXmlMapper.updateByCondition2(userInfo);}

 1.5 <foreach>标签

对集合进⾏遍历时可以使⽤该标签

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

item:遍历时的每⼀个对象

open:语句块开头的字符串

close:语句块结束的字符串

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

需求:根据多个userid,删除⽤⼾数据

 Integer batchDelete(List<Integer> ids);

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

 测试:

 @Testvoid batchDelete() {userInfoXmlMapper.batchDelete(List.of(6,7,8));}

 

1.6<include> 标签

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

对重复的代码⽚段抽取,将其通过<sql>标签封装到⼀个SQL⽚段,然后再通过 <include>标签进⾏引⽤

 <sql id="selectAll">select * from user_info;</sql>
  <select id="queryUserInfos" resultType="com.mybatis.model.UserInfo"><include refid="selectAll"></include></select>


http://www.ppmy.cn/news/1546352.html

相关文章

MySQL中distinct与group by之间的性能进行比较

在 MySQL 中&#xff0c;DISTINCT 和 GROUP BY 都是用于去重或汇总数据的常用 SQL 语法。尽管它们在某些情况下能产生相同的结果&#xff0c;但它们的内部工作方式和性能表现可能有所不同。理解这两者的差异&#xff0c;对于选择正确的语法非常重要&#xff0c;尤其是在处理大量…

100种算法【Python版】第58篇——滤波算法之卡尔曼滤波

本文目录 1 算法步骤2 算法示例2.1 示例描述2.2 python代码3 算法应用:二维运动目标跟踪问题滤波算法是用于从信号中提取有用信息、去除噪声或估计系统状态的技术。在时间序列分析、信号处理和控制系统中,滤波算法起着关键作用。 1 算法步骤 卡尔曼滤波(Kalman Filter)的…

开源 PHP 商城项目 CRMEB 二次开发和部署教程

上篇文章给大家介绍了如何使用 Sealos 应用商店一键部署 CRMEB 开源商城系统&#xff0c;那速度真叫一个快啊&#xff0c;比宝塔快多了&#xff01; 但是有些读者还不满足于此&#xff0c;问我能不能边运行边改代码&#xff0c;而且还得用 Cursor 来改代码&#xff0c;改完了之…

基于Opencv的图像处理软件

本文所涉及所有资源均在 传知代码平台 可获取。 目录 一、背景及意义介绍 背景 意义

Linux 系统结构

Linux系统一般有4个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它…

鸿蒙生态的全景透视

鸿蒙生态的全景透视 在这个智能设备日益普及的时代&#xff0c;你是否也在思考&#xff1a;不同设备之间如何才能实现无缝连接&#xff1f;鸿蒙生态&#xff0c;作为华为推出的全新操作系统&#xff0c;或许会给你答案。它不仅仅是一个操作系统&#xff0c;更是一个充满机遇和…

【jenkins】jenkins使用pipeline配置django项目

目录 一、部署jenkins 二、配置 2.1 获取gitee账户凭证 2.2 安装pipeline插件 三、创建一个流水线项目 四、选择创建的项目 4.1 源码设置 4.2 配置 前言&#xff1a;个人使用&#xff0c;比较简单&#xff0c;做个笔记&#xff0c;这里我使用的是gitee作为仓库 一、部署…

数据分析:宏基因组DESeq2差异分析筛选差异物种

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理:计算步骤:结果:加载R包准备画图主题数据链接导入数据Differential abundance (No BP vs 2BP TA)构建`countData`矩阵过滤低丰度物种构建DESeq数据对象DESeq2差异分析画图Di…