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

Mybatis 9种动态 sql 标签使用

MyBatis提供了9种动态SQL标签:trim、where、set、foreach、if、choose、when、otherwise、bind;

1.if 标签

<select id="getUser">
    select * from User
    <where>
        <if test=" age != null ">
            and age > #{age}
        </if>
        <if test=" name != null ">
            and name like concat(#{name},'%')
        </if>
    </where>
</select>

2.choose 标签、when 标签、otherwise 标签

<select id="getUser">
    select * from User
    <where>
        <choose>
            <when test=" age != null ">
                and age > #{age}
            </when>
            <when test=" name != null ">
                and name like concat(#{name},'%')
            </when>
            <otherwise>
                and sex = '女'
            </otherwise>
        </choose>
    </where>
</select>

3.foreach 标签

<select id="findAll">
    select  * from user where ids in
    <foreach collection="list"
             item="item" index="index"
             open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

最终拼接完整的语句就变成:
select  * from user where ids in (1,2,3,...,100);

当然你也可以这样编写:
<select id="findAll">
    select  * from user where
    <foreach collection="list"
             item="item" index="index"
             open=" " separator=" or " close=" ">
        id = #{item}
    </foreach>
</select>

最终拼接完整的语句就变成:
select  * from user where id =1 or id =2 or id =3  ... or id = 100;

4.where 标签、set 标签

<select id="getUser">
    select * from User
    <where>
        <if test=" age != null ">
            and age > #{age}
        </if>
        <if test=" name != null ">
            and name like concat(#{name},'%')
        </if>
    </where>
</select>
<update id="updateUser">
    update user
    <set>
        <if test="age !=null">
            age = #{age},
        </if>
        <if test="username !=null">
            username = #{username},
        </if>
        <if test="password !=null">
            password = #{password},
        </if>
    </set>
    where id =#{id}
</update>

注意,set 标签之所以能够支持去除前缀逗号或者后缀逗号,
是由于其在构造 trim 标签的时候进行了前缀后缀的去除设置,而 where 标签在构造 trim 标签的时候就仅仅设置了前缀去除。

5.trim 标签

<trim prefix="SET" prefixOverrides="," >
    ...
</trim>

或者

<trim prefix="SET" suffixesToOverride="," >
    ...
</trim>

由于 where 标签和 set 标签这两种 trim 标签变种方案已经足以满足我们实际开发需求,所以直接使用 trim 标签的场景实际上不太很多(其实是我自己使用的不多,基本没用过)。

6.bind 标签

平时你使用 mysql 都是如何拼接模糊查询 like 语句的 ( oracle 不支持)
select * from user where name like concat('%',#{name},'%')


<select id="selecUser">
    <bind name="myName" value="'%' + _parameter.getName() + '%'" />
    SELECT * FROM user
    WHERE name LIKE #{myName}
</select>

无论使用哪种数据库,这个模糊查询的 Like 语法都是支持的

拓展:sql标签 + include 标签

<!-- 可复用的字段语句块 -->
<sql id="userColumns">
    id,username,password
</sql>
查询或插入时简单复用:

<!-- 查询时简单复用 -->
<select id="selectUsers" resultType="map">
    select
    <include refid="userColumns"></include>
    from user
</select>


http://www.kler.cn/a/328615.html

相关文章:

  • android 如何获取当前 Activity 的类名和包名
  • thinkphp6 入门(2)--视图、渲染html页面、赋值
  • 2411rust,1.80
  • MySQL的聚簇索引和二级索引
  • 一体化运维监控管理平台:产品架构与功能解析
  • 【SQL】mysql常用命令
  • 基于深度学习的任务序列中的快速适应
  • 基于微信小程序的宿舍报修系统的设计与实现(lw+演示+源码+运行)
  • 正交阵的概念、性质与应用
  • 激光切割机适用材质有哪些
  • 证件照换底色免费
  • Nginx基础详解4(location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖)
  • Vue.js 组件开发
  • 【数据库】 MongoDB 查看当前用户的角色和权限
  • C++八股进阶
  • 【API安全】crAPI靶场全解
  • (void*) 是啥意思
  • 【Vue】为什么 Vue 不使用 React 的分片更新?
  • 重置linux后vscode无法再次使用ssh连接
  • C# HttpClient请求URL重定向后丢失Authorization认证头
  • 基于RustDesk自建远程桌面服务
  • 0基础学前端 day9--css布局
  • UI设计师面试整理-团队合作与沟通能力
  • 深度学习·wandb
  • 自然语言处理问答系统技术
  • html5 + css3(下)