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


今天項目需要用到動態表名,找到這一篇文章,親測可用

 

 

 用了mybatis很長一段時間了,但是感覺用的都是比較基本的功能,很多mybatis相對ibatis的新功能都沒怎么用過。比如其內置的注解功能之類的。這次遇到了一個問題,每次我們在配置mybaits時,需要在mapping.sql.xml文件中寫對應的執行sql腳本。這時我們一般會先定義實體類來作為sql的返回類型或者執行sql的參數類型。比如如下代碼

Java代碼   收藏代碼
  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>>)。

      okay~大概講解到此,說說這次的問題。以前都是指定了實體類,然后寫好sql語句直接套用就可以了。但是現在有個問題,萬一你的物理模型不確定,也即是你的表結構不確定,甚至連表名字都不確定該怎么辦呢?我這次遇到了這個問題。我們有個需求,事先定義好了很多數據集的信息模型,針對這些信息模型生成物理模型。而我們需要針對這些物理模型進行操作。而這些數據集一旦更新,信息模型以及物理模型都要變動,所以事先不可能完全確定物理表結構等等信息。此時應該怎么在mybatis中進行處理呢?

      這里在說一下mybatis中一個屬性:statementType。這個屬性的作用是告訴mybatis我們寫的這個sql到底是預編譯(PRESTATEMENT)還是非預編譯(STATEMENT)的。有什么區別呢?如果是預編譯的,那么系統在初始化時就會讀取這段sql代碼,將指定的實體類中的字段替換了類似#{}這樣的語句,就是形成了類似這樣的語句:

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

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

Sql代碼   收藏代碼
  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.   
  26. </select>  

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM