一、Mybatis簡介
1.Mybatis簡介
- MyBatis是支持定制化SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架。
- MyBatis避免了幾乎所有的JDBC代碼和手動設置參數以及獲取結果集。
- MyBatis可以使用簡單的XML或注解用于配置和冤死映射,將接口和Java的POJO(Plain Old Java Objects,普通的java對象)映射成數據庫中的記錄。
2.為什么使用MyBatis
MyBatis是一個半自動化的持久化層框架。
-
JDBC存在的問題
- SQL夾在Java代碼塊中,耦合度高導致硬編碼內傷。
- 維護起來不容易且實際開發(fā)需求中Sql是有變化的,頻繁修改的情況太多。
-
Hibernate和JPA存在的問題
- 長難的負載SQL,對于Hibernate而言處理復雜。
- 內部產生的SQL,不容易做特殊優(yōu)化。
- 基于全映射的全自動框架,大量字段的POJO進行部分映射時比較困難,導致數據庫性能下降。
對于開發(fā)而言,核心Sql還是需要自己優(yōu)化的。
sql和java代碼分開,功能邊界清晰,一個專注業(yè)務、一個專注數據。
3.SqlSession
- SqlSession的實例不是線程安全的,因此不能被共享。
- SqlSession每次使用完成后需要正確關閉,這個關閉操作是必須的。
- SqlSession可以直接調用方法的id進行數據庫操作,但是一般還是推薦使用SqlSession獲取到DAO接口的代理,執(zhí)行代理對象的方法,可以更安全的進行類型檢查操作。
二、全局配置文件
- MyBatis的配置文件包含了影響MyBatis行為的設置和屬性信息,文檔的頂層結構如下:
- configuration 配置
- properties屬性
- settings 屬性
- typeAliases屬性
- typeHandler類型處理器
- objectFactory對象工廠
- plugins插件
- environments環(huán)境
- environment環(huán)境變量
- transactionManager 事務管理器
- dataSource 數據源
- environment環(huán)境變量
- databaseIdProvider 數據庫廠商標識
- mappers映射器
- configuration 配置
1.properties屬性
dbconfig.properties文件內容
driver=com.mysql.jdbc.cj.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
username=root
password=root
在全局配置文件中進行如下配置
<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 | 延遲加載的全局開關,開啟后,所有關聯(lián)的對象都會延時加載。特定關聯(lián)關系中可通過設置fetchType屬性來覆蓋本配置 | true | false | false |
| useColumnLabel | 使用列標簽代替列名。不同的驅動在這方面會有不同的表現(xiàn),具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果 | true | false | true |
| defaultStatementTimeout | 設置超時時間,決定驅動等待數據庫響應的秒數 | 任意合理的int值 | null(不進行限制) |
| mapUnderscoreToCamelCase | 是否開啟自動駝峰命名規(guī)則映射 | true | false | false |
3.typeAliases別名處理器
- 類型別名是為Java類型設置一個短的名字,可以方便我們引用某個類
<typeAliases>
<typeAlias type="com.desperado.entity.Employee" alias="employee"/>
<typeAlias type="com.desperado.entity.Departemnt" alias="department"/>
</typeAliases>
- 類很多的情況下,可以批量設置別名這個包下的每一個類創(chuàng)建一個默認的別名,就是簡單類名小寫。
<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、VARCHAR |
5.日期類型的處理
- 在JDK1.8之前,通過使用JSR310規(guī)范的Joda-Time來操作。1.8已經實現(xiàn)全部的JSR310規(guī)范了。
- 日期時間處理上,可以使用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.自定義類型處理器
- 可以重寫類型處理器或創(chuàng)建自己的類型處理器來處理不支持的或非標準的類型。
- 創(chuàng)建一個類型處理器如下:
- 實現(xiàn)org.apache.ibatis.type.TypeHandler接口或者繼承org.apache.ibatis.type.BaseTypeHandler
- 指定其映射某個JDBC類型(可選操作)
- 在mybatis全局配置文件中注冊。
7.plugins插件
- 插件是mybatis提供的一個非常強大的機制,我們可以通過插件來修改mybatis的一些核心機制。插件通過動態(tài)機制代理,可以介入四大對象的任何一個方法的執(zhí)行。
Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)
ParameterHandler(getParameterObject,setParameters)
ResultSetHandler(handlerResultSets,handlerOuutputParameters)
StatementHandler(prepare,parameterize,batch,update,query)
8.environments環(huán)境
- MyBatis可以配置多種環(huán)境,比如開發(fā)、測試和生產環(huán)境需要有不同的配置。
- 每種環(huán)境使用一個environment標簽配置并指定唯一標志符。
- 可以通過environments標簽中的default屬性指定一個環(huán)境的標識符來快速的切換環(huán)境。
1.指定具體環(huán)境
- id:指定當前環(huán)境的唯一標識
- transactionManager和dataSource必須都要有
<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
- 自定義:實現(xiàn)TransactionFactory接口,type=全類名/別名。
3.dataSource
type有四種取值 UNPOOLED|POOLED|JNDI|自定義
- UNPOOLED:不使用連接池,對應UnpooledDataSourceFactory。
- POOLED:使用連接池,對應PooledDataSourceFactory。
- JNDI:在EJB或應用服務器這類容器中查找指定的數據源。
- 自定義:實現(xiàn)DataSourceFactory接口,定義數據源的獲取方式。
9.databaseIdProvider環(huán)境
- MyBatis可以根據不同的數據庫廠商執(zhí)行不同的語句。
<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解析數據庫廠商標識。也可以實現(xiàn)DatabaseIdProvider接口來自定義。
- Property- name:數據庫廠商標識。
- property-value:為標識起一個別名,方便SQL語句使用DatabaseId屬性引用。
- DB_VENDOR 會通過DatabaseMetaData類的getDatabaseProductName()返回的字符串進行設置。由于通常情況下這個字符串都非常長而且相同產品的不同版本會返回不同的值,所以最好通過設置屬性別名來使其變短。
- MyBatis匹配規(guī)則如下:
- 如果沒有配置databaseIdProvider標簽,那么databaseId=null。
- 如果配置了databaseIdProvider標簽,使用標簽配置的name去匹配數據庫信息,匹配上設置databaseId=屬性指定的值,否則依舊為null。
- 如果databaseId不為null,他只會找到配置databaseId的sql語句。
- 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>
三、映射文件
映射文件指導著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然后執(zhí)行插入語句。如果設置為After,那么先執(zhí)行插入語句,然后是selectKey執(zhí)行。 |
| statementType | 與前面相同,MyBatis支持STATEMENT,PREPARED和CALLABLE語句的映射類型,分布代表PreparedStatement和CallableStatement |
3.參數傳遞
- 單個參數:可以接受級別類型、對象類型、集合類型的值。這種情況下MyBatis可以直接使用這個參數,不需要做其他處理。
- 多個參數:任意多個參數,都會被MyBatis重新包裝成一個Map傳入。map的key是param1、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,就假設包含了嵌套結果集或是分組,這樣當返回一個主結果行,就不會發(fā)生有對前面結果集引用的情況,這就使得在獲取嵌套的結果集的時候不至于導致內存不足,默認值false |
| resultSets | 這個設置僅對多結果集的情況適用,它將雷人語句執(zhí)行后返回的結果集并給每個結果集一個名稱,名稱是逗號分隔的。 |
6.自動映射
全局setting設置
-autoMappingBehavior默認是PARTIAL,開啟自動映射的功能。唯一的要求是列名和javaBean屬性名一致。
-如果autoMappingBehavior設置為null會取消自動映射。
-數據庫命名規(guī)范,POJO屬性符號駝峰命名法,如customer_name -> customerName,可以改期自動駝峰命名規(guī)則映射功能。自定義resultMap,實現(xiàn)高級結果集映射。
7.resultMap
constructor 類在實例化時,用來注入結果到構造方法中。
-idArg id參數,標記結果作為id可以提高整體性能。
-arg 注入到構造方法的一個普通結果id 一個ID結果,標記結果作為id可以幫助提高整體性能。
result 注入到字段或JavaBean屬性的普通結果
association 一個復雜的類型關聯(lián);許多結果將包成這種類型。
-嵌入結果映射,結果映射自身的關聯(lián)。collection 復雜類型的集。
-嵌入結果映射,結果映射自身的集。discriminator 使用結果值來決定使用哪個結果映射。
-case基于某些值的結果映射。
8.Id&Result
- id和result映射一個單獨列的值到簡單數據類型的屬性或字段。
| 屬性 | 說明 |
|---|---|
| property | 映射到列結果的字段或屬性。 |
| column | 數據表的列名 |
| javaType | 一個Java類的完全限定名或一個類型別名 |
| jdbcType | JDBC類型是僅僅需要對插入、更新和刪除操作可能為空的列進行處理 |
| typeHandler | 類型處理器 |
9.association
- 復雜對象類型
- POJO中的屬性可能會是一個對象
- 可以使用聯(lián)合查詢,并以級聯(lián)屬性的方式封裝對象。
<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標簽定義對象的封裝規(guī)則
- 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進行聯(lián)合查詢
<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)
四、動態(tài)SQL
1.動態(tài)SQL簡介
- 動態(tài)SQL是MyBatis強大特性之一。極大的簡化拼裝SQL的操作。
- 動態(tài)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 <=5) where r1 >= 1;
</if>
</select>