MyBatis操作--进阶

server/2025/2/12 22:56:35/

 博主主页: 码农派大星.

    数据结构专栏: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/server/141358.html

相关文章

工位管理现代化:Spring Boot企业级框架

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

爬虫学习5

selenium用法详解【从入门到实战】【Python爬虫】【4万字】_selenium用法详解4万字csdn-CSDN博客 MYSQL数据库 MongoDB数据库 selenium用法详解【从入门到实战】【Python爬虫】【4万字】_selenium用法详解4万字csdn-CSDN博客 redis数据库 黑马程序员Redis入门到实战教程&…

Word2Vec,此向量维度,以及训练数据集单条数据的大小,举例说明;Skip-gram模型实现词嵌入;热编码(One-Hot Encoding)和词向量;

目录 Word2Vec Word2Vec,此向量维度,以及训练数据集单条数据的大小,举例说明 一、Word2Vec的词向量维度 二、训练数据集单条数据的大小 综上所述 热编码(One-Hot Encoding)和词向量 一、表示方式 二、维度与计算效率 三、语义捕捉能力 四、举例说明 Skip-gram模…

使用 HTML、CSS 和 JavaScript 实现动态烟花效果

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

电脑局域网内让其他电脑通过IP访问配置

依次点击桌面左下角“开始菜单”>“所有应用”>“Windows系统”>“控制面板”&#xff0c;如图所示 在控制面板界面&#xff0c;选择“查看方式”为“大图标”&#xff0c;然后点击打开window防火墙&#xff0c;如图所示 然后点击“高级设置”&#xff0c;如图所示 在…

CSRF详解

CSRF&#xff0c;全称是Cross-Site Request Forgery&#xff0c;即跨站请求伪造&#xff0c;也被称为“one click attack”或者session riding&#xff0c;是一种网络攻击方式。它允许攻击者诱导用户在已登录的Web应用程序上执行非预期的操作。 工作原理CSRF攻击通常涉及三个主…

unity3d————四元数的计算

1.四元数相乘 代码示例&#xff1a; void Start(){Quaternion q Quaternion.AngleAxis(20, Vector3.up);this.transform.rotation * q;this.transform.rotation * q;} 我们首先创建一个四元数 q 根据 Quaternion.AngleAxis(20, Vector3.up); 返回一个四元数 &#xff0c;先…

python manage.py命令集

python manage.py 是 Django 框架中用于管理 Django 项目的命令行工具。它提供了一系列命令&#xff0c;用于创建应用、运行服务器、创建数据库迁移、管理静态文件等。 startproject python manage.py startproject myproject 创建一个新的 Django 项目。myproject 是项目的…