mybatis日期查詢
一、專案需求
需求先了解
- 選擇時間間隔 - 點選’查詢按鈕’查詢資料 - 用echarts視覺化資料。
草圖說邏輯
- 先用一張草圖來說明本篇文章的邏輯
注:本篇部落格只討論,mybatis查詢資料技術,如你想了解相關技術請移步到我之前的博文:
二、技術點實現
引數獲取
- 從路徑中拿到需要的引數(不是本章重點,故省略)
mybaitis獲取資料
- 搭好框架,呼叫方法,利用mybatis獲取資料庫資料(不是本章重點,故省略)
後端返回Json資料
- 上圖中,dateMap是mybatis對映方法getHistoryDataByDate的引數 存入了三個引數:動態表名 ‘tableName’=tableName,起始日期 ‘dStart’=dStart,結束日期 ‘dEnd’=dEnd。
Sql語句
- 首先,看看我的sql語句是怎麼寫的
<select id="getHistoryDataByDate" parameterType="java.util.HashMap" resultType="java.util.HashMap">
select * from ${tableName}
<where>
<if test="dStart!=null">
<![CDATA[ and DATE_FORMAT(#{dEnd}, '%Y-%m-%d %H:%T:%s') >=
DATE_FORMAT(#{dStart}, '%Y-%m-%d %H:%T:%s') ]]>
</if>
<if test="dEnd!=null">
<![CDATA[ and DATE_FORMAT(time, '%Y-%m-%d %H:%T:%s') <=
DATE_FORMAT(#{dEnd} , '%Y-%m-%d %H:%T:%s') ]]>
</if>
</where >
order by time desc
</select>
為了讓大家看的清晰點,上一張圖是有必要的
- 然後,再說明一下Sql語句裡的重點
1.為什麼使用Map型別傳參?
答:使用Map型別傳參,在獲取value時,可以直接寫key,如#{dStart},表示獲取Map中key=dStart的值。
或許你會有疑問,為什麼不用註解方式傳參?像這樣:
Map<String, Object> getData(@Param(value="tableName") String tableName);
如果真的這麼幹了,當你需要傳多個引數時,方法引數列表就會拖的很長,不美觀,像這樣:
List<Object>getHistoryDataByDate(@Param(value="tableName")String tableName,@Param(value="dStart") Date dStart,@Param(value="dEnd") Date dEnd);
總之,使用Map傳參,優美,簡潔,大方,值得信賴。
2.為什麼使用${tableName},而不是用#{tableName}?
答:這是mybatis預編譯與非預編譯問題。
${}會被mybatis替換成引數值。如:我傳入的tableName=User,就會select xxx from User,從而實現了動態新增表名。
#{}會被替換成問號?,如:select xxx from User where time between ? and ?
參考部落格:淺談 Mybatis中的 ${ } 和 #{ }的區別
3.if test 語句怎麼使用?
- 判斷條件寫在一起會怎麼呢,像這樣
<if test="dStart!=null and dStart!=''">
<![CDATA[ and DATE_FORMAT(time, '%Y-%m-%d %H:%T:%s')>= DATE_FORMAT(#{dStart}, '%Y-%m-%d %H:%T:%s') ]]>
</if>
<if test="dEnd!=null and dEnd!=''">
<![CDATA[ and DATE_FORMAT(time, '%Y-%m-%d %H:%T:%s') <= DATE_FORMAT(#{dEnd}, '%Y-%m-%d %H:%T:%s') ]]>
</if>
No Picture You Say A JB:
型別轉化異常:
java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
4.<![CDATA[ ]]>
是什麼?會什麼要使用它?
答:<![CDATA[ ]]>
裡面的語句不用解析,該是啥樣子就是啥樣子,不會被Mybatis轉譯掉。
5.為什麼傳入的起止日期型別是Date型別就可以查詢資料庫的datetime型別日期呢?
答:因為java中的java.util.Date 對應mysql中的datetime
6.返回型別為什麼是Map?為什麼方法的返回值又是List<Objtect>
呢?
首先,若是想要返回list型別引數,即不能直接指定為List,或者AarrayList,因為在這裡。
然後,為什麼指定了resultType=”java.util.HashMap”,方法會用List<Objtect>
接收了呢?原因mybatis有預設返回型別。
最後,看看我resultType=”java.util.HashMap”的返回結果
可以看出list裡有四條資料,每條資料都是一個map<String,Object>
.
當你你遇到“ A query was run and no Result Maps were found for the Mapped Statement ‘cn.edu.hdu.Dao.FactoryMapper.getHistoryDataByDate’. It’s likely that neither a Result Type nor a Result Map was specified.”,就是這個原因。