MyBatis使用技巧、總結、注意事項


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表示一個日期,肯定是有問題的。
  • 如果使用jdbcType=DATETIME:報錯:No enum constant org.apache.ibatis.type.JdbcType.DATETIME
    原因是MyBatis不支持DATETIME類型。實際上,對於MySQL的DATETIME,MyBatis中應該使用jdbcType=TIMESTAMP
    • MyBatis支持的類型:

2.2.3 關於什么時候使用jdbcType?

查詢官網時可以發現

其他情況,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 總結:

以上兩種情況其實一致,都是取對象屬性的默認初始化值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM