mybatis的常用标签用法总结

本文深入解析MyBatis框架中关键的SQL映射标签,包括selectKey用于自增ID,isNotNull和isNotEmpty用于动态SQL,以及include标签实现代码复用。掌握这些标签能显著提升开发效率和代码质量。

一、背景

在我们的学习过程中,我们经常使用到mybatis,这里主要讲讲常用的标签,这样你也可以在面试官面前有底气了,那下面我们就来讲讲这些常用的标签,再说了标签不熟悉非常影响开发效率和质量。好了废话不多说了。

二、selectKey

1.应用场景:新增数据时

2.插入数据并且返回当前数据的id

<insert id="selectUser">
    <!-- selectKey 标签表示子查询中主键的提取问题
    keyColumn表示查询语句返回结果的列名
    keyProperty表示将属性设置到某个列中 此处为id中
    order="AFTER"表示在插入语句之后执行
    resultType="long"表示返回值得类型为long类型
    -->
    <selectKey keyColumn="myId" keyProperty="id" order="AFTER" resultType="long">
       select max(id)+1 as myId from user
    </selectKey>
    <!-- 注意此处的id必须和selectKey中返回结果的列名一致
         此处的name必须和测试类中map设置的key的名字一致,此处
         的address必须和测试类中map设置的key的名字一致
    -->
    insert into user(id,name,address) values(#{id},#{name},#{address})
</insert>

三、isNotNull

1.应用场景:动态拼接sql条件

2.isNotNull,它的含义就是不为null,也就是<>null。

区别isNotEmpty,它的含义就是不为空,也就是<>null,并且<>''(空字符串)下面会讲。

3.例子

UPDATE
    PRODUCT P
SET
    UPDATE_TIME = SYSDATE
    <isNotEmpty prepend="AND" property="productName">
        P.PRODUCT_NAME = #productName#
    </isNotEmpty>
WHERE
    P.PRODUCT_ID = #productId#

四、isNotEmpty

1.应用场景:动态拼接sql条件

2.isNotEmpty,它的含义就是不为空,也就是<>null,并且<>''(空字符串)。

3.例子

UPDATE
    PRODUCT P
SET
    UPDATE_TIME = SYSDATE
    <isNotNull prepend="AND" property="productName">
        P.PRODUCT_NAME = #productName#
    </isNotNull>
WHERE
    P.PRODUCT_ID = #productId#

五、include

1.应用场景:多个sql的查询数据一样时,复用方便后期维护

2.相当于代码复用,定义好

<sql id="my.full.columns">
id,
gmt_create,
gmt_modified
</sql>
在不同的select语句复用
<include refid="my.full.columns"/>

六、结束

常用的理解一下!!!

<think>我们正在讨论MyBatis中的动态SQL标签,特别是`isNotEqual`标签。根据引用[4]和引用[3]中的示例,我们可以总结出`isNotEqual`标签的基本用法。 引用[3]中给出了一个使用`isNotEqual`的示例: <isNotEqual property="status" compareValue="0" prepend="and"> STATUS=#status# </isNotEqual> 引用[4]中也有类似的动态SQL标签使用示例(虽然示例中用的是`isGreaterThan`,但结构类似)。 因此,我们可以这样描述`isNotEqual`标签: 作用:用于判断某个属性值是否不等于指定的比较值,如果不等于,则将其包含的SQL片段包含在查询中。 属性: - property:需要比较的属性(参数)名。 - compareValue:与之比较的值(常量)。 - prepend:可选项,在生成的SQL片段前添加的字符串(如“and”、“or”等),通常用于连接条件。 注意:在MyBatis 3.x中,由于提供了更强大的OGNL表达式,通常建议使用`<if>`标签代替旧的标签(如`isNotEqual`),因为`<if>`标签更灵活。但了解旧版标签仍有必要,因为一些旧项目可能还在使用。 另外,引用[5]提到一个关于Integer类型0和字符串比较的问题,这提醒我们在使用比较标签时要注意数据类型,确保比较的双方类型一致,否则可能出现非预期的结果。 因此,我们可以这样回答用户的问题:</think>### MyBatis `isNotEqual` 标签使用详解 `isNotEqual` 标签MyBatis 动态 SQL 中的条件判断标签,用于在 XML 映射文件中判断参数值是否不等于指定值,从而动态生成 SQL 片段。以下是具体用法和注意事项: #### 1. **基本语法** ```xml <isNotEqual property="参数名" compareValue="比较值" prepend="前缀"> SQL 片段 </isNotEqual> ``` - **property**:传入参数的属性名(必填)。 - **compareValue**:用于比较的固定值(必填)。 - **prepend**:当条件成立时,在 SQL 片段前添加的关键字(如 `AND`、`OR` 等,可选)。 #### 2. **使用示例** 假设需要查询状态码不为 `0` 的用户数据: ```xml <select id="selectUsers" parameterType="map" resultType="User"> SELECT * FROM user WHERE 1=1 <isNotEqual property="status" compareValue="0" prepend="AND"> status = #{status} </isNotEqual> </select> ``` - 若传入参数 `status != 0`,生成的 SQL 为: ```sql SELECT * FROM user WHERE 1=1 AND status = ? ``` - 若传入参数 `status == 0`,则整个 `<isNotEqual>` 块会被忽略。 #### 3. **数据类型注意事项** - **比较值类型需匹配**:`compareValue` 必须与参数类型一致。例如参数为 `Integer` 时,`compareValue="0"` 实际会按字符串 `"0"` 比较,可能导致非预期结果(如 `Integer(0)` 与 `String("0")` 比较可能返回 `false`)[^5]。 - **推荐解决方案**: 使用 `<if>` 标签替代,避免隐式类型转换问题: ```xml <if test="status != null and status != 0"> <!-- 明确类型比较 --> AND status = #{status} </if> ``` #### 4. **替代方案(推荐)** 在 MyBatis 3.x 及以上版本,**建议使用更灵活的 `<if>` 标签**: ```xml <if test="param != compareValue"> SQL 片段 </if> ``` 优势: - 支持任意 OGNL 表达式(如 `status != 0 and status != null`)。 - 避免类型转换陷阱。 #### 5. **常见错误** - **混淆 `resultType` 和 `resultMap`**:动态 SQL 标签不影响返回类型定义,需确保正确使用 `resultType`(直接映射)或 `resultMap`(自定义映射)[^2]。 - **忽略数据类型**:如将数字与字符串比较,可能导致条件失效[^5]。 --- ### 相关问题 1. **MyBatis 中 `<if>` 和 `<isNotEqual>` 标签的主要区别是什么?** 2. **如何避免 MyBatis 动态 SQL 中的数据类型不匹配问题?** 3. **除了 `isNotEqual`,MyBatis 还有哪些动态条件标签(如 `isNull`、`isEmpty`)?** 4. **在复杂查询中,`resultMap` 相比 `resultType` 有哪些优势?**[^2] [^1]: MyBatis 常用标签总结 [^2]: `resultType` 与 `resultMap` 的区别及常见错误 [^3]: `isNotEqual` 基础用法示例 [^4]: 动态 SQL 的通用解决方案 [^5]: 数据类型不匹配导致的非预期结果分析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值