用了mybatis很長一段時間了,可是感受用的都是比較基本的功能,不少mybatis相對ibatis的新功能都沒怎麼用過。好比其內置的註解功能之類的。此次遇到了一個問題,每次咱們在配置mybaits時,須要在mapping.sql.xml文件中寫對應的執行sql腳本。這時咱們通常會先定義實體類來做爲sql的返回類型或者執行sql的參數類型。好比以下代碼 java
<select id="queryApplyStatusNum" parameterType="ApplyCriteria" resultType="ApplyStatusNumDto"> select o.statecode as statusCode,count(*) as statusNum from TM_ConsultationApply o where <if test="doctorCode != null and doctorCode != ''"> o.DoctorCode = #{doctorCode} and </if> <if test="beginDate != null and endDate != null"> ((trunc(o.AppointBeginDate )<= to_date(#{endDate},'yyyy/mm/dd')) and (to_date(#{beginDate},'yyyy/mm/dd') <=o.AppointEndDate)) and </if> 1=1 group by o.statecode </select>
這是個很簡單的查詢,其中parameterType爲對應的參數實體類,這些類中的字段將會替換sql語句中的相似#{}的語句,使之成爲完整的sql 語句。一樣的,resultType一樣對應的是返回值的實體類。這裏能夠細說一下,其實在mybatis中,不管你指定仍是不指定返回類型,mybatis都會默認的先將查詢回的值放入一個hashMap中(若是返回的值不止一條就是一個包含hashMap的list)。這其中的區別在於,若是你指定了返回類型,mybatis將會根據返回類型的實體類來從hashMap中獲取值並set到這個實體類中。若是不指定就默認返回一個HashMap<String,Object>(List<HashMap<String,Object>>)。 sql
okay~大概講解到此,說說此次的問題。之前都是指定了實體類,而後寫好sql語句直接套用就能夠了。可是如今有個問題,萬一你的物理模型不肯定,也便是你的表結構不肯定,甚至連表名字都不肯定該怎麼辦呢?我此次遇到了這個問題。咱們有個需求,事先定義好了不少數據集的信息模型,針對這些信息模型生成物理模型。而咱們須要針對這些物理模型進行操做。而這些數據集一旦更新,信息模型以及物理模型都要變更,因此事先不可能徹底肯定物理表結構等等信息。此時應該怎麼在mybatis中進行處理呢? mybatis
這裏在說一下mybatis中一個屬性:statementType。這個屬性的做用是告訴mybatis咱們寫的這個sql究竟是預編譯(PRESTATEMENT)仍是非預編譯(STATEMENT)的。有什麼區別呢?若是是預編譯的,那麼系統在初始化時就會讀取這段sql代碼,將指定的實體類中的字段替換了相似#{}這樣的語句,就是造成了相似這樣的語句: app
"select * from tableName where code=?" 這個時候你在系統運行時再想向這句sql中替換tableName或者code,結果可想而知。若是是非預編譯呢,結果恰好相反,他會在系統運行時纔會去生成這樣相似的語句。此時就能夠去替換這些動態的字段或者表名之類。這樣在結合以前所講的返回類型的設置,咱們的問題就解決了 spa
。咱們能夠不用設定參數和返回類型的實體類,只須要造成一個動態的表名和字段名的列表類。就能夠動態對那些未知的物理模型進行操做.以下代碼可做參考: code
<select id="queryMetaList" resultType="Map" statementType="STATEMENT"> select * from ${tableName} t where <foreach item="item" index="index" collection="field" open=" " separator="and" close=" "> <choose> <when test="item.fieldType == 'DATE' and item.dateQueryFlag == 0"> ${item.fieldCode} between to_date('${item.fieldValue}','yyyy-mm-dd hh24:mi:ss') </when> <when test="item.fieldType == 'DATE' and item.dateQueryFlag == 1"> to_date('${item.fieldValue}','yyyy-mm-dd hh24:mi:ss') </when> <when test="item.fieldItemCode != null and item.fieldItemCode != ''"> ${item.fieldCode} = '${item.fieldItemCode}' </when> <otherwise> ${item.fieldCode} = '${item.fieldValue}' </otherwise> </choose> </foreach> </select>
對了,漏了一句,若是是非預編譯的話,最好使用${}而不是#{} xml