Mybatis配置文件參數定義

官網有時候進不去,所以就記錄一下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 | falsetrue
lazyLoadingEnabled延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置 fetchType 屬性來覆蓋該項的開關狀態。true | falsefalse
aggressiveLazyLoading開啟時,任一方法的調用都會加載該對象的所有延遲加載屬性。 否則,每個延遲加載屬性會按需加載(參考 lazyLoadTriggerMethods)。true | falsefalse (在 3.4.1 及之前的版本中默認為 true)
multipleResultSetsEnabled是否允許單個語句返回多結果集(需要數據庫驅動支持)。true | falsetrue
useColumnLabel使用列標簽代替列名。實際表現依賴于數據庫驅動,具體可參考數據庫驅動的相關文檔,或通過對比測試來觀察。true | falsetrue
useGeneratedKeys允許 JDBC 支持自動生成主鍵,需要數據庫驅動支持。如果設置為 true,將強制使用自動生成主鍵。盡管一些數據庫驅動不支持此特性,但仍可正常工作(如 Derby)。true | falseFalse
autoMappingBehavior指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示關閉自動映射;PARTIAL 只會自動映射沒有定義嵌套結果映射的字段。 FULL 會自動映射任何復雜的結果集(無論是否嵌套)。NONE, PARTIAL, FULLPARTIAL
autoMappingUnknownColumnBehavior指定發現自動映射目標未知列(或未知屬性類型)的行為。
  • NONE: 不做任何反應
  • WARNING: 輸出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等級必須設置為 WARN
  • FAILING: 映射失敗 (拋出 SqlSessionException)
NONE, WARNING, FAILINGNONE
defaultExecutorType配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(PreparedStatement); BATCH 執行器不僅重用語句還會執行批量更新。SIMPLE REUSE BATCHSIMPLE
defaultStatementTimeout設置超時時間,它決定數據庫驅動等待數據庫響應的秒數。任意正整數未設置 (null)
defaultFetchSize為驅動的結果集獲取數量(fetchSize)設置一個建議值。此參數只可以在查詢設置中被覆蓋。任意正整數未設置 (null)
defaultResultSetType指定語句默認的滾動策略。(新增于 3.5.2)FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(等同于未設置)未設置 (null)
safeRowBoundsEnabled是否允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置為 false。true | falseFalse
safeResultHandlerEnabled是否允許在嵌套語句中使用結果處理器(ResultHandler)。如果允許使用則設置為 false。true | falseTrue
mapUnderscoreToCamelCase是否開啟駝峰命名自動映射,即從經典數據庫列名 A_COLUMN 映射到經典 Java 屬性名 aColumn。true | falseFalse
localCacheScopeMyBatis 利用本地緩存機制(Local Cache)防止循環引用和加速重復的嵌套查詢。 默認值為 SESSION,會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地緩存將僅用于執行語句,對相同 SqlSession 的不同查詢將不會進行緩存。SESSION | STATEMENTSESSION
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 | falsefalse
returnInstanceForEmptyRow當返回行的所有列都是空時,MyBatis默認返回 null。 當開啟這個設置時,MyBatis會返回一個空實例。 請注意,它也適用于嵌套的結果集(如集合或關聯)。(新增于 3.4.2)true | falsefalse
logPrefix指定 MyBatis 增加到日志名稱的前綴。任何字符串未設置
logImpl指定 MyBatis 所用日志的具體實現,未指定時將自動查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING未設置
proxyFactory指定 Mybatis 創建可延遲加載對象所用到的代理工具。CGLIB | JAVASSISTJAVASSIST (MyBatis 3.3 以上)
vfsImpl指定 VFS 的實現自定義 VFS 的實現的類全限定名,以逗號分隔。未設置
useActualParamName允許使用方法簽名中的名稱作為語句參數名稱。 為了使用該特性,你的項目必須采用 Java 8 編譯,并且加上 -parameters 選項。(新增于 3.4.1)true | falsetrue
configurationFactory指定一個提供 Configuration 實例的類。 這個被返回的 Configuration 實例用來加載被反序列化對象的延遲加載屬性值。 這個類必須包含一個簽名為static Configuration getConfiguration() 的方法。(新增于 3.2.3)一個類型別名或完全限定類名。未設置
shrinkWhitespacesInSql從SQL中刪除多余的空格字符。請注意,這也會影響SQL中的文字字符串。 (新增于 3.5.5)true | falsefalse
defaultSqlProviderTypeSpecifies 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 nameNot 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{//....}

在內部也有一些默認的別名:

別名映射的類型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

typeHandlers

MyBatis 在設置預處理語句(PreparedStatement)中的參數或從結果集中取出一個值時, 都會用類型處理器將獲取到的值以合適的方式轉換成 Java 類型。下表描述了一些默認的類型處理器。

提示:從 3.4.5 開始,MyBatis 默認支持 JSR-310(日期和時間 API) 。

類型處理器Java 類型JDBC 類型
BooleanTypeHandlerjava.lang.Boolean, boolean數據庫兼容的 BOOLEAN
ByteTypeHandlerjava.lang.Byte, byte數據庫兼容的 NUMERICBYTE
ShortTypeHandlerjava.lang.Short, short數據庫兼容的 NUMERICSMALLINT
IntegerTypeHandlerjava.lang.Integer, int數據庫兼容的 NUMERICINTEGER
LongTypeHandlerjava.lang.Long, long數據庫兼容的 NUMERICBIGINT
FloatTypeHandlerjava.lang.Float, float數據庫兼容的 NUMERICFLOAT
DoubleTypeHandlerjava.lang.Double, double數據庫兼容的 NUMERICDOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal數據庫兼容的 NUMERICDECIMAL
StringTypeHandlerjava.lang.StringCHAR, VARCHAR
ClobReaderTypeHandlerjava.io.Reader-
ClobTypeHandlerjava.lang.StringCLOB, LONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHAR, NCHAR
NClobTypeHandlerjava.lang.StringNCLOB
BlobInputStreamTypeHandlerjava.io.InputStream-
ByteArrayTypeHandlerbyte[]數據庫兼容的字節流類型
BlobTypeHandlerbyte[]BLOB, LONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER 或未指定類型
EnumTypeHandlerEnumeration TypeVARCHAR 或任何兼容的字符串類型,用來存儲枚舉的名稱(而不是索引序數值)
EnumOrdinalTypeHandlerEnumeration Type任何兼容的 NUMERICDOUBLE 類型,用來存儲枚舉的序數值(而不是名稱)。
SqlxmlTypeHandlerjava.lang.StringSQLXML
InstantTypeHandlerjava.time.InstantTIMESTAMP
LocalDateTimeTypeHandlerjava.time.LocalDateTimeTIMESTAMP
LocalDateTypeHandlerjava.time.LocalDateDATE
LocalTimeTypeHandlerjava.time.LocalTimeTIME
OffsetDateTimeTypeHandlerjava.time.OffsetDateTimeTIMESTAMP
OffsetTimeTypeHandlerjava.time.OffsetTimeTIME
ZonedDateTimeTypeHandlerjava.time.ZonedDateTimeTIMESTAMP
YearTypeHandlerjava.time.YearINTEGER
MonthTypeHandlerjava.time.MonthINTEGER
YearMonthTypeHandlerjava.time.YearMonthVARCHARLONGVARCHAR
JapaneseDateTypeHandlerjava.time.chrono.JapaneseDateDATE

你可以重寫已有的類型處理器或創建你自己的類型處理器來處理不支持的或非標準的類型。 具體做法為:實現 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;}...

EnumTypeHandlerEnumOrdinalTypeHandler 都是泛型類型處理器,我們將會在接下來的部分詳細探討。

若想映射枚舉類型 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>

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537134.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537134.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537134.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python和java后期發展_Python與java的發展前景誰最大

Python和Java是目前IT行業內兩大編程語言&#xff0c;很多人都喜歡拿來比較&#xff0c;一個是后起之秀&#xff0c;潛力無限&#xff1b;一個是行業經典&#xff0c;成熟穩定。對于許多想從事IT行業的同學來說&#xff0c;這兩門語言真的很難抉擇。那么&#xff0c;Python和Ja…

JDK源碼學習筆記——Enum枚舉使用及原理

一、為什么使用枚舉 什么時候應該使用枚舉呢&#xff1f;每當需要一組固定的常量的時候&#xff0c;如一周的天數、一年四季等。或者是在我們編譯前就知道其包含的所有值的集合。 利用 public final static 完全可以實現的功能&#xff0c;為什么要使用枚舉&#xff1f; public…

Mybatis源碼日志模塊分析

看源碼需要先下載源碼&#xff0c;可以去Mybatis的github上的倉庫進行下載&#xff0c;Mybatis 這次就先整理一下日志這一塊的源碼分析&#xff0c;這塊相對來說比較簡單而且這個模塊是Mybatis的基礎模塊。 之前的文章有談到過Java的日志實現&#xff0c;大家也可以參考一下&…

python手機端給電腦端發送數據_期貨交易軟件有哪些比較好用?分手機端和電腦端...

一、電腦端交易軟件期貨電腦端交易軟件目前市場上用的最多的是文華財經和博易大師&#xff0c;這兩個軟件都是免費交易使用的。從投資者使用角度來看&#xff0c;目前電腦端文華財經的評價比博易大師高一些。當然每個投資者有自己的使用習慣&#xff0c;博易大師也有自己優點&a…

Find the Difference(leetcode389)

2019獨角獸企業重金招聘Python工程師標準>>> Given two strings s and t which consist of only lowercase letters. String t is generated by random shuffling string s and then add one more letter at a random position. Find the letter that was added in …

Mybatis源碼之數據源模塊分析

先來看看java純jdbc查詢數據的示例&#xff1a; try {//加載對應的驅動類Class.forName("com.mysql.cj.jdbc.Driver");//創建連接Connection connection DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezoneUTC", "roo…

reactnative 獲取定位_[RN] React Native 獲取地理位置

import React, {Component} from react;import {StyleSheet, Text, View}from react-native;exportdefault classTestGeo extends Component {state{longitude:,//經度latitude: ,//緯度city: ,district:,street:,position:,//位置名稱};componentWillMount () >{this.getPo…

第二沖刺階段第三天

查閱資料&#xff0c;修改控件界面轉載于:https://www.cnblogs.com/gyy0/p/10066452.html

Mybatis源碼之緩存模塊分析

緩存這個東西在很多應用中都能看到它們的身影&#xff0c;這次就講講在Mybatis中的緩存是怎么應用的&#xff0c;雖然說吧Mybatis中的緩存基本不怎么用&#xff0c;用的更多是第三方組件redis、MongoDB、MemCache等等。 Mybatis的緩存是基于Map實現的&#xff0c;從緩存中讀寫…

Mybatis源碼之核心流程分析

終于談到了Mybatis最核心的東西了&#xff0c;最核心的就是通過配置XML文件或注解中的SQL&#xff0c;直接調用接口就能執行配置好的SQL語句并封裝成對應的返回類型的數據。 先看一下Mybatis使用示例&#xff1a; //創建Builder對象 SqlSessionFactoryBuilder builder new S…

mimakatz用法_兩步完成利用procdump64+mimikatz獲取win用戶密碼

使用procdump64mimikatz可實現從內存中獲取明文密碼工具鏈接&#xff1a;https://pan.baidu.com/s/1gNc9qLcNSNBohIVrAiqShw 密碼&#xff1a;fc38首先得先獲取到內存文件lsass.exe進程, 它用于本地安全和登陸策略,一般在進程管理器中能看到, 比如這樣1.導出lsass.exeprocdump6…

ios app提交之前需要哪幾個證書

1、遇到的問題 一款App在別人的機器上開發和發布&#xff0c;現在迭代更新和開發需要在一臺新mac機上開發和發布。&#xff08;使用同一個開發者賬號&#xff09;問題&#xff1a; 1.在新mac機器上開發并導入真機測試&#xff0c;是不是需要從別人的機器上面導處開發者證書、開…

Mybatis源碼之與Spring集成包

這次講講Mybatis與Spring的整合&#xff0c;作為兩款優秀的開源框架&#xff0c;被大眾廣泛使用&#xff0c;自然是需要強強聯合的。 使用示例 先看一下怎么使用&#xff0c;首先需要引用這兩款框架的jar包&#xff1a; <dependency>//spring-webmvc會自動去引入其他S…

hadoop主節點切換_hadoop2.0 HA的主備自動切換

在《hadoop2.0 QJM方式的HA的配置》一文中介紹了HA的配置&#xff0c;是通過手工進行主備切換的。本文在這基礎上&#xff0c;繼續介紹HA的主備自動切換(automatic failover)的配置。自動切換是通過配置zookeeper來實現的&#xff0c;關于zookeeper的安裝和配置&#xff0c;在這…

Mybatis源碼之插件模塊分析

總結完這個Mybatis的整體主要功能基本上就差不多完&#xff0c;還有一些細節的部分&#xff0c;后續都會記錄補充。 插件這個東西一般用的比較少&#xff0c;就算用的多的插件也算是PageHelper分頁插件&#xff1b; PageHelper官網&#xff1a;https://github.com/pagehelper…

AMD推出7nm高端顯卡Radeon VII,直指英偉達RTX 2080

顯卡戰爭已經發展到了2019年&#xff0c;并且變得比任何人預想的都要激烈。 CES 2019大會上&#xff0c;AMD發布了第一款消費級的 7nm GPU&#xff0c;取名&#xff1a;Radeon VII。據了解&#xff0c;這不是 AMD 的第一顆 7nm 處理器&#xff08;早期以 AI 運算為主的 Radeon …

電子繪本pdf_【孩子必看的】20本世界著名英文繪本 | PDF電子版+MP3音頻

原標題&#xff1a;【孩子必看的】20本世界著名英文繪本 | PDF電子版MP3音頻2 —6歲年齡段的孩子&#xff0c;自我意識逐漸萌芽&#xff0c;已經明白書是一種“特殊”的玩具&#xff0c;不在撕書、咬書、把書搬來搬去。這個階段他們記憶力超強&#xff0c;唐詩、三字經啥的&…

Spring集成Mybatis多數據源配置

既然在整理Mybatis那就把經常用的這個多數據源的筆記也整一下吧。 Spring集成Mybatis在之前就已經提到了。Spring集成Mybatis 集成Mybatis多數據源有兩種方式&#xff1a; 1、創建多個SqlSessionFactory&#xff0c;掃描每個SqlSessionFactoryBean對應的包&#xff0c;形成了…

Spring文件上傳

2019獨角獸企業重金招聘Python工程師標準>>> Spring文件上傳 1、所需依賴包&#xff1a;commons-fileupload-1.3.1.jar2、Maven配置文件pom.xml文件中加入依賴Jar包<dependency><groupId>commons-fileupload</groupId><artifactId>commons-…

中英離線翻譯mac_Instant Translate for Mac-即時翻譯Mac版下載 V1.3.0-PC6蘋果網

即時翻譯(Instant Translate)Mac版是一款Mac平臺的翻譯及辭典軟件&#xff0c;Instant Translate支持90的語言互翻譯&#xff0c;通過ControlS切換語言&#xff0c;并且支持發音功能&#xff0c;并且支持自動檢測語言并進行翻譯。軟件特色Instant Translate的主要特點&#xff…