關於Mybatis的幾件小事(一)

1、Mybatis簡介

1.Mybatis簡介

  • MyBatis是支持定製化SQL、存儲過程以及高級映射的優秀的持久層框架。
  • MyBatis避免了幾乎全部的JDBC代碼和手動設置參數以及獲取結果集。
  • MyBatis可使用簡單的XML或註解用於配置和冤死映射,將接口和Java的POJO(Plain Old Java Objects,普通的java對象)映射成數據庫中的記錄。

2.爲何使用MyBatis

  • MyBatis是一個半自動化的持久化層框架。
  • JDBC存在的問題
    1. SQL夾在Java代碼塊中,耦合度高致使硬編碼內傷。
    2. 維護起來不容易且實際開發需求中Sql是有變化的,頻繁修改的狀況太多。
  • Hibernate和JPA存在的問題
    1. 長難的負載SQL,對於Hibernate而言處理複雜。
    2. 內部產生的SQL,不容易作特殊優化。
    3. 基於全映射的全自動框架,大量字段的POJO進行部分映射時比較困難,致使數據庫性能降低。
  • 對於開發而言,核心Sql仍是須要本身優化的。
  • sql和java代碼分開,功能邊界清晰,一個專一業務、一個專一數據。

3.SqlSession

  • SqlSession的實例不是線程安全的,所以不能被共享。
  • SqlSession每次使用完成後須要正確關閉,這個關閉操做是必須的。
  • SqlSession能夠直接調用方法的id進行數據庫操做,可是通常仍是推薦使用SqlSession獲取到DAO接口的代理,執行代理對象的方法,能夠更安全的進行類型檢查操做。java

    2、全局配置文件

  • MyBatis的配置文件包含了影響MyBatis行爲的設置和屬性信息,文檔的頂層結構以下:
    • configuration 配置
      • properties屬性
      • settings 屬性
      • typeAliases屬性
      • typeHandler類型處理器
      • objectFactory對象工廠
      • plugins插件
      • environments環境
        • environment環境變量
          • transactionManager 事務管理器
          • dataSource 數據源
      • databaseIdProvider 數據庫廠商標識
      • mappers映射器

1.properties屬性

dbconfig.properties文件內容mysql

driver=com.mysql.jdbc.cj.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8   
username=root
password=root

在全局配置文件中進行以下配置sql

<properties resource="dbconfig.properties"></properties>
  • 若是屬性在不止一個地方進行了配置,那麼MyBatis將按照下面的順序來加載:
    • 在properties元素體內指定的屬性首先被讀取。
    • 而後根據properties元素中的resource屬性讀取類路徑下屬性文件或根據url屬性指定的路徑讀取屬性文件,並覆蓋已讀取的同名屬性。
    • 最後讀取做爲方法參數傳遞的屬性,並覆蓋以讀取的同名屬性。

2.settings設置

  • 這是MyBatis中極爲重要的參數設置,會改變MyBatis的運行時行爲。
<settings>
      <setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
設置參數 描述 有效值 默認值
cacheEnabled 改配置影響的全部映射器中配置的緩存的全局開關 true | false true
lazyLoadingEnabled 延遲加載的全局開關,開啓後,全部關聯的對象都會延時加載。特定關聯關係中可經過設置fetchType屬性來覆蓋本配置 true | false false
useColumnLabel 使用列標籤代替列名。不一樣的驅動在這方面會有不一樣的表現,具體可參考相關驅動文檔或經過測試這兩種不一樣的模式來觀察所用驅動的結果 true | false true
defaultStatementTimeout 設置超時時間,決定驅動等待數據庫響應的秒數 任意合理的int值 null(不進行限制)
mapUnderscoreToCamelCase 是否開啓自動駝峯命名規則映射 true | false false

3.typeAliases別名處理器

  • 類型別名是爲Java類型設置一個短的名字,能夠方便咱們引用某個類
<typeAliases>
    <typeAlias type="com.desperado.entity.Employee" alias="employee"/>
    <typeAlias type="com.desperado.entity.Departemnt" alias="department"/>
</typeAliases>
  • 類不少的狀況下,能夠批量設置別名這個包下的每個類建立一個默認的別名,就是簡單類名小寫。
<typeAliases>
      <package name="com.desperado.entity" /> 
</typeAliases>
  • 也可使用@Alias註解爲其指定一個別名
@Alias("emp")
public class Employee{}

-MyBatis已經爲許多常見的Java類型內建了相應的別名,他們都是大小寫不敏感的,起別名時要避免這些。
別名|映射的類型名|別名|映射的類型名|別名|映射的類型名
-|-|-|-|-|-
_byte|byte|string|String|data|Data
_long|long|byte|Byte|decimal|Decimal
_short|short|long|Long|bigdecimal|BigDecimal
_int|int|short|Short|object|Object
_integer|int|int|Integer|map|Map
_double|double|integer|Integer|hashmap|HashMap
_float|float|double|Double|list|List
_boolean|boolean|float|Float|arraylist|ArrayList
-| |boolean|Boolean|collection|Collection數據庫

  • ||||iterator|Iterator

4.typeHandlers類型處理器

不管MyBatis在預處理語句(PreparedStatement)中設置一個參數時,仍是從結果集中取出一個值時,都會用類型處理器將獲取的值以合適的方式轉換成Java類型。
類型處理器|Java類型|JDBC類型
-|-|-
BooleanTypeHandler|java.lang.Boolean,boolean|數據庫兼容的BOOLEAN
ByteTypeHandler|java.lang.Byte,byte|數據庫兼容的NUMERIC或BYTE
ShortTypeHandler|java.lang.Short,short|數據庫兼容的NUMERIC或SHORT INTEGER
IntegerTypeHandler|java.lang.Integer,int|數據庫兼容的NUMERIC或INTEGER
LongTypeHandler|java.lang.Long,long|數據庫兼容的NUMERIC或LONG INTEGER
FloatTypeHandler|java.lang.Float,float|數據庫兼容的NUMERIC或FLOAT
DoubleTypeHandler|java.lang.Double,double|數據庫兼容的NUMERIC或DOUBLE
BigDecimalTypeHandler|java.math.BigDecimal|數據庫兼容的NUMERIC或DECIMAL
StringTypeHandler|java.lang.String |CHAR、VARCHARapache

5.日期類型的處理

  • 在JDK1.8以前,經過使用JSR310規範的Joda-Time來操做。1.8已經實現所有的JSR310規範了。
  • 日期時間處理上,可使用MyBatis基於JSR310編寫的各類時間類型處理器
  • MyBatis3.4之前的版本須要咱們收到去註冊這些處理器,之後的版本會自動註冊。
<typeHandlers>
    <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.YearTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.MonthTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler"/>
    <typeHandler handler="org.apache.ibatis.type.JapaneseDateTypeHandler"/>
</typeHandlers>

6.自定義類型處理器

  • 能夠重寫類型處理器或建立本身的類型處理器來處理不支持的或非標準的類型。
  • 建立一個類型處理器以下:
    1. 實現org.apache.ibatis.type.TypeHandler接口或者繼承org.apache.ibatis.type.BaseTypeHandler
    2. 指定其映射某個JDBC類型(可選操做)
    3. 在mybatis全局配置文件中註冊。

7.plugins插件

  • 插件是mybatis提供的一個很是強大的機制,咱們能夠經過插件來修改mybatis的一些核心機制。插件經過動態機制代理,能夠介入四大對象的任何一個方法的執行。
    • Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)
    • ParameterHandler(getParameterObject,setParameters)緩存

    • ResultSetHandler(handlerResultSets,handlerOuutputParameters)安全

    • StatementHandler(prepare,parameterize,batch,update,query)服務器

8.environments環境

  • MyBatis能夠配置多種環境,好比開發、測試和生產環境須要有不一樣的配置。
  • 每種環境使用一個environment標籤配置並指定惟一標誌符。
  • 能夠經過environments標籤中的default屬性指定一個環境的標識符來快速的切換環境。session

    1.指定具體環境
  • id:指定當前環境的惟一標識
  • transactionManager和dataSource必須都要有mybatis

<environments default="development">
    <environment id="development">
          <transactionManager type="JDBC" />
          <dataSource type="POOLED">
                  <property name="driver" value="${dept.driver}" / >
                  <property name="url" value="${dept.url} "/ >
                  <property name="username" value="${dept.username}" / >
                  <property name="password" value="${dept.password}" / >
          <dataSource>
    </environmet>

    <environment id="test">
          <transactionManager type="JDBC" />
          <dataSource type="POOLED">
                  <property name="driver" value="${test.driver}" / >
                  <property name="url" value="${test.url} "/ >
                  <property name="username" value="${test.username}" / >
                  <property name="password" value="${test.password}" / >
          <dataSource>
    </environmet>
</environments>
2.transactionManager

type值取值有三種類型 JDBC|MANAGED|自定義

  • JDBC:使用了JDBC的事務提交和回滾設置,依賴於從數據源獲得的鏈接來管理事務範圍。對應JdbcTransactionFactory
  • MANAGED:不提交或回滾一個鏈接,讓容器來管理事務的整個生命週期。對應ManagedTransactionFactory
  • 自定義:實現TransactionFactory接口,type=全類名/別名。
3.dataSource

type有四種取值 UNPOOLED|POOLED|JNDI|自定義

  • UNPOOLED:不使用鏈接池,對應UnpooledDataSourceFactory。
  • POOLED:使用鏈接池,對應PooledDataSourceFactory。
  • JNDI:在EJB或應用服務器這類容器中查找指定的數據源。
  • 自定義:實現DataSourceFactory接口,定義數據源的獲取方式。

9.databaseIdProvider環境

  • MyBatis能夠根據不一樣的數據庫廠商執行不一樣的語句。
<databaseIdProvider type="DB_VENDOR">
      <property name="MySQL" value="mysql"/>
      <property name="Oracle" vale="oracle"/>
      <property name="SQL Server" value="sqlserver" />
</databaseIdProvider>

<select Id="getUserById" result="User"
        parameterType="Integer" databaseId="mysql">
      select * from user where id =#{id}
</select>
  • Type:DB_VENDOR:使用MyBatis提供的VendorDatabaseIdProvider解析數據庫廠商標識。也能夠實現DatabaseIdProvider接口來自定義。
  • Property- name:數據庫廠商標識。
  • property-value:爲標識起一個別名,方便SQL語句使用DatabaseId屬性引用。
  • DB_VENDOR 會經過DatabaseMetaData類的getDatabaseProductName()返回的字符串進行設置。因爲一般狀況下這個字符串都很是長並且相同產品的不一樣版本會返回不一樣的值,因此最好經過設置屬性別名來使其變短。
  • MyBatis匹配規則以下:
    1. 若是沒有配置databaseIdProvider標籤,那麼databaseId=null。
    2. 若是配置了databaseIdProvider標籤,使用標籤配置的name去匹配數據庫信息,匹配上設置databaseId=屬性指定的值,不然依舊爲null。
    3. 若是databaseId不爲null,他只會找到配置databaseId的sql語句。
    4. mybatis會加載不帶databaseId屬性和帶有匹配當前數據庫databaseId屬性的全部語句。若是同時找到帶有databaseId和不帶databaseId的相同語句,則後者會被捨棄。

10.mapper映射

  • mapper逐個註冊SQL映射文件
<mappers>
    <mapper resource="mybatis/mapper/PersonDao.xml" />
    <mapper url="file:///D:/userDao.xml" />
    <mapper class="com.desperado.dao.UserDao" />
</mappers>
  • 使用批量註冊。這種方式要求SQL映射文件名必須和接口名相同而且在同一目錄下。
<mappers>
    <package name="com.desperado.dao" />
</mappers>

3、映射文件

映射文件指導着MyBatis如何進行數據庫的增刪改查,有着很是重要的意義:

  • cache 命名空間的二級緩存配置。
  • cache-ref 其餘命名空間緩存配置的引用。
  • resultMap 自定義結果集映射。
  • parameterMap 已廢棄,老式風格的參數映射
  • sql 抽取可重用語句塊
  • insert 映射插入語句
  • update 映射更新語句
  • delete 映射刪除語句
  • select 映射查詢語句

1.insert、update、delete元素

屬性 說明
id 命名空間中的惟一標誌符
parameterType 將要傳入語句的參數的徹底限定類名或別名。這個屬性是可選的,由於MyBatis能夠經過TypeHandler推斷出具體傳入語句的參數類型,默認爲unset。
flushCache 將其設置爲true,任什麼時候候只要語句被調用,都會致使本地緩存和二級緩存都被清空,默認值true(對應插入、刪除和更新語句)。
timeout 這個設置是在拋出異常以前,驅動程序等待數據庫返回請求結果的秒數。默認爲unset(依賴驅動)
statementType STATEMENT,PREPARED或CALLABLE的一個。這會讓MyBatis分別飾演Statement、PreparedStatement或CallableStatement,默認值:PREPARED
useGeneratorKeys (僅對insert和update有效)這會讓MyBatis使用JDBC的getGeneratorKeys方法取出由數據庫內部生成的主鍵,默認值false
keyProperty (僅對insert和update有效)惟一標記一個屬性,MyBatis會經過getGeneratedKeys的返回值或者經過insert語句的selectKey子元素設置它的鍵值,默認unset
keyColumn (僅對insert和update有效)經過生成的鍵值設置表中的列名,這個設置緊張模型數據庫是必須的,當主鍵列不是表中的第一列的時候須要設置,若是但願獲得多個生成的列,也能夠是逗號分隔的屬性名稱列表。
databaseId 若是配置了databaseIdProvider,MyBatis會加載全部的不帶databaseId或匹配當前databaseId的語句;若是帶或者不帶的語句都有,則不帶的會被忽略。

2.主鍵生成方式

  • 若數據庫支持自動生成主鍵的字段(好比mysql和SQL server),則能夠設置useGeneratedKeys="true",而後再把keyProperty設置到目標屬性上。
<insert id="insertCustomer" databaseId="mysql"     
    useGeneratedKeys="true" keyProperty="id">
    insert into customer(name,age,email) values (#{name},#{age},#{email})
</insert>
  • 對於不支持自增型主鍵的數據庫(例如:oracle),則可使用selectKey子元素,selectKey元素會首先運行,id會被設置,而後插入語句會被調用。
<insert id="insertCustomer" databaseId="oracle" parameterType=「customer」>

    <selectKey order="BEFORE" keyProperty="id" resultType="_int" >
          select crm_seq.nextval from dual
    </selectKey>
    insert into customer(id,name,age,email) values (#{id},#{name},#{age},#{email})
</insert>
  • SelectKey
屬性 說明
keyProperty selectKey語句結果應該被設置的目標屬性
keyColumn 匹配屬性的返回結果集中的列名稱
resultType 結果的類型,MyBatis一般能夠推斷出來,可是爲了更加肯定寫上也不會有什麼問題。MyBatis容許任何簡單類型用做主鍵的類型,包括字符串。
order 能夠被設置爲BEFORE或AFTER,若是設置爲BEFORE,那麼它會首先選擇主鍵,設置keyProperty而後執行插入語句。若是設置爲After,那麼先執行插入語句,而後是selectKey執行。
statementType 與前面相同,MyBatis支持STATEMENT,PREPARED和CALLABLE語句的映射類型,分佈表明PreparedStatement和CallableStatement

3.參數傳遞

  • 單個參數:能夠接受級別類型、對象類型、集合類型的值。這種狀況下MyBatis能夠直接使用這個參數,不須要作其餘處理。
  • 多個參數:任意多個參數,都會被MyBatis從新包裝成一個Map傳入。map的key是param一、param2等等,值就是傳入的參數值。
  • 命名參數:爲參數使用@Param註解起一個名字,Mybatis會將這些參數封裝進map時,使用指定的名字做爲key
  • POJO:當這些參數屬於POJO時,能夠直接傳遞POJO
  • Map:也能夠封裝多個參數爲map,直接傳遞map。

4.參數處理

  • 參數也能夠指定一個特殊的數據類型:
#{property,javaType=int,jdbcType=NUMERIC}

#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}

-javaType一般能夠從參數對象中去肯定。
-若是null被當作值來傳遞,對應全部可能爲空的列,jdbcType須要被設置。
-對於數值類型,還能夠設置小數點後保留的位數
-mode屬性容許指定IN、OUT和INOUT屬性。若是參數爲OUT或INOUT,參數對象屬性的真實值會被改變,就像在獲取輸出參數時所指望的那些。

  • 參數位置支持的屬性
    javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName

  • #{key}:獲取參數的值,預編譯到SQL中,安全。
  • ${key}:獲取參數的值,拼接到SQL中,有SQL注入問題。

5.select語句

屬性 說明
id 命名空間中的惟一標誌符
parameterType 將要傳入語句的參數的徹底限定類名或別名。這個屬性是可選的,由於MyBatis能夠經過TypeHandler推斷出具體傳入語句的參數類型,默認爲unset。
resultType 返回的指望類型的徹底限定名或別名。注意若是是集合,那應該是集合能夠包含的類型,而不是集合自己,本屬性和resultMap不能同時使用。
flushCache 將其設置爲true,任什麼時候候只要語句被調用,都會致使本地緩存和二級緩存都被清空,默認值false。
useCache 將其設置爲true,將會致使本條語句的結果被二級緩存進行緩存,默認值:true
timeout 這個設置是在拋出異常以前,驅動程序等待數據庫返回請求結果的秒數。默認爲unset(依賴驅動)
fetchSize 影響驅動程序每次批量返回的結果行數。默認值unset(依賴驅動)
statementType STATEMENT,PREPARED或CALLABLE的一個。這會讓MyBatis分別飾演Statement、PreparedStatement或CallableStatement,默認值:PREPARED
resultSetType FORWARD_ONLY、SCROLL_SENSITIVE或者SCROLL_INSENSITIVE中的一個,默認值爲unset(依賴驅動)
databaseId 若是配置了databaseIdProvider,MyBatis會加載全部的不帶databaseId或匹配當前databaseId的語句;若是帶或者不帶的語句都有,則不帶的會被忽略。
resultOrdered 這個設置僅針對嵌套結果select語句適用;若是爲true,就假設包含了嵌套結果集或是分組,這樣當返回一個主結果行,就不會發生有對前面結果集引用的狀況,這就使得在獲取嵌套的結果集的時候不至於致使內存不足,默認值false
resultSets 這個設置僅對多結果集的狀況適用,它將雷人語句執行後返回的結果集並給每一個結果集一個名稱,名稱是逗號分隔的。

6.自動映射

  • 全局setting設置
    -autoMappingBehavior默認是PARTIAL,開啓自動映射的功能。惟一的要求是列名和javaBean屬性名一致。
    -若是autoMappingBehavior設置爲null會取消自動映射。
    -數據庫命名規範,POJO屬性符號駝峯命名法,如customer_name -> customerName,能夠改期自動駝峯命名規則映射功能。

  • 自定義resultMap,實現高級結果集映射。

7.resultMap

  • constructor 類在實例化時,用來注入結果到構造方法中。
    -idArg id參數,標記結果做爲id能夠提升總體性能。
    -arg 注入到構造方法的一個普通結果

  • id 一個ID結果,標記結果做爲id能夠幫助提升總體性能。
  • result 注入到字段或JavaBean屬性的普通結果
  • association 一個複雜的類型關聯;許多結果將包成這種類型。
    -嵌入結果映射,結果映射自身的關聯。
  • collection 複雜類型的集。
    -嵌入結果映射,結果映射自身的集。
  • discriminator 使用結果值來決定使用哪一個結果映射。
    -case基於某些值的結果映射。

8.Id&Result

  • id和result映射一個單獨列的值到簡單數據類型的屬性或字段。
屬性 說明
property 映射到列結果的字段或屬性。
column 數據表的列名
javaType 一個Java類的徹底限定名或一個類型別名
jdbcType JDBC類型是僅僅須要對插入、更新和刪除操做可能爲空的列進行處理
typeHandler 類型處理器

9.association

  • 複雜對象類型
  • POJO中的屬性可能會是一個對象
  • 可使用聯合查詢,並以級聯屬性的方式封裝對象。
<resultMap type="com.desperado.bean.Lock" id="myLock">
    <id column="id" property="id" />
    <id column="lockName" property="lockName" />
    <id column="key_id" property="key.id" />
    <id column="keyName" property="key.keyName" />
</resultMap>
  • 使用association標籤訂義對象的封裝規則
  • association嵌套結果集
<resultMap type="com.desperado.bean.Lock" id="myLock2">
    <id column="id" property="id" />
    <result column="lockName" property="lockName" />
    <association property="key" javaType="com.desperado.bean.Key">
        <id column="key_id" property="id" />
        <result column="keyName" property="keyName" />
    </association>
</resultMap>
  • association分段查詢
    -select:調用目標的方法查詢當前屬性的值
    -column:將指定列的值傳入目標方法
<resultMap type="com.desperado.bean.Lock" id="myLock3">
    <id column="id" property="id" />
    <result column="lockName" property="lockName" />
    <association property="key" 
        select="com.desperado.dao.KeyMapper.getKeyById"  
        column="key_id">
    </association>
</resultMap>
  • association分段查詢和延遲查詢
    開啓延遲加載和屬性按需加載
<settings>
    <select name="lazyLoadingEnabled" value="true" />
    <setting name="aggressiveLazyLoading" value="false"  />
</settings>

10.Collection

  • 集合類型&嵌套結果集
    -不使用collection進行聯合查詢
<select id="getDeptById" resultMap="MyDept">
      select d.id d_id,
             d.dept_name d_deptName,
             e.id e_id,
             e.last_name e_lastName,
             e.email e_email,
             e.gender e_gender,
             e.dept_id e_deptId
      from depertment d 
      left join employee e on e.dept_id = d.id
      where d.id = #{id}
</select>

-使用collection以後

<resultMap type="com.desperado.bean.Department" id="MyDept">
    <id column="d_id" property="id" />
    <result column="d_deptName" property="deptName" />
    <collection property="emps" 
        ofType="com.desperado.bean.Employee"  
        columnPrefix="e_">
         <id column="id" property="id" />
         <id column="lastName" property="lastName" />
         <id column="email" property="email" />
         <id column="gender" property="gender"/>
    </collection>
</resultMap>
  • 分佈查詢&延遲加載
<resultMap type="com.desperado.bean.Department" id="MyDeptStep">
    <id column="id" property="id" />
    <result column="dept_name" property="deptName" />
    <collection property="emps" 
        select="com.desperado.dao.EmployeeMapper.getEmpsByDeptId"  
        column="id">
    </collection>
</resultMap>

11.擴展-多列值封裝map傳遞

  • 分步查詢的時候經過指定column,將對應的列分數據傳遞過去,有時候須要傳遞多個參數。
  • 使用{key1=column1,key2=column2}的形式。
<resultMap type="com.desperado.bean.Department" id="MyDeptStep">
    <id column="id" property="id" />
    <result column="dept_name" property="deptName" />
    <collection property="emps" 
        select="com.desperado.dao.EmployeeMapper.getEmpsByDeptId"  
        column="{deptId=id}">
    </collection>
</resultMap>
  • association或者collection標籤的fetchType=eager/lazy能夠覆蓋全局的延遲加載策略,指定理解加載(eager)或者延遲加載(lazy)

4、動態SQL

1.動態SQL簡介

  • 動態SQL是MyBatis強大特性之一。極大的簡化拼裝SQL的操做。
  • 動態SQL元素和使用JSTL或其它相似基於XML的文本處理器類似。
  • MyBatis採用功能強大的基於OGNL的表達式來簡化操做。

2.Multi-db vendor 支持

  • 若在mybatis配置文件中配置了databaseIdProvider,則可使用"_databaseId"變量,這樣就能夠根據不一樣的數據庫廠商構建特定的語句
<databaseIdProvider type="DB_VENDOR">
    <property name="MySQL" value="mysql" />
    <property name="Oracle" value="oracle" />
</databaseIdProvider>
<select id="getEmpPage" resultType="com.desperado.bean.Employee">
       <if test="_databaseId =='mysql' ">
          select * from employee where limit 0,5
       </if>

       <if test="_databaseId == 'oracle' ">
            select * from (select e.*,rownum as r1 from employee e where rownum &lt;=5) where r1 &gt;= 1;
       </if>  
</select>
相關文章
相關標籤/搜索