Mybatis where 1=1 和 <where>标签

MyBatis动态SQL技巧
   <select id="selSampleListByIDX4" resultMap="BaseResultMap" parameterType="cn.com.git.cbs.datamodel.TBL_Sample">
    select 
    <include refid="Base_Column_List" />
    from SAMPLE
    where 1=1   
      <if test="samplenumber != null" >
        AND SAMPLENUMBER = #{samplenumber,jdbcType=DECIMAL}
      </if>
   </select> 


Mybatis  之前拼条件的时候 写法  where 1=1,也可以使用<where>标签

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  <where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。

如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制我们想要的功能。比如,和 where 元素等价的自定义 trim 元素为:


<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>




``` <?xml version="1.0" encoding="UTF-8" ?> ``` 这是 XML 文件的声明语句,指定该文档使用 XML 1.0 版本,并以 UTF-8 字符编码格式解析。确保中文等多字节字符能正确读取,避免乱码问题。 ``` <!-- sky-server\src\main\resources\mapper\AddressBookMapper.xml --> ``` 这是一个 XML 注释,用于说明当前文件在项目中的完整路径。它不是代码的一部分,仅作为开发人员的参考信息,帮助定位该映射文件的位置。 ``` <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > ``` 这是文档类型定义(DTD),声明该 XML 文件遵循 MyBatis 框架的 Mapper DTD 规范(版本 3.0)。 - `PUBLIC` 表示这是一个公开的 DTD; - `"//mybatis.org//DTD Mapper 3.0//EN"` 是公共标识符,表示 MyBatis 映射文件的标准; - `"http://mybatis.org/dtd/mybatis-3-mapper.dtd"` 是 DTD 文件的实际网络地址,XML 解析器会根据此地址验证文件结构是否合法。 ``` <mapper namespace="com.sky.mapper.AddressBookMapper"> ``` 定义一个 `<mapper>` 根元素,其 `namespace` 属性指向对应的 Java 接口全限定名:`com.sky.mapper.AddressBookMapper`。 这意味着该 XML 中的所有 SQL 语句将与接口中的方法通过 `id` 进行绑定。例如,`<select id="list">` 对应接口中名为 `list` 的方法。 ``` <select id="list" parameterType="com.sky.entity.AddressBook" resultType="com.sky.entity.AddressBook"> select * from address_book <where> <if test="userId != null"> and user_id = #{userId} </if> <if test="phone != null"> and phone = #{phone} </if> <if test="isDefault != null"> and is_default = #{isDefault} </if> </where> </select> ``` - `<select>`:定义一条查询 SQL 语句。 - `id="list"`:唯一标识符,对应 `AddressBookMapper` 接口中名为 `list` 的方法。 - `parameterType="com.sky.entity.AddressBook"`:指定传入参数类型为 `AddressBook` 实体类对象,MyBatis 将从中提取属性值用于条件判断占位符填充。 - `resultType="com.sky.entity.AddressBook"`:指定查询结果每一行自动映射为一个 `AddressBook` 对象。 - SQL 主体为 `select * from address_book`。 - `<where>`:智能拼接 WHERE 条件: - 自动处理第一个条件前的 `AND` 或 `OR`; - 若无任何条件成立,则不会生成 `WHERE` 子句,防止语法错误。 - `<if test="...">`:动态 SQL 判断标签: - 当 `test` 表达式为 true(如属性非 null)时,才拼接内部的 SQL 片段; - 例如:若 `userId != null`,则添加 `and user_id = #{userId}` 到 SQL 中; - `#{userId}` 是预编译占位符,防止 SQL 注入,从传入对象中获取 `userId` 属性值。 ``` <update id="update" parameterType="com.sky.entity.AddressBook"> update address_book <set> <if test="consignee != null"> consignee = #{consignee}, </if> <if test="sex != null"> sex = #{sex}, </if> <if test="phone != null"> phone = #{phone}, </if> <if test="detail != null"> detail = #{detail}, </if> <if test="label != null"> label = #{label}, </if> <if test="isDefault != null"> is_default = #{isDefault}, </if> </set> where id = #{id} </update> ``` - `<update>`:定义一条更新 SQL 语句。 - `id="update"`:对应接口中 `update` 方法。 - `parameterType="com.sky.entity.AddressBook"`:传入参数是一个 `AddressBook` 对象。 - SQL 主体为 `update address_book ...`。 - `<set>`:智能生成 `SET` 子句: - 只拼接那些条件为真的字段; - 自动去除最后一个多余的逗号(`,`); - 如果没有字段满足条件,SQL 将无效(需业务层保证至少有一个字段更新)。 - 多个 `<if>` 块分别判断各个字段是否非 null,若是则将其加入 SET 更新列表; - 最终必须通过 `where id = #{id}` 精确匹配要更新的记录,防止误改其他数据。 ``` </mapper> ``` 闭合根标签 `<mapper>`,表示整个 MyBatis 映射文件结束。 总结: 该 XML 文件是 MyBatis 的映射配置文件,用于实现 `AddressBookMapper` 接口中的 `list` `update` 方法。通过动态 SQL 实现灵活的条件查询与部分字段更新,避免硬编码 SQL,提升可维护性安全性。结合 `#{}` 占位符防止 SQL 注入,利用 `<where>` `<set>` 实现智能语句拼接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值