MyBatis注意事项

1.在<where>标签中为保证某一条件为true,且不影响其他判断条件。最简单的解决方式:

<where>  
  <if test="true">  
    GMT_MODIFY = now()  
  </if>  
</where>  
或者  
<where>  
  <if test="1==1">  
    GMT_MODIFY = now()  
  </if>  
</where>

2.Oracle、MySQL插入时返回主键的操作

Oracle:  
<insert id="insert" parameterClass="Cont">  
    <selectKey keyProperty="id" resultClass="java.lang.Long" type="pre">  
        SELECT SEQ_CONT.NEXTVAL AS ID FROM DUAL  
    </selectKey>  
    insert into CONT(ID, NAME, GMT_CREATE, GMT_MODIFY) values (#{id}, #{name}, sysdate, sysdate)  
</insert>  
注意:这边的keyProperty="id"中"id"指的是Java对象Cont中的属性,而并非数据库中CONT表的属性。
MySQL:  
<insert id="insert" parameterType="Role" useGeneratedKeys="true" keyProperty="roleId">  
    insert into role (name, create_time, update_time) values (#{name,jdbcType=VARCHAR}, now(), now())  
</insert>  
注意:role表的role_id字段是自动增长的,所以插入时不需要传入值;keyProperty="roleId"中"roleId"指的是Java对象Role中的属性,而并非数据库中role表的属性。  

3.插入、修改时存储创建、修改时间为数据库时间

Oracle:  
insert into CONT(ID, NAME, GMT_CREATE, GMT_MODIFY) values (#{id}, #{name}, sysdate, sysdate)  
  
MySQL:  
insert into role (name, create_time, update_time) values (#{name,jdbcType=VARCHAR}, now(), now())  

4.关系运算符的处理及转义

主要处理的是小于/小于等于符号(”<“/”<=“)与XML的尖括号”<“之间的冲突。可以用以下代码解决:

<where>  
    <if test="id != null">  
        <![CDATA[ AND T.ID < #{id} ]]>  
    </if>  
    ...  
</where>  
包含在<![CDATA[      ]]>之间即可避免  

注:在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]>来解决。

<![CDATA[   ]]> 是什么,这是XML语法。在CDATA内部的所有内容都会被解析器忽略。

如果文本包含了很多的"<"字符 <=和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。

但是有个问题那就是 <if test="">   </if>   <where>   </where>  <choose>  </choose>  <trim>  </trim> 等这些标签都不会被解析,所以我们只把有特殊字符的语句放在 <![CDATA[   ]]>  尽量缩小 <![CDATA[  ]]> 的范围。

或者直接进行转义

<where>  
    <if test="id != null"><!-- 大于号(>) -->  
        AND T.ID &gt;= #{id, jdbcType=BIGINT}  
    </if>  
    <if test="id != null"><!-- 小于号(<) -->  
        AND T.ID &lt;= #{id, jdbcType=BIGINT}  
    </if>  
    ...  
</where>  

常用转义字符如下:

显示结果

描述

实体名称

实体编号

 

空格

&nbsp;

&#160;

<

小于号

&lt;

&#60;

>

大于号

&gt;

&#62;

&

和号

&amp;

&#38;

"

引号

&quot;

&#34;

 

5.批量插入、修改、删除操作

<!-- MySQL批量插入 -->  
<insert id="insertBatch" parameterType="java.util.List">  
  insert into role_authority (role_id, authority_id) values  
  <foreach collection="list" item="item" index="index" separator=",">  
    (${item.roleId}, ${item.authorityId})  
  </foreach>  
</insert>  
  
<!-- MySQL、Oracle通过主键集合批量删除记录 -->  
<delete id="batchRemove" parameterType="java.util.List">  
  DELETE FROM ld_user WHERE id IN  
  <foreach item="item" index="index" collection="list" open="(" separator="," close=")">  
     #{item}  
  </foreach>  
</delete>  
  
<!-- 批量修改与批量删除类似 -->  

注意:SQL的执行长度有限制,需要注意不能超长

6.模糊查询:

<if test="entName != null and entName != ''">  
    AND t2.`name` LIKE "%"#{entName,jdbcType=VARCHAR}"%"  
    <!-- '%${entName,jdbcType=VARCHAR}%' -->  
</if>  
或者  
<if test="voucherName != null">  
    AND voucher_name = CONCAT('%',#{voucherName,jdbcType=VARCHAR},'%')  
</if>  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ke&chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值