日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis日期查询

發(fā)布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis日期查询 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

      • 一、項目需求
          • 需求先了解
          • 草圖說邏輯
      • 二、技術點實現(xiàn)
        • 參數(shù)獲取
        • mybaitis獲取數(shù)據
        • 后端返回Json數(shù)據
        • Sql語句

一、項目需求

需求先了解
  • 選擇時間間隔 - 點擊’查詢按鈕’查詢數(shù)據 - 用echarts可視化數(shù)據。
草圖說邏輯
  • 先用一張草圖來說明本篇文章的邏輯

注:本篇博客只討論,mybatis查詢數(shù)據技術,如你想了解相關技術請移步到我之前的博文:

  • 關于日期控件的使用:WdatePicker日期控件的使用
  • 關于ajax發(fā)送post請求:ajax post 服務器用request.getParameter(“”)拿不到值

二、技術點實現(xiàn)

參數(shù)獲取

  • 從路徑中拿到需要的參數(shù)(不是本章重點,故省略)

mybaitis獲取數(shù)據

  • 搭好框架,調用方法,利用mybatis獲取數(shù)據庫數(shù)據(不是本章重點,故省略)

后端返回Json數(shù)據

  • 上圖中,dateMap是mybatis映射方法getHistoryDataByDate的參數(shù) 存入了三個參數(shù):動態(tài)表名 ‘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);
如果真的這么干了,當你需要傳多個參數(shù)時,方法參數(shù)列表就會拖的很長,不美觀,像這樣:
List<Object>getHistoryDataByDate(@Param(value="tableName")String tableName,@Param(value="dStart") Date dStart,@Param(value="dEnd") Date dEnd);
總之,使用Map傳參,優(yōu)美,簡潔,大方,值得信賴。

2.為什么使用${tableName},而不是用#{tableName}?

答:這是mybatis預編譯與非預編譯問題。
${}會被mybatis替換成參數(shù)值。如:我傳入的tableName=User,就會select xxx from User,從而實現(xiàn)了動態(tài)添加表名
#{}會被替換成問號?,如:select xxx from User where time between ? and ?
參考博客:淺談 Mybatis中的 ${ } 和 #{ }的區(qū)別

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

參考文章:mybatis異常invalid comparison: java.util.Date and java.lang.String

4.<![CDATA[ ]]>是什么?會什么要使用它?

答:<![CDATA[ ]]>里面的語句不用解析,該是啥樣子就是啥樣子,不會被Mybatis轉譯掉。

5.為什么傳入的起止日期類型是Date類型就可以查詢數(shù)據庫的datetime類型日期呢?

答:因為java中的java.util.Date 對應mysql中的datetime

6.返回類型為什么是Map?為什么方法的返回值又是List<Objtect>呢?

首先,若是想要返回list類型參數(shù),即不能直接指定為List,或者AarrayList,因為在這里。

然后,為什么指定了resultType=”java.util.HashMap”,方法會用List<Objtect>接收了呢?原因mybatis有默認返回類型。

最后,看看我resultType=”java.util.HashMap”的返回結果

可以看出list里有四條數(shù)據,每條數(shù)據都是一個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.”,就是這個原因。

總結

以上是生活随笔為你收集整理的mybatis日期查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。