由於數據庫版本的不一樣咱們須要寫多個SQL,爲了簡化和提升維護性Mybatis提供了「_databaseId」內置參數來整合SQL以適應不一樣版本數據庫,Mybatis還提供了「_parameter」內置參數mysql
數據庫版本,其值是在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>
由方法傳遞過來的參數,能夠是任何參數類型,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 && custId!=null!="""> 其中&是表明&符號;"表明雙引號 爲了閱讀方便,推薦使用肺轉移符 --> <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