Mybatis-動態SQL-內置參數_databaseId和_parameter

由於數據庫版本的不一樣咱們須要寫多個SQL,爲了簡化和提升維護性Mybatis提供了「_databaseId」內置參數來整合SQL以適應不一樣版本數據庫,Mybatis還提供了「_parameter」內置參數mysql

_databaseId:

    數據庫版本,其值是在Mybatis全局配置文件中的<databaseIdProvider>標籤中配置的sql

<!-- 
		databaseIdProvider:支持多數據庫廠商的;
		 	type="DB_VENDOR":VendorDatabaseIdProvider是DB_VENDOR映射的實現類
		 		做用:就是獲得數據庫廠商的標識,調用getDatabaseProductName()獲得數據庫名稱,如Oracle(MySQL,SQL Server等其餘名字)而後和配置中property比對,拿
		 		到oracle,在與sql映射文件中<select>標籤中的databaseid中的值匹配,Mybatis就能根據數據庫廠商標識來執行不一樣的sql;
	-->
	<databaseIdProvider type="DB_VENDOR">
		<property name="MySQL" value="mysql"/>
		<property name="Oracle" value="oracle"/>
	</databaseIdProvider>

_parameter:

由方法傳遞過來的參數,能夠是任何參數類型,Java會把基本參數類型自動封裝成包裝類型數據庫

下面看一個SQL配置,同時使用了這兩個內置對象oracle

<select id="getCustsByCust" resultType="com.jv.dynamic.bean.Cust">
		<if test="_parameter != null">
			select cust_id,
			<choose>
				<when test="custId!=null and custId%2==0" >
					concat(cust_name,'_aa') cust_name
				</when>
				<otherwise>
					concat(cust_name,'_bb') cust_name
				</otherwise>
			</choose>
			from cust
			<where>
				<!-- ognl表達式還支持&&等操做符,可是在xml中須要使用其轉義字符
					好比:<if test="custId!=null!=null &amp;&amp; custId!=null!=&quot;&quot;">
					其中&amp;是表明&符號;&quot;表明雙引號
					
					爲了閱讀方便,推薦使用肺轉移符
				-->
				<if test="custId!=null and custId!=''">
					cust_id=#{custId}
				</if>
				<if test="custName!=null and custName!=''">
					and cust_name like #{custName}
				</if>
			</where>
		</if>
		<if test="_parameter == null">
			<!-- 由於是全表查詢,須要限制返回的記錄數,不然容易形成內存溢出 -->
			select cust_id,cust_name from cust
			<if test="_databaseId == 'mysql' ">
				limit 1000
			</if>
			<if test="_databaseId == 'oracle'">
				<![CDATA[
					where rownum<1001
				]]>
			</if>
		</if>
	</select>

這個SQL並無寫得很完整,只是爲了說明兩個內置參數的使用方式,不過仍是能夠執行的。ide

相關文章
相關標籤/搜索