MyBatis--动态sql

动态sql

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。动态 SQL 可以彻底处理条件地串联 SQL 字符串减少程序员的压力,让程序员将更多地精力投入开发业务中。

MyBatis 中用于实现动态 SQL 的元素主要有:

If 标签可以对传入的条件进行判断

#{}占位符,预编译,先编译好sql语句在取值,防止sql注入(传值时使用)
${}拼接符,会传入参数字符中,取值后再编译sql,不能防止注入
${}适用于select * from user order by ${name}  
insert into user values (3,'jim',22)
useGeneratedKeys="true"返回主键  
keyProperty="id" 用bean下的属性接收  
keyColumn="id" 数据库中的列

where 标签

会进行判断,如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉AND 或 OR。

 <select id="findUser" resultType="User">
        select * from user
     
     	<!--
			<if test="">条件判断
			<where>当条件成立时,插入where关键字,否则不插入
					会取出where 语句中开头的and  or 等关键字
		-->
        <where>
            <if test="address!=null">
                and address = #{address}
            </if>
            <if test="user_name!=null">
                and user_name = #{user_name}
            </if>
        </where>
  </select>

trim 标签

其实用 trim 也可以表示,当 WHERE 后紧随 AND 或则 OR 的时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定内容

使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分

 <select id="findUser" resultType="User">
        select * from user
       <trim prefix="where" prefixOverrides="and | or">
            <if test="address!=null">
                and address = #{address}
            </if>
            <if test="user_name!=null">
                and user_name = #{user_name}
            </if>
        </trim>
    </select>

模糊查询

	 <!--
    模糊查询
        1.在mapper中  user_name like '%${user_name}%'
        2.在传值时候拼接好 map.put("user_name","%j%");
		3.使用concat('%',#{user_name},'%')
    -->
    <select id="findUser1" resultType="User">
        select * from user
        <where>
            <if test="user_name!=null">
                and user_name like concat('%',#{user_name},'%')
            </if>
        </where>
    </select>

set 元素可以把最后一个逗号去掉

<update id="update" parameterType="User">
        update user 
        <set>
            <if test="userName!=null">
                user_name = #{userName},
            </if>
            <if test="age!=null">
                age = #{age},
            </if>
            <if test="mobile!=null">
                mobile = #{mobile},
            </if>
            <if test="address!=null">
                address = #{address}
            </if>
        </set>

        where id = #{id}
</update>

也可以使用trim实现

<update id="update" parameterType="User">
        update user
        <trim prefix="set" suffixOverrides=",">
            <if test="userName!=null">
                user_name = #{userName},
            </if>
            <if test="age!=null">
                age = #{age},
            </if>
            <if test="mobile!=null">
                mobile = #{mobile},
            </if>
            <if test="address!=null">
                address = #{address}
            </if>
        </trim>
        where id = #{id}
</update>

Foreach元素

主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。

在使用 foreach 的时候最关键的也是最容易出错的就是 collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。

– 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 list

– 如果传入的是单参数且参数类型是一个 array 数组的时候,collection 的属性值为array

适用范围,删除多个数据

item 表示集合中每一个元素进行迭代时的别名

index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置

open 表示该语句以什么开始

separator 表示在每次进行迭代之间以什么符号作为分隔符

close 表示以什么结束

 <delete id="deleteUser" parameterType="User">
        delete  from user where id IN
        <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
 </delete>

特殊符号处理

在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:<、>、"、&、<>
等,正常书写 mybatis 会报错,需要对这些符号进行转义。具体转义如下所示:
特殊字符 转义字符

< &lt;
> &gt; 
" &quot;&apos;
& &amp;

也可以使用<![CADTA[]]>来包裹特殊字符,但是这种方式所在的内容会被解析器忽略,应减少使用

<if test="id != null">
	AND <![CDATA[ id <> #{id} ]]>
</if>	
  • 14
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 32
    评论
Mybatis-plus是在Mybatis基础上进行封装的一个框架,它简化了平时开发过程对常用接口的调用,可以省去一些繁琐的操作。然而,对于一些更为复杂的查询,Mybatis-plus可能无法满足需求,此时就需要我们自定义SQL语句来实现。通过在入口类的MybatisSqlSessionFactoryBuilder#build方法注入mybatis-plus自定义的动态配置xml文件,可以实现自定义SQL语句动态SQL的功能。具体的实现步骤如下: 1. 在应用启动时,在入口类的MybatisSqlSessionFactoryBuilder#build方法mybatis-plus的自定义动态配置xml文件注入到Mybatis。 2. 在自定义的动态配置xml文件,可以使用各种Mybatis-plus提供的方法来实现动态SQL的功能,比如IF标签、CHOOSE标签、FOREACH标签等。 3. 在自定义SQL语句,可以结合Mybatis-plus的Wrapper类来实现条件查询,例如使用LambdaQueryWrapper来构建查询条件。 总结起来,Mybatis-plus提供了简化开发的接口,但对于一些更为复杂的查询,仍然需要我们自定义SQL语句动态SQL来实现。通过注入自定义的动态配置xml文件,并结合Mybatis-plus提供的方法和Wrapper类,可以实现更加灵活和高效的数据查询。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [mybatis-plus/mybatis 自定义 sql 语句、动态 sql](https://blog.csdn.net/CREATE_17/article/details/109117091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Mybatis Plus实现动态SQL语句的原理,你知道吗?](https://blog.csdn.net/weixin_38405253/article/details/119880820)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值