官網有時候進不去,所以就記錄一下Mybatis的配置文件的各項參數定義,大家也可以上官網查詢,官方文檔,進不進的去看各自的緣分了
properties
定義配置,在這里配置的屬性可以在整個配置文件使用;可以加載指定的properties配置文件加載,也可以在子元素中配置對應的屬性。
配置示例:
<properties resource="config/config.properties"><property name="username" value="root" /><property name="password" value="123" /><property name="TABLE_PREFIX" value="table." />
</properties>
使用${key}將對應的屬性進行動態的替換,比如:
<dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/>
</dataSource>
不僅僅可以在整個配置文件中使用,也可以在mapper配置中的文件使用,比如:
<select id="getUserById" resultMap="map">select * from ${TABLE_PREFIX}t_user
</select>
//通過替換后為select * from table.t_user
如果有多個相同的配置話,則加載順序為:
1、首先讀取在 properties 元素體內指定的屬性。
2、然后根據 properties 元素中的 resource 屬性讀取類路徑下屬性文件,或根據 url 屬性指定的路徑讀取屬性文件,并覆蓋之前讀取過的同名屬性。
3、加載使用SqlSessionFactory中屬性值,即下面的生產的工廠類傳入的參數
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
.
.
.
builder.build(Resources.getResourceAsStream("mybatis/mybatis-cfg.xml"),null,new Properties());
因此,通過方法參數傳遞的屬性具有最高優先級,resource/url 屬性中指定的配置文件次之,最低優先級的則是 properties 元素中指定的屬性。
settings
這個是調整mybatis運行的一些行為參數,參數默認值如下:
設置名 | 描述 | 有效值 | 默認值 |
---|---|---|---|
cacheEnabled | 全局性地開啟或關閉所有映射器配置文件中已配置的任何緩存。 | true | false | true |
lazyLoadingEnabled | 延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置 fetchType 屬性來覆蓋該項的開關狀態。 | true | false | false |
aggressiveLazyLoading | 開啟時,任一方法的調用都會加載該對象的所有延遲加載屬性。 否則,每個延遲加載屬性會按需加載(參考 lazyLoadTriggerMethods )。 | true | false | false (在 3.4.1 及之前的版本中默認為 true) |
multipleResultSetsEnabled | 是否允許單個語句返回多結果集(需要數據庫驅動支持)。 | true | false | true |
useColumnLabel | 使用列標簽代替列名。實際表現依賴于數據庫驅動,具體可參考數據庫驅動的相關文檔,或通過對比測試來觀察。 | true | false | true |
useGeneratedKeys | 允許 JDBC 支持自動生成主鍵,需要數據庫驅動支持。如果設置為 true,將強制使用自動生成主鍵。盡管一些數據庫驅動不支持此特性,但仍可正常工作(如 Derby)。 | true | false | False |
autoMappingBehavior | 指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示關閉自動映射;PARTIAL 只會自動映射沒有定義嵌套結果映射的字段。 FULL 會自動映射任何復雜的結果集(無論是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 指定發現自動映射目標未知列(或未知屬性類型)的行為。
| NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(PreparedStatement); BATCH 執行器不僅重用語句還會執行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 設置超時時間,它決定數據庫驅動等待數據庫響應的秒數。 | 任意正整數 | 未設置 (null) |
defaultFetchSize | 為驅動的結果集獲取數量(fetchSize)設置一個建議值。此參數只可以在查詢設置中被覆蓋。 | 任意正整數 | 未設置 (null) |
defaultResultSetType | 指定語句默認的滾動策略。(新增于 3.5.2) | FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(等同于未設置) | 未設置 (null) |
safeRowBoundsEnabled | 是否允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置為 false。 | true | false | False |
safeResultHandlerEnabled | 是否允許在嵌套語句中使用結果處理器(ResultHandler)。如果允許使用則設置為 false。 | true | false | True |
mapUnderscoreToCamelCase | 是否開啟駝峰命名自動映射,即從經典數據庫列名 A_COLUMN 映射到經典 Java 屬性名 aColumn。 | true | false | False |
localCacheScope | MyBatis 利用本地緩存機制(Local Cache)防止循環引用和加速重復的嵌套查詢。 默認值為 SESSION,會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地緩存將僅用于執行語句,對相同 SqlSession 的不同查詢將不會進行緩存。 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | 當沒有為參數指定特定的 JDBC 類型時,空值的默認 JDBC 類型。 某些數據庫驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType 常量,常用值:NULL、VARCHAR 或 OTHER。 | OTHER |
lazyLoadTriggerMethods | 指定對象的哪些方法觸發一次延遲加載。 | 用逗號分隔的方法列表。 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定動態 SQL 生成使用的默認腳本語言。 | 一個類型別名或全限定類名。 | org.apache.ibatis.scripting.xmltags.XMLLanguageDriver |
defaultEnumTypeHandler | 指定 Enum 使用的默認 TypeHandler 。(新增于 3.4.5) | 一個類型別名或全限定類名。 | org.apache.ibatis.type.EnumTypeHandler |
callSettersOnNulls | 指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這在依賴于 Map.keySet() 或 null 值進行初始化時比較有用。注意基本類型(int、boolean 等)是不能設置成 null 的。 | true | false | false |
returnInstanceForEmptyRow | 當返回行的所有列都是空時,MyBatis默認返回 null 。 當開啟這個設置時,MyBatis會返回一個空實例。 請注意,它也適用于嵌套的結果集(如集合或關聯)。(新增于 3.4.2) | true | false | false |
logPrefix | 指定 MyBatis 增加到日志名稱的前綴。 | 任何字符串 | 未設置 |
logImpl | 指定 MyBatis 所用日志的具體實現,未指定時將自動查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未設置 |
proxyFactory | 指定 Mybatis 創建可延遲加載對象所用到的代理工具。 | CGLIB | JAVASSIST | JAVASSIST (MyBatis 3.3 以上) |
vfsImpl | 指定 VFS 的實現 | 自定義 VFS 的實現的類全限定名,以逗號分隔。 | 未設置 |
useActualParamName | 允許使用方法簽名中的名稱作為語句參數名稱。 為了使用該特性,你的項目必須采用 Java 8 編譯,并且加上 -parameters 選項。(新增于 3.4.1) | true | false | true |
configurationFactory | 指定一個提供 Configuration 實例的類。 這個被返回的 Configuration 實例用來加載被反序列化對象的延遲加載屬性值。 這個類必須包含一個簽名為static Configuration getConfiguration() 的方法。(新增于 3.2.3) | 一個類型別名或完全限定類名。 | 未設置 |
shrinkWhitespacesInSql | 從SQL中刪除多余的空格字符。請注意,這也會影響SQL中的文字字符串。 (新增于 3.5.5) | true | false | false |
defaultSqlProviderType | Specifies an sql provider class that holds provider method (Since 3.5.6). This class apply to the type (or value ) attribute on sql provider annotation(e.g. @SelectProvider ), when these attribute was omitted. | A type alias or fully qualified class name | Not set |
typeAliases
別名,在sql mapper文件中使用resultType參數可指定別名進行替換
<typeAliases><typeAlias alias="Author" type="domain.blog.Author"/><typeAlias alias="Blog" type="domain.blog.Blog"/><typeAlias alias="Comment" type="domain.blog.Comment"/><typeAlias alias="Post" type="domain.blog.Post"/><typeAlias alias="Section" type="domain.blog.Section"/><typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
也可以指定包名,在對應的包下面的類需標明注解
<typeAliases><package name="com.test"/>
</typeAliases>@Alias("author")
public class Author{//....}
在內部也有一些默認的別名:
別名 | 映射的類型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
typeHandlers
MyBatis 在設置預處理語句(PreparedStatement)中的參數或從結果集中取出一個值時, 都會用類型處理器將獲取到的值以合適的方式轉換成 Java 類型。下表描述了一些默認的類型處理器。
提示:從 3.4.5 開始,MyBatis 默認支持 JSR-310(日期和時間 API) 。
類型處理器 | Java 類型 | JDBC 類型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean , boolean | 數據庫兼容的 BOOLEAN |
ByteTypeHandler | java.lang.Byte , byte | 數據庫兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short , short | 數據庫兼容的 NUMERIC 或 SMALLINT |
IntegerTypeHandler | java.lang.Integer , int | 數據庫兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long , long | 數據庫兼容的 NUMERIC 或 BIGINT |
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 |
ClobReaderTypeHandler | java.io.Reader | - |
ClobTypeHandler | java.lang.String | CLOB , LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR , NCHAR |
NClobTypeHandler | java.lang.String | NCLOB |
BlobInputStreamTypeHandler | java.io.InputStream | - |
ByteArrayTypeHandler | byte[] | 數據庫兼容的字節流類型 |
BlobTypeHandler | byte[] | BLOB , LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date | DATE |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER 或未指定類型 |
EnumTypeHandler | Enumeration Type | VARCHAR 或任何兼容的字符串類型,用來存儲枚舉的名稱(而不是索引序數值) |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 類型,用來存儲枚舉的序數值(而不是名稱)。 |
SqlxmlTypeHandler | java.lang.String | SQLXML |
InstantTypeHandler | java.time.Instant | TIMESTAMP |
LocalDateTimeTypeHandler | java.time.LocalDateTime | TIMESTAMP |
LocalDateTypeHandler | java.time.LocalDate | DATE |
LocalTimeTypeHandler | java.time.LocalTime | TIME |
OffsetDateTimeTypeHandler | java.time.OffsetDateTime | TIMESTAMP |
OffsetTimeTypeHandler | java.time.OffsetTime | TIME |
ZonedDateTimeTypeHandler | java.time.ZonedDateTime | TIMESTAMP |
YearTypeHandler | java.time.Year | INTEGER |
MonthTypeHandler | java.time.Month | INTEGER |
YearMonthTypeHandler | java.time.YearMonth | VARCHAR 或 LONGVARCHAR |
JapaneseDateTypeHandler | java.time.chrono.JapaneseDate | DATE |
你可以重寫已有的類型處理器或創建你自己的類型處理器來處理不支持的或非標準的類型。 具體做法為:實現 org.apache.ibatis.type.TypeHandler
接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandler
, 并且可以(可選地)將它映射到一個 JDBC 類型。比如:
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter);}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return rs.getString(columnName);}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return rs.getString(columnIndex);}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return cs.getString(columnIndex);}
}
<!-- mybatis-config.xml -->
<typeHandlers><typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
使用上述的類型處理器將會覆蓋已有的處理 Java String 類型的屬性以及 VARCHAR 類型的參數和結果的類型處理器。 要注意 MyBatis 不會通過檢測數據庫元信息來決定使用哪種類型,所以你必須在參數和結果映射中指明字段是 VARCHAR 類型, 以使其能夠綁定到正確的類型處理器上。這是因為 MyBatis 直到語句被執行時才清楚數據類型。
通過類型處理器的泛型,MyBatis 可以得知該類型處理器處理的 Java 類型,不過這種行為可以通過兩種方法改變:
- 在類型處理器的配置元素(typeHandler 元素)上增加一個
javaType
屬性(比如:javaType="String"
); - 在類型處理器的類上增加一個
@MappedTypes
注解指定與其關聯的 Java 類型列表。 如果在javaType
屬性中也同時指定,則注解上的配置將被忽略。
可以通過兩種方式來指定關聯的 JDBC 類型:
- 在類型處理器的配置元素上增加一個
jdbcType
屬性(比如:jdbcType="VARCHAR"
); - 在類型處理器的類上增加一個
@MappedJdbcTypes
注解指定與其關聯的 JDBC 類型列表。 如果在jdbcType
屬性中也同時指定,則注解上的配置將被忽略。
當在 ResultMap
中決定使用哪種類型處理器時,此時 Java 類型是已知的(從結果類型中獲得),但是 JDBC 類型是未知的。 因此 Mybatis 使用 javaType=[Java 類型], jdbcType=null
的組合來選擇一個類型處理器。 這意味著使用 @MappedJdbcTypes
注解可以限制類型處理器的作用范圍,并且可以確保,除非顯式地設置,否則類型處理器在 ResultMap
中將不會生效。 如果希望能在 ResultMap
中隱式地使用類型處理器,那么設置 @MappedJdbcTypes
注解的 includeNullJdbcType=true
即可。 然而從 Mybatis 3.4.0 開始,如果某個 Java 類型只有一個注冊的類型處理器,即使沒有設置 includeNullJdbcType=true
,那么這個類型處理器也會是 ResultMap
使用 Java 類型時的默認處理器。
最后,可以讓 MyBatis 幫你查找類型處理器:
<!-- mybatis-config.xml -->
<typeHandlers><package name="org.mybatis.example"/>
</typeHandlers>
注意在使用自動發現功能的時候,只能通過注解方式來指定 JDBC 的類型。
你可以創建能夠處理多個類的泛型類型處理器。為了使用泛型類型處理器, 需要增加一個接受該類的 class 作為參數的構造器,這樣 MyBatis 會在構造一個類型處理器實例的時候傳入一個具體的類。
public class GenericTypeHandler<E extends MyObject> extends BaseTypeHandler<E> {private Class<E> type;public GenericTypeHandler(Class<E> type) {if (type == null) throw new IllegalArgumentException("Type argument cannot be null");this.type = type;}...
EnumTypeHandler
和 EnumOrdinalTypeHandler
都是泛型類型處理器,我們將會在接下來的部分詳細探討。
若想映射枚舉類型 Enum
,則需要從 EnumTypeHandler
或者 EnumOrdinalTypeHandler
中選擇一個來使用。
比如說我們想存儲取近似值時用到的舍入模式。默認情況下,MyBatis 會利用 EnumTypeHandler
來把 Enum
值轉換成對應的名字。
注意 EnumTypeHandler
在某種意義上來說是比較特別的,其它的處理器只針對某個特定的類,而它不同,它會處理任意繼承了 Enum
的類。
不過,我們可能不想存儲名字,相反我們的 DBA 會堅持使用整形值代碼。那也一樣簡單:在配置文件中把 EnumOrdinalTypeHandler
加到 typeHandlers
中即可, 這樣每個 RoundingMode
將通過他們的序數值來映射成對應的整形數值。
<!-- mybatis-config.xml -->
<typeHandlers><typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>
</typeHandlers>
但要是你想在一個地方將 Enum
映射成字符串,在另外一個地方映射成整形值呢?
自動映射器(auto-mapper)會自動地選用 EnumOrdinalTypeHandler
來處理枚舉類型, 所以如果我們想用普通的 EnumTypeHandler
,就必須要顯式地為那些 SQL 語句設置要使用的類型處理器。
(下一節才開始介紹映射器文件,如果你是首次閱讀該文檔,你可能需要先跳過這里,過會再來看。)
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="org.apache.ibatis.submitted.rounding.Mapper"><resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap"><id column="id" property="id"/><result column="name" property="name"/><result column="funkyNumber" property="funkyNumber"/><result column="roundingMode" property="roundingMode"/></resultMap><select id="getUser" resultMap="usermap">select * from users</select><insert id="insert">insert into users (id, name, funkyNumber, roundingMode) values (#{id}, #{name}, #{funkyNumber}, #{roundingMode})</insert><resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2"><id column="id" property="id"/><result column="name" property="name"/><result column="funkyNumber" property="funkyNumber"/><result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/></resultMap><select id="getUser2" resultMap="usermap2">select * from users2</select><insert id="insert2">insert into users2 (id, name, funkyNumber, roundingMode) values (#{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler})</insert></mapper>
注意,這里的 select 語句必須指定 resultMap
而不是 resultType
。
objectFactory
每次 MyBatis 創建結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成實例化工作。 默認的對象工廠需要做的僅僅是實例化目標類,要么通過默認無參構造方法,要么通過存在的參數映射來調用帶有參數的構造方法。 如果想覆蓋對象工廠的默認行為,可以通過創建自己的對象工廠來實現。比如:
public class ExampleObjectFactory extends DefaultObjectFactory {public Object create(Class type) {return super.create(type);}public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {return super.create(type, constructorArgTypes, constructorArgs);}public void setProperties(Properties properties) {super.setProperties(properties);}public <T> boolean isCollection(Class<T> type) {return Collection.class.isAssignableFrom(type);}}
<!-- mybatis-config.xml -->
<objectFactory type="org.mybatis.example.ExampleObjectFactory"><property name="someProperty" value="100"/>
</objectFactory>
ObjectFactory 接口很簡單,它包含兩個創建實例用的方法,一個是處理默認無參構造方法的,另外一個是處理帶參數的構造方法的。 另外,setProperties 方法可以被用來配置 ObjectFactory,在初始化你的 ObjectFactory 實例后, objectFactory 元素體中定義的屬性會被傳遞給 setProperties 方法。
plugins
MyBatis 允許你在映射語句執行過程中的某一點進行攔截調用。默認情況下,MyBatis 允許使用插件來攔截的方法調用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
這些類中方法的細節可以通過查看每個方法的簽名來發現,或者直接查看 MyBatis 發行包中的源代碼。 如果你想做的不僅僅是監控方法的調用,那么你最好相當了解要重寫的方法的行為。 因為在試圖修改或重寫已有方法的行為時,很可能會破壞 MyBatis 的核心模塊。 這些都是更底層的類和方法,所以使用插件的時候要特別當心。
通過 MyBatis 提供的強大機制,使用插件是非常簡單的,只需實現 Interceptor 接口,并指定想要攔截的方法簽名即可。
@Intercepts({@Signature(type= Executor.class,method = "update",args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {private Properties properties = new Properties();public Object intercept(Invocation invocation) throws Throwable {// implement pre processing if needObject returnObject = invocation.proceed();// implement post processing if needreturn returnObject;}public void setProperties(Properties properties) {this.properties = properties;}
}
<plugins><plugin interceptor="org.mybatis.example.ExamplePlugin"><property name="someProperty" value="100"/></plugin>
</plugins>
上面的插件將會攔截在 Executor 實例中所有的 “update” 方法調用, 這里的 Executor 是負責執行底層映射語句的內部對象。
提示 覆蓋配置類
除了用插件來修改 MyBatis 核心行為以外,還可以通過完全覆蓋配置類來達到目的。只需繼承配置類后覆蓋其中的某個方法,再把它傳遞到 SqlSessionFactoryBuilder.build(myConfig) 方法即可。再次重申,這可能會極大影響 MyBatis 的行為,務請慎之又慎。
environments
MyBatis 可以配置成適應多種環境,這種機制有助于將 SQL 映射應用于多種數據庫之中, 現實情況下有多種理由需要這么做。例如,開發、測試和生產環境需要有不同的配置;或者想在具有相同 Schema 的多個生產數據庫中使用相同的 SQL 映射。還有許多類似的使用場景,使用數據源需和事務一起配置。
配置示例:
<environments default="development"><environment id="development"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment>
</environments>
databaseIdProvider
MyBatis 可以根據不同的數據庫廠商執行不同的語句,這種多廠商的支持是基于映射語句中的 databaseId
屬性。 MyBatis 會加載帶有匹配當前數據庫 databaseId
屬性和所有不帶 databaseId
屬性的語句。 如果同時找到帶有 databaseId
和不帶 databaseId
的相同語句,則后者會被舍棄。 為支持多廠商特性,只要像下面這樣在 mybatis-config.xml 文件中加入 databaseIdProvider
即可:
<databaseIdProvider type="DB_VENDOR" />
databaseIdProvider 對應的 DB_VENDOR 實現會將 databaseId 設置為 DatabaseMetaData#getDatabaseProductName()
返回的字符串。 由于通常情況下這些字符串都非常長,而且相同產品的不同版本會返回不同的值,你可能想通過設置屬性別名來使其變短:
<databaseIdProvider type="DB_VENDOR"><property name="SQL Server" value="sqlserver"/><property name="DB2" value="db2"/><property name="Oracle" value="oracle" />
</databaseIdProvider>
在提供了屬性別名時,databaseIdProvider 的 DB_VENDOR 實現會將 databaseId 設置為數據庫產品名與屬性中的名稱第一個相匹配的值,如果沒有匹配的屬性,將會設置為 “null”。 在這個例子中,如果 getDatabaseProductName()
返回“Oracle (DataDirect)”,databaseId 將被設置為“oracle”。
你可以通過實現接口 org.apache.ibatis.mapping.DatabaseIdProvider
并在 mybatis-config.xml 中注冊來構建自己的 DatabaseIdProvider:
public interface DatabaseIdProvider {default void setProperties(Properties p) { // 從 3.5.2 開始,該方法為默認方法// 空實現}String getDatabaseId(DataSource dataSource) throws SQLException;
}
mappers
映射SQL語句所在的xml文件盧路徑,可以使用四種指定方式:
<!-- 使用相對于類路徑的資源引用 -->
<mappers><mapper resource="org/mybatis/builder/AuthorMapper.xml"/><mapper resource="org/mybatis/builder/BlogMapper.xml"/><mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers><!-- 使用完全限定資源定位符(URL) -->
<mappers><mapper url="file:///var/mappers/AuthorMapper.xml"/><mapper url="file:///var/mappers/BlogMapper.xml"/><mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers><!-- 使用映射器接口實現類的完全限定類名 -->
<mappers><mapper class="org.mybatis.builder.AuthorMapper"/><mapper class="org.mybatis.builder.BlogMapper"/><mapper class="org.mybatis.builder.PostMapper"/>
</mappers><!-- 將包內的映射器接口實現全部注冊為映射器 -->
<mappers><package name="org.mybatis.builder"/>
</mappers>
?