mybatis-select与update多字段判断拼接-xml写法

本文总结了使用MyBatis进行动态SQL操作,包括在select和update语句中如何根据对象属性进行多字段的条件判断拼接。在查询时,利用`if`标签和`include`实现条件复用,而在更新操作中,使用`case when`进行字段判断更新。这些技巧提高了代码的复用性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近用mybatis进行select和update操作,因为一般只传入一个对象,却只对其中某些属性进行查询或更新,这时要写通用的sql语句,就必然涉及到多字段判断拼接。在这里做一个总结:

1. select多字段判断拼接

只传一个ArticleQuery对象,返回Article对象,常用

    <!--文章查询的sql片断,建议是以单表为单位定义查询条件,建议将常用的查询条件都写出来-->
    <sql id="query_items_where">
        <if test="name!=null and name!=''">
            and name like '%${name}%'
        </if>
        <if test="title!=null and title!=''">
            and title like '%${title}%'
        </if>
        <if test="articleId!=null">
            and article_id = #{articleId}
        </if>
    </sql>


    <select id="queryByCondition" parameterType="ArticleQuery" resultType="Article">
            <!-- 注意ORDER BY后面用的是$而不是# -->
            select * from articles
            <where>
                <include refid="query_items_where" />
            </where>
            <!-- 排序字段判断 -->
            <if test="sort!=null and sort!=''">
                ORDER BY ${sort}
            </if>
           	<! -- 排序方向判断 -->
            <if test="direction!=null and direction!=''">
                ${direction}
            </if>

    </select>

主要通过“if”对字段是否为空进行判断,其中用到了“include”把“where”中的字段判断集中起来,这样其他sql语句可以复用

2. update多字段判断拼接

    <update id="updateArticle" parameterType="Article">
        UPDATE articles SET
         view_num =(case when #{viewNum}=null then view_num else #{viewNum} end),
         comment_num=(case when #{commentNum}=null then comment_num else #{commentNum} end),
         category_id=(case when #{categoryId}=null then category_id else #{categoryId} end),
         like_num=(case when #{likeNum}=null then like_num else #{likeNum} end)

        WHERE article_id=#{articleId}

    </update>

主要就是用“case when”进行字段判断拼接。

<think>嗯,用户想了解MyBatis框架中如何实现动态SQL拼接,特别是动态SQL语句的使用教程。首先,我需要回顾一下MyBatis的动态SQL功能,常见的标签有哪些,以及如何根据条件拼接不同的SQL片段。 根据用户提供的引用内容,比如引用[1]提到了动态SQL就是在拼接SQL,并且有if、choose、trim、foreach等标签。引用[3]和[4]展示了使用LIKE查询和条件判断的例子。引用[5]提到了批量操作的动态拼接。这些信息可以帮助我组织回答的结构。 首先,我需要明确用户的需求。他们可能是在使用MyBatis时遇到需要根据不同条件生成不同SQL语句的情况,比如查询条件不确定、需要批量处理数据或者动态选择字段。用户可能需要一个从基础到进阶的教程,包括各个标签的使用方法和示例。 接下来,我应该分步骤介绍不同的动态SQL标签。比如,先讲<if>标签,用于条件判断;然后是<choose>、<when>、<otherwise>,类似于switch-case结构;接着是<where>和<set>标签,处理WHERE和SET子句的智能处理;再介绍<foreach>处理循环,比如IN语句或批量插入;最后可以提到<trim>、<include>等高级用法。 每个部分需要给出具体的XML配置示例和对应的Java接口方法,这样用户能更直观地理解如何应用这些标签。例如,在讲解<if>标签时,可以举一个根据用户名和年龄查询用户的例子,展示如何在XML中编写动态条件,并解释test表达式中的条件判断。 同时,需要注意用户提到的引用内容,比如引用[3]中的LIKE查询和IN语句,应该在相关部分进行举例说明,比如在<foreach>中处理IN条件,或者在<if>中使用模糊查询。此外,引用[4]中的条件判断和引用[5]的批量更新也是很好的例子,可以展示动态SQL的灵活应用。 用户可能还会关心性能优化和常见问题,比如如何避免SQL注入,动态SQL的调试方法,以及如何组织复杂的SQL语句。这些问题可以作为相关问题的部分,帮助用户进一步深入学习和解决问题。 最后,需要确保回答结构清晰,步骤分明,示例代码正确,并且符合用户要求的格式,比如数学公式的排版和中英文标点。同时,检查引用是否正确标注,例如引用[1]到[5]中的内容是否被正确引用到相关的例子或注意事项中。 总结一下,回答的结构应该是先介绍动态SQL的概念和核心标签,然后分点详细讲解每个标签的用法,并附上示例代码和解释,最后提出相关问题引导用户进一步学习。需要确保覆盖用户可能遇到的主要场景,如条件查询、批量操作、模糊查询等,并结合提供的引用内容给出具体例子。</think>### MyBatis动态SQL拼接详解 MyBatis的动态SQL功能通过**XML标签**实现条件判断、循环、参数拼接等操作,核心标签包括`<if>`、`<choose>`、`<where>`、`<foreach>`、`<set>`和`<trim>`。以下是具体用法和示例: --- #### 一、基础标签使用 1. **`<if>`标签** 根据条件判断是否拼接SQL片段,常用于WHERE子句的条件筛选。 **示例**:按用户名和年龄动态查询用户 ```xml <select id="selectByCondition" resultType="User"> SELECT * FROM users <where> <if test="username != null and username != ''"> AND username LIKE CONCAT('%', #{username}, '%') </if> <if test="age != null"> AND age = #{age} </if> </where> </select> ``` - `test`属性中写OGNL表达式,支持逻辑运算(如`and`、`or`)[^1] - `<where>`标签会智能去除多余的`AND`或`OR`前缀[^4] 2. **`<choose>`标签** 类似Java的`switch-case`结构,多条件互斥时使用。 **示例**:根据优先级查询订单 ```xml <select id="selectOrders" resultType="Order"> SELECT * FROM orders <where> <choose> <when test="priority == 'high'"> status = 'urgent' </when> <when test="priority == 'medium'"> status = 'normal' </when> <otherwise> status IS NOT NULL </otherwise> </choose> </where> </select> ``` --- #### 二、循环批量操作 1. **`<foreach>`标签** 用于遍历集合,生成`IN`条件或批量插入语句。 **示例1**:查询指定ID列表的用户 ```xml <select id="selectByIds" resultType="User"> SELECT * FROM users WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` **示例2**:批量插入数据 ```xml <insert id="batchInsert"> INSERT INTO users (username, age) VALUES <foreach collection="list" item="user" separator=","> (#{user.username}, #{user.age}) </foreach> </insert> ``` 2. **批量更新** 结合`ON DUPLICATE KEY UPDATE`实现(需数据库支持): ```xml <update id="batchUpdate"> INSERT INTO users (id, username) VALUES <foreach collection="list" item="user" separator=","> (#{user.id}, #{user.username}) </foreach> ON DUPLICATE KEY UPDATE username = VALUES(username) </update> ```[^5] --- #### 三、高级用法 1. **`<trim>`标签** 自定义字符串修剪规则,可替代`<where>`或`<set>`。 **示例**:替代`<where>`的写法 ```xml <trim prefix="WHERE" prefixOverrides="AND |OR "> <if test="name != null">AND name = #{name}</if> </trim> ``` 2. **模糊查询** 四种实现方式(以`LIKE '%张%'`为例): - 参数中直接带`%`:`mapper.queryByName("%张%")` - XML拼接:`LIKE CONCAT('%', #{name}, '%')` - 使用`<bind>`标签: ```xml <bind name="pattern" value="'%' + name + '%'"/> LIKE #{pattern} ```[^2] --- #### 四、调试优化建议 1. **日志输出** 在`mybatis-config.xml`中开启日志,查看最终生成的SQL: ```xml <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> ``` 2. **避免SQL注入** - 动态表名/列名使用`${}`时需严格校验参数 - 普通参数使用`#{}`(预编译占位符)[^5] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值