1. 程式人生 > >mybatis日期查詢

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.”,就是這個原因。