工作需要使用mybatis generator,另外Oracle和mybatis也沒有做過深入的了解,只是能用會寫業務代碼,不報錯就可以了。
廢話,割------------------------------------------------------------------------------------------------------------------------------------
在使用Oracle+mybatis做sql查詢時,發現查詢出來的結果只精確到年月日,因為mybatis的orm映射由mybatis generator來做的,所以自己以為在哪個地方業務代碼轉換是出了錯,Debug的時候才發現出錯的是sql查詢。
其中一點在網上找到了(http://www.soso.io/article/72293.html),文章中提到:
mybatis jdbcType: DATE ,TIMESTAMP 區別:
1. mybatis中 jdbcType 時間類型
當jdbcType = DATE 時, 只傳入了 年月日
jdbcType = TIMESTAMP , 年月日+ 時分秒
2. jdbcType 是否必須:
使用時, 沒有加jdbcType 正常,
加上jdbcType原因(網絡): 當傳入字段值為null,時,需要加入. 否則報錯.
於是修改了,sqlMap中的所有jdbcType=DATE 為TIMESTAMP,保存編譯運行結果還是精確到年月日。
翻開舊項目需要差異,發現因為Oracle中的字段類型是Date的緣故,mybatis generator自動生成了幾個個addCriterionForJDBCDate方法,而所有對應Date類型的字段,都使用了該方法,代碼如下:
1 protected void addCriterionForJDBCDate(String condition, Date value, String property) { 2 if (value == null) { 3 throw new RuntimeException("Value for " + property + " cannot be null"); 4 } 5 addCriterion(condition, new java.sql.Date(value.getTime()), property); 6 } 7 8 protected void addCriterionForJDBCDate(String condition, List<Date> values, String property) { 9 if (values == null || values.size() == 0) { 10 throw new RuntimeException("Value list for " + property + " cannot be null or empty"); 11 } 12 List<java.sql.Date> dateList = new ArrayList<java.sql.Date>(); 13 Iterator<Date> iter = values.iterator(); 14 while (iter.hasNext()) { 15 dateList.add(new java.sql.Date(iter.next().getTime())); 16 } 17 addCriterion(condition, dateList, property); 18 } 19 20 protected void addCriterionForJDBCDate(String condition, Date value1, Date value2, String property) { 21 if (value1 == null || value2 == null) { 22 throw new RuntimeException("Between values for " + property + " cannot be null"); 23 } 24 addCriterion(condition, new java.sql.Date(value1.getTime()), new java.sql.Date(value2.getTime()), property); 25 }
其中Java.sql.Date(value1.getTime())結果是精確到年月日,至於為什么,后續有時間補充。