MyBatis構建sql時動態傳入表名以及字段名

用了mybatis很長一段時間了,可是感受用的都是比較基本的功能,不少mybatis相對ibatis的新功能都沒怎麼用過。好比其內置的註解功能之類的。此次遇到了一個問題,每次咱們在配置mybaits時,須要在mapping.sql.xml文件中寫對應的執行sql腳本。這時咱們通常會先定義實體類來做爲sql的返回類型或者執行sql的參數類型。好比以下代碼sql

Java代碼 收藏代碼mybatis

  1. <select id="queryApplyStatusNum" parameterType="ApplyCriteria"
  2.         resultType="ApplyStatusNumDto"> 
  3.         select 
  4.         o.statecode as statusCode,count(*) as statusNum 
  5.         from 
  6.         TM_ConsultationApply o 
  7.         where 
  8.         <if test="doctorCode != null and doctorCode != ''"> o.DoctorCode = #{doctorCode} and </if> 
  9.         <if test="beginDate != null and endDate != null"> 
  10.             ((trunc(o.AppointBeginDate )&lt;= 
  11.             to_date(#{endDate},'yyyy/mm/dd')) and 
  12.             (to_date(#{beginDate},'yyyy/mm/dd') 
  13.             &lt;=o.AppointEndDate)) and  </if> 
  14. 1=1
  15.         group by o.statecode 
  16. </select> 

     這是個很簡單的查詢,其中parameterType爲對應的參數實體類,這些類中的字段將會替換sql語句中的相似#{}的語句,使之成爲完整的sql 語句。一樣的,resultType一樣對應的是返回值的實體類。這裏能夠細說一下,其實在mybatis中,不管你指定仍是不指定返回類型,mybatis都會默認的先將查詢回的值放入一個hashMap中(若是返回的值不止一條就是一個包含hashMap的list)。這其中的區別在於,若是你指定了返回類型,mybatis將會根據返回類型的實體類來從hashMap中獲取值並set到這個實體類中。若是不指定就默認返回一個HashMap<String,Object>(List<HashMap<String,Object>>)。app

      okay~大概講解到此,說說此次的問題。之前都是指定了實體類,而後寫好sql語句直接套用就能夠了。可是如今有個問題,萬一你的物理模型不肯定,也便是你的表結構不肯定,甚至連表名字都不肯定該怎麼辦呢?我此次遇到了這個問題。咱們有個需求,事先定義好了不少數據集的信息模型,針對這些信息模型生成物理模型。而咱們須要針對這些物理模型進行操做。而這些數據集一旦更新,信息模型以及物理模型都要變更,因此事先不可能徹底肯定物理表結構等等信息。此時應該怎麼在mybatis中進行處理呢?code

      這裏在說一下mybatis中一個屬性:statementType。這個屬性的做用是告訴mybatis咱們寫的這個sql究竟是預編譯(PRESTATEMENT)仍是非預編譯(STATEMENT)的。有什麼區別呢?若是是預編譯的,那麼系統在初始化時就會讀取這段sql代碼,將指定的實體類中的字段替換了相似#{}這樣的語句,就是造成了相似這樣的語句:xml

"select * from tableName where code=?" 這個時候你在系統運行時再想向這句sql中替換tableName或者code,結果可想而知。若是是非預編譯呢,結果恰好相反,他會在系統運行時纔會去生成這樣相似的語句。此時就能夠去替換這些動態的字段或者表名之類。這樣在結合以前所講的返回類型的設置,咱們的問題就解決了blog

。咱們能夠不用設定參數和返回類型的實體類,只須要造成一個動態的表名和字段名的列表類。就能夠動態對那些未知的物理模型進行操做.以下代碼可做參考:get

Sql代碼 收藏代碼hash

  1. <select id="queryMetaList" resultType="Map" statementType="STATEMENT"> 
  2. select * from ${tableName} t where
  3.         <foreach item="item" index="index" collection="field" open=" "
  4.             separator="and" close=" "> 
  5.             <choose> 
  6.                 <when test="item.fieldType == 'DATE' and item.dateQueryFlag == 0"> 
  7.                     ${item.fieldCode} between
  8.                     to_date('${item.fieldValue}','yyyy-mm-dd 
  9.                     hh24:mi:ss')  
  10.                 </when> 
  11.                 <when test="item.fieldType == 'DATE' and item.dateQueryFlag == 1"> 
  12.                     to_date('${item.fieldValue}','yyyy-mm-dd 
  13.                     hh24:mi:ss')  
  14.                 </when> 
  15.                 <when test="item.fieldItemCode != null and item.fieldItemCode != ''"> 
  16.                     ${item.fieldCode} = 
  17. '${item.fieldItemCode}'
  18.                 </when> 
  19.                 <otherwise> 
  20.                     ${item.fieldCode} = 
  21. '${item.fieldValue}'
  22.                 </otherwise> 
  23.             </choose> 
  24.         </foreach> 
  25. </select> 

對了,漏了一句,若是是非預編譯的話,最好使用${}而不是#{}it

okay~~搞定收工~~io

相關文章
相關標籤/搜索