目錄
1、mybatis的官方文檔地址
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支持的類型:
- 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 總結:
以上兩種情況其實一致,都是取對象屬性的默認初始化值。