工做須要使用mybatis generator,另外Oracle和mybatis也沒有作過深刻的瞭解,只是能用會寫業務代碼,不報錯就能夠了。html
廢話,割------------------------------------------------------------------------------------------------------------------------------------java
在使用Oracle+mybatis作sql查詢時,發現查詢出來的結果只精確到年月日,由於mybatis的orm映射由mybatis generator來作的,因此本身覺得在哪一個地方業務代碼轉換是出了錯,Debug的時候才發現出錯的是sql查詢。sql
其中一點在網上找到了(http://www.soso.io/article/72293.html),文章中提到:網絡
mybatis jdbcType: DATE ,TIMESTAMP 區別: mybatis
1. mybatis中 jdbcType 時間類型spa
當jdbcType = DATE 時, 只傳入了 年月日code
jdbcType = TIMESTAMP , 年月日+ 時分秒orm
2. jdbcType 是否必須:htm
使用時, 沒有加jdbcType 正常, blog
加上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())結果是精確到年月日,至於爲何,後續有時間補充。