MyBatis構建sql

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

 用了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 )&lt;=
			to_date(#{endDate},'yyyy/mm/dd')) and
			(to_date(#{beginDate},'yyyy/mm/dd')
			&lt;=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

相關文章
相關標籤/搜索