Mybatis的动态拼接条件

本文介绍MyBatis中实现复杂条件查询的方法及批量插入数据的技术细节,包括使用if、foreach等标签来构建动态SQL,适用于需要灵活查询与高效数据录入的应用场景。

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

官网的例子永远是最好的,切记切记!! 
拼接条件

    <sql id="select_asset_where">
        <if test="accountType != null and accountType.size != 0" >
            and 
            <foreach collection="accountType" item="param" separator="OR" open="(" close=")">
                a.account_type = #{param}
            </foreach>
        </if>
    </sql>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

条件查询

<select id="selectAssetByCondition"
                parameterType="com.zemcho.controller.asset.dto.AssetConditionDto"   resultMap="AssetCondtitionResultMap">
        SELECT reg_code, asset_name, asset_type, metering_units, use_info, 
                expect_end_date, regist_man, regist_date, account_type, fee_item, 
                finance_bill_date, user, user_account, keeper, checker, 
                buyer, school_addr, account_book, acquire_way, asset_use_way, 
                write_off_date, asset_status_1, store_place, orginal_value, net_value, 
                number_value
        FROM tb_asset_regist_d a
        <if test="assetDepInfo != null" >
            , cfg_asset_dep_info b
        </if>
        <if test="assetTypeInfo != null" >
            , cfg_asset_type_info c
        </if>
        <where>
            <include refid="select_asset_where"></include>
        </where>
</select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

批量插入

宁波好的整形医院http://www.iyestar.com/
宁波最好的整形医院http://www.iyestar.com/

 <!-- 批量插入 -->
    <!-- 批量插入生成的兑换码 -->
    <insert id ="insertBulk" parameterType="java.util.List" >
        <selectKey resultType ="java.lang.Integer" keyProperty= "id"
                order= "AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey >
        insert into `tb_basic_treatment_d`
        (<include refid="Base_Column_List" />,LOAD_TIME)
        values
        <foreach collection ="list" item="item" index= "index" separator =",">
            (
            #{item.name},
            #{item.teacherNumber},
            #{item.idNumber},
            #{item.year},
            #{item.annualWageIncomeYuan},
            #{item.fiveInsuranceAGold},
            #{item.loadTime}
            )
        </foreach >
    </insert >
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

普通查询

 <select id="selectByReaderNum" parameterType="string" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from tb_library_borrower_d
    where reader_id = #{num,jdbcType=VARCHAR} limit 1
  </select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
### MyBatis 动态 SQL 拼接使用教程 #### 基本概念 MyBatis 提供了一套强大的动态 SQL 功能,允许开发者根据不同的条件灵活生成 SQL 语句。这种功能的核心在于一系列标签的支持,比如 `<if>`、`<choose>`、`<when>`、`<otherwise>` 和 `<foreach>` 等[^1]。 --- #### `<if>` 标签的使用 `<if>` 标签是最常用的动态 SQL 控制结构之一,主要用于判断某个条件是否成立并决定是否拼接对应的 SQL 片段。以下是具体示例: 假设有一个查询学生信息的需求,可以根据地址字段进行模糊匹配: ```xml <select id="queryAllByAddress" resultType="Student"> SELECT * FROM student WHERE 1=1 <if test="address != null and address != '' "> AND address LIKE #{address} </if> </select> ``` 上述代码中,当 `address` 参数不为空时会追加 `AND address LIKE #{address}` 条件到最终的 SQL 中[^3]。 --- #### `<foreach>` 标签的使用 `<foreach>` 标签常用于处理集合类型的参数,例如批量更新或删除操作。下面是一个典型的例子——基于多个 ID 查询数据: ```xml <select id="findUsersByIds" parameterType="list" resultType="User"> SELECT * FROM users WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` 在这个场景下,`collection` 属性指定了传入的数据类型(这里是列表),而 `item` 定义了每次迭代取出的对象名称;`open` 和 `close` 则分别表示整个片段的起始和结束字符;`separator` 表明各元素之间的分隔符。 --- #### 批量插入案例 除了简单的查询外,还可以利用 `<foreach>` 实现批量插入的功能。如下所示: ```xml <insert id="batchInsertStudents" parameterType="java.util.List"> INSERT INTO students (name, age, gender) VALUES <foreach collection="list" item="student" separator=","> (#{student.name}, #{student.age}, #{student.gender}) </foreach> </insert> ``` 这里需要注意的是,在实际开发过程中可能还需要考虑数据库对于单条 SQL 插入记录数的限制等问题[^4]。 --- #### 复杂逻辑控制:`<choose>`, `<when>`, `<otherwise>` 类似于 Java 的 switch-case 结构,可以借助这三个标签完成更复杂的分支判断。举个例子来说就是根据不同状态筛选订单详情: ```xml <select id="getOrdersByStatus" resultType="Order"> SELECT * FROM orders o LEFT JOIN order_details od ON o.id = od.order_id <where> <choose> <when test="status == 'PENDING'">o.status = #{status}</when> <when test="status == 'COMPLETED'">o.completed_date IS NOT NULL</when> <otherwise>o.created_at BETWEEN #{startDate} AND #{endDate}</otherwise> </choose> </where> </select> ``` 此部分展示了如何结合多种条件构造出满足业务需求的复杂查询语句[^2]。 --- ### 总结 通过对以上几个典型用法的学习可以看出,掌握好 MyBatis动态 SQL 技巧不仅可以提高程序性能还能增强代码可读性和维护便利度。无论是基础的条件过滤还是高级别的循环嵌套都能轻松应对。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值