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

【Mybatis】动态 SQL:代码与数据的灵动共舞,奏响数据库查询的华丽乐章

前言

🌟🌟本期讲解关于Spring IOC&DI的详细介绍~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

目录

📚️1.动态SQL

1.1标签><if>标签

1.2<trim>标签

1.3<where>标签

1.4标签><set>标签

1.5<foreach>标签

1.6<include>标签

📚️2.总结


 

📚️1.动态SQL

动态 SQL 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接可以参考官⽅⽂档:

网址在这里:动态 SQL_MyBatis中文网

1.1<if>标签

我们在平时登录的时候会出现如下的情况:

注册分为两种字段:必填字段和⾮必填字段,那如果在添加⽤⼾的时候有不确定的字段传⼊,程序应该如何实现呢?
这个时候就需要使⽤动态标签 来判断了,⽐如添加的时候性别 gender 为⾮必填字段,具体实现如
下:

<select id="select4" resultType="com.example.mybatis.Model.UserInfo">
        select user_name,password,age from user_info
        <trim prefix="where" prefixOverrides="and">
        <if test="username!=null">
            username=#{username}
        </if>
        <if test="password!=null">
           and password=#{password}
        </if>
        <if test="age!=null">
           and age=#{age}
        </if>
        </trim>
    </select>

解释:

这里加另一个标签,这里小编后面进行解释,具体的意思就是,where条件后,如果这里的user_name没有进行输入就不按照这里的user_name进行查询,其他几个也是一样的,若存在这里对应的参数,那么就按照这里的条件,没有就不会存在这里的参数;

我们在test类中进行测试:

 @Test
    void select4() {
        UserInfo userInfo=new UserInfo();
        userInfo.setAge(19);
        userInfoXMLMapper.select4(userInfo);
    }

解释:

这里设置的就是Age存在参数,其他的没有那么这里的查询的条件就是age=19的数据,然后进行查询,可以看到前面存在and,若username为空,那么后面就会多出来一个and,那么如何进行处理呢?

1.2<trim>标签

之前的插⼊⽤⼾功能,只是有⼀个 gender 字段可能是选填项,如果有多个字段,⼀般考虑使⽤标签结合标签,对多个字段都采取动态⽣成的⽅式。
标签中有如下属性:

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

例如下面的插入的操作:

<insert id="insert2">
        insert into user_info
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username!=null">
                username,
            </if>
            <if test="password!=null">
                password,
            </if>
            <if test="age!=null">
                age
            </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>
        </trim>
    </insert>

解释:

1.insert id=“”,这里的名字就是表示的进行数据接收的方法名,

2.在进行insert into user_info后就是进行动态SQL的操作,以<trim>标签开始:

基于 prefix 配置,开始部分加上 (
• 基于 suffix 配置,结束部分加上 )
• 多个 组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于
suffixOverrides 配置去掉最后⼀个 ,

3.if标签开始,进行判断输入的参数是否为空,如果存在就进行条件的添加,如果没有,那么就不会添加这里的条件;

4.每个test里的属性就表示的就是对象传入的属性,注意不是数据库的字段

1.3<where>标签

咱们还是先试用,然后进行讲解,具体的代码如下所示:

 <select id="selectByUser" resultType="com.example.mybatis.Model.UserInfo">
        select * from user_info 
        <where>
            <if test="username !=null">
                user_name=#{username}
            </if>
            <if test="age !=null">
                and age=#{age}
            </if>
        
        </where>
    </select>

解释:

这里小编这里只列举了几个属性,那么where标签的使使用就是可以代替上述的<trim>标签

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

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

1.4<set>标签

具体的实例代码如下所示:

 <update id="update">
        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 id=#{id}
    </update>

解释:<set>标签的作用:

<set> :动态的在SQL语句中插⼊set关键字,并会删掉额外的逗号. (⽤于update语句中)
以上标签也可以使⽤ <trim prefix="set" suffixOverrides=","> 替换;

1.5<foreach>标签

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

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

具体的代码实例就是如下的:

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

解释:

这里就是SQL的意思就是

delete from user_info where id in (11, 12, 13)

instanc就是列表的名字,id可以理解为数据库字段,id= #{id}; 

1.6<include>标签

 在我们编写SQL的时候存在,重复的语句,就会有很多冗余的代码。例如:

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

• <sql> :定义可重⽤的SQL⽚段
• <include> :通过属性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>

解释:

此时即时我们将这里的查询的数据库字段进行了封装,取名叫做allcolumn,然后再使用的时候使用<include>标签进行SQL片段的使用;

📚️2.总结

本期小编主要讲解了动态SQL的使用,具体包括<if><trim><where><set><forearch><include>标签,主要还是使用,概念不是很重要

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

       😊😊  期待你的关注~~~

相关文章:

  • day9手机创意软件
  • 小程序canvas2d实现横版全屏和竖版逐字的签名组件(字帖式米字格签名组件)
  • Java面试题总结 - Java多线程篇(附答案)
  • Open Liberty使用指南及微服务开发示例(二)
  • DataBase【MySQL基础夯实使用说明(下)】
  • 在软件产品从开发到上线过程中,不同阶段可能出现哪些问题,导致软件最终出现线上bug
  • 网络安全之探险
  • Python Pandas(7):Pandas 数据清洗
  • Log4j定制JSON格式日志输出
  • 常用共轭先验分布
  • AWTK-WEB 快速入门(4) - JS Http 应用程序
  • Redis7——基础篇(一)
  • Jenkins 安装插件 二
  • MySQL - 索引 - 介绍
  • 如何下载Qt和运行第一个程序。
  • 【Elasticsearch】字符过滤器Character Filters
  • 51单片机之引脚图(详解)
  • postgresql源码学习(59)—— 磁盘管理器 SMGR
  • C#快速排序QuickSort将递归算法修改为堆栈Stack非递归方式
  • vue+springboot+webtrc+websocket实现双人音视频通话会议
  • 外交部:习近平主席同普京总统达成许多新的重要共识
  • 上海启动万兆光网试点建设,助力“模速空间”跑出发展加速度
  • 首届上海老年学习课程展将在今年10月举办
  • 欧派家居:一季度营收降4.8%,目前海外业务整体体量仍较小
  • 法治日报:商品明细是隐私,外卖员快递员不应知晓
  • 叙利亚政权领导人首访西方国家,与法国总统讨论叙局势