mybatis - [09] 动态SQL

题记部分

 

一、if & test

如果id,name,age不为空,则按照指定的值进行查询。如果这三者都是空(null和空字符串),则该sql执行结果为全表查询的结果集。

<select id="getUserByUser" parameterTytpe="vo.User" resultMap="userResultMap">
    select
        in,name,age
    from
        tb_user
    where 1=1
    <if test="id != null">
        and id = #{id}
    </if>
    <if test="name != null and name !=''">
        and name = #{name}
    </if>
    <if test="age != null">
        and age = #{age}
    </if>
    
</select>

 

 

二、choose & when & otherwise

<select id="getUserByUser" parameterTytpe="vo.User" resultMap="userResultMap">
    select
        in,name,age
    from
        tb_user
    where 1=1
    <choose>
        <when test="id != null">
            and id = #{id}
        </when>
        <when test="name != null and name !=''">
            and name = #{name}
        </when>
        <otherwise>
            and age is not null
        </otherwise>
    </choose>
</select>

 

 

三、where

<select id="getUserByUser" parameterTytpe="vo.User" resultMap="userResultMap">
    select
        in,name,age
    from
        tb_user
    <where>
        <if test="id != null">
            and id = #{id}
        </if>
    </where>
</select>

 

四、trim

有时候,需要去掉一些特殊的SQL语法,比如:and、or。则可以使用trim元素。使用方法如下:

① prefix: 在trim标签内sql语句加上前缀

② suffix: 在trim标签内sql语句加上后缀

③ prefixOverrides: 指定去除多余的前缀内容

④ suffixOverrides: 指定去除多余的后缀内容

<select id="getUserByUser4" parameterType="vo.user" resultMap="userResultMap">
    select
        id,name,age
    from
        tb_user
    <trim prefix="where" prefixOverrides="and">
        and id = #{id}
    </trim>
</select>

 

五、set

set元素会默认把最后一个逗号去掉

<update id="updateUserByUser" parameterType="vo.user">
    update
        tb_user
    <set>
        <if test="name != null and name != ''">
            name = #{name}
        </if>
        <if test="age != null">
            age = #{age}
        </if>
    </set>
    where
    id = #{id}
</update>

 

 

六、foreach

foreach语句用于循环遍历传入的集合数据。使用该方法涉及如下参数:

① collection:传递进来的参数名称,可以是数组、List、Set等集合。

② index: 当前元素在集合的下标位置

③ item: 循环中当前的元素

④ open和close: 使用什么符号包装集合元素。

⑤ separator: 每个元素的间隔符号

<select id="getUserByIds" resultMap="userResultMap">
    select id,name,age from tb_user
    where id in
    <foreach collection="idList" index="index" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

接口定义

public interface UserMapper{
    List<User> getUserByIds(@Param("idList")List<Long> idList);
}

 

七、concat & bind

可以使用这两种方式进行拼装和绑定

<select id="getUserByName" parameterType="string" resultMap="userResultMap">
    select
        id,name,age
    from
        tb_user
    where
        name like concat('%',#{name},'%')
</select>

等同于

<select id="getUserByName" parameterType="string" resultMap="userResultMap">
    <bind name="namePattern" value="'%' + name + '%'"/>
    select
        id,name,age
    from
        tb_user
    where
        name like #{namePattern}
</select>

 

 

 

 

 

 

 

— 业精于勤荒于嬉,行成于思毁于随 —

posted @   HOUHUILIN  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示