MyBatis使用技巧、总结、注意事项

本文深入探讨MyBatis的官方文档资源,解析代码中使用like操作符的技巧,揭示数据库日期比较的常见错误及其解决办法,同时分析SQL与resultMap字段对应关系异常的原因,帮助开发者提升MyBatis使用技能。

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

1、mybatis的官方文档地址

mybatis – MyBatis 3 | 简介

2、其他技巧:

2.1 如何在代码中拼接 like %%

<![CDATA[ and strategy_name like CONCAT('%',CONCAT(#{query.strategyName,jdbcType=VARCHAR},'%')) ]]>

其他如果只需要一个%,酌情使用CONCAT

2.2 数据库比较时日期的错误操作

2.2.1 异常情况:

1、DAO中对属性赋值,为Date类型;
@Override
public List<DataStatistic> getSumarry(DataStatisticQuery query) {
    List<String> tableSuffixList = Arrays.asList(VirtualOrderUtils.createStringArray());
    Map<String, Object> map = Maps.newHashMap();
    map.put("tabCode", query.getTabCode());
    map.put("tableSuffixList", tableSuffixList);
    map.put("orderTimeBegin", query.getOrderTimeBegin());
    map.put("orderTimeEnd", query.getOrderTimeEnd());
    return this.selectList(this.getNameSpace("getSumarry"), map);
}
 
2、保证数据库中数据一致。XML 文件中如下使用:
2.1、查不到数据
<sql id="WHERE_ORDER_TIME_BEGIN_AND_END">
    <if test="orderTimeBegin != null">
        <![CDATA[ and  order_time >= #{orderTimeBegin,jdbcType=DATE}]]>
    </if>
    <if test="orderTimeEnd != null">
        <![CDATA[ and  order_time <= #{orderTimeEnd,jdbcType=DATE}]]>
    </if>
</sql>
 
而实际上:数据库中该字段的类型是:【`order_time` datetime DEFAULT NULL COMMENT '下单时间',】
 
2.2、可以查到数据
<sql id="WHERE_ORDER_TIME_BEGIN_AND_END">
    <if test="orderTimeBegin != null">
        <![CDATA[ and  order_time >= #{orderTimeBegin}]]>
    </if>
    <if test="orderTimeEnd != null">
        <![CDATA[ and  order_time <= #{orderTimeEnd}]]>
    </if>
</sql>

上面SQL的区别在于:

  • 查不到是因为在拼接SQL时,取DAO层的值时,在字段后面添加了jdbcType=DATE。导致无法查到。暂时不知道原因是什么,但要注意避免这种使用方式。

2.2.2 为什么会在后面指定jdbcType,及真正的错误与那样?

  • 因为使用一个插件自动生成SQL,里面都有这个东西,所以就直接用了。

最终错误原因:不是不能用jdbcType,而是我jdbcType映射的类型写错了。应用jdbcType=TIMESTAMP

关于jdbcType的使用:

  • DATE和DATETIME的区别。DATE表示一个日期,肯定是有问题的。
    20190911155230.png
  • 如果使用jdbcType=DATETIME:报错:No enum constant org.apache.ibatis.type.JdbcType.DATETIME
    原因是MyBatis不支持DATETIME类型。实际上,对于MySQL的DATETIME,MyBatis中应该使用jdbcType=TIMESTAMP
    • MyBatis支持的类型:
      20190911160956.png

2.2.3 关于什么时候使用jdbcType?

查询官网时可以发现

20190911145105.png

其他情况,MyBatis大部分场景可以自动分析出来。实际上,myBatis没有说什么时候用什么时候不用,感觉都可以使用,不区分select或者insert等语句,的。

2.3 SQL和resultMap中字段对应关系异常分析

只有两种异常情况:

  • SQL中有,ResultMap中没有;
  • 或者SQL中没有,ResultMap中有。

如果都有或者都没有,那就不会出现异常。

2.3.1 SQL中有,ResultMap中没有:

即ResultMap中的值不会被赋予从数据库中查到的值,因为没法把这个字段的值赋给具体的对象属性。
所以实际会取对象中的默认值:基本类型取初始化值,对象类型取null。

2.3.2 SQL中没有,ResultMap中有

还是ResultMap中的值不会被赋予从数据库中查到的值,因此根本不查这个字段。
所以实际会取对象中的默认值:基本类型取初始化值,对象类型取null。

2.3.3 总结:

以上两种情况其实一致,都是取对象属性的默认初始化值。

转载于:https://www.cnblogs.com/buwuliao/p/11506926.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值