日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mybatis配置文件参数定义

發(fā)布時間:2025/3/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis配置文件参数定义 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

官網(wǎng)有時候進不去,所以就記錄一下Mybatis的配置文件的各項參數(shù)定義,大家也可以上官網(wǎng)查詢,官方文檔,進不進的去看各自的緣分了

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}將對應的屬性進行動態(tài)的替換,比如:

<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 元素體內(nèi)指定的屬性。

2、然后根據(jù) properties 元素中的 resource 屬性讀取類路徑下屬性文件,或根據(jù) url 屬性指定的路徑讀取屬性文件,并覆蓋之前讀取過的同名屬性。

3、加載使用SqlSessionFactory中屬性值,即下面的生產(chǎn)的工廠類傳入的參數(shù)

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); . . . builder.build(Resources.getResourceAsStream("mybatis/mybatis-cfg.xml"),null,new Properties());

因此,通過方法參數(shù)傳遞的屬性具有最高優(yōu)先級,resource/url 屬性中指定的配置文件次之,最低優(yōu)先級的則是 properties 元素中指定的屬性。

settings

這個是調(diào)整mybatis運行的一些行為參數(shù),參數(shù)默認值如下:

設置名描述有效值默認值
cacheEnabled全局性地開啟或關(guān)閉所有映射器配置文件中已配置的任何緩存。true | falsetrue
lazyLoadingEnabled延遲加載的全局開關(guān)。當開啟時,所有關(guān)聯(lián)對象都會延遲加載。 特定關(guān)聯(lián)關(guān)系中可通過設置 fetchType 屬性來覆蓋該項的開關(guān)狀態(tài)。true | falsefalse
aggressiveLazyLoading開啟時,任一方法的調(diào)用都會加載該對象的所有延遲加載屬性。 否則,每個延遲加載屬性會按需加載(參考 lazyLoadTriggerMethods)。true | falsefalse (在 3.4.1 及之前的版本中默認為 true)
multipleResultSetsEnabled是否允許單個語句返回多結(jié)果集(需要數(shù)據(jù)庫驅(qū)動支持)。true | falsetrue
useColumnLabel使用列標簽代替列名。實際表現(xiàn)依賴于數(shù)據(jù)庫驅(qū)動,具體可參考數(shù)據(jù)庫驅(qū)動的相關(guān)文檔,或通過對比測試來觀察。true | falsetrue
useGeneratedKeys允許 JDBC 支持自動生成主鍵,需要數(shù)據(jù)庫驅(qū)動支持。如果設置為 true,將強制使用自動生成主鍵。盡管一些數(shù)據(jù)庫驅(qū)動不支持此特性,但仍可正常工作(如 Derby)。true | falseFalse
autoMappingBehavior指定 MyBatis 應如何自動映射列到字段或?qū)傩浴?NONE 表示關(guān)閉自動映射;PARTIAL 只會自動映射沒有定義嵌套結(jié)果映射的字段。 FULL 會自動映射任何復雜的結(jié)果集(無論是否嵌套)。NONE, PARTIAL, FULLPARTIAL
autoMappingUnknownColumnBehavior指定發(fā)現(xiàn)自動映射目標未知列(或未知屬性類型)的行為。
  • NONE: 不做任何反應
  • WARNING: 輸出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等級必須設置為 WARN)
  • FAILING: 映射失敗 (拋出 SqlSessionException)
NONE, WARNING, FAILINGNONE
defaultExecutorType配置默認的執(zhí)行器。SIMPLE 就是普通的執(zhí)行器;REUSE 執(zhí)行器會重用預處理語句(PreparedStatement); BATCH 執(zhí)行器不僅重用語句還會執(zhí)行批量更新。SIMPLE REUSE BATCHSIMPLE
defaultStatementTimeout設置超時時間,它決定數(shù)據(jù)庫驅(qū)動等待數(shù)據(jù)庫響應的秒數(shù)。任意正整數(shù)未設置 (null)
defaultFetchSize為驅(qū)動的結(jié)果集獲取數(shù)量(fetchSize)設置一個建議值。此參數(shù)只可以在查詢設置中被覆蓋。任意正整數(shù)未設置 (null)
defaultResultSetType指定語句默認的滾動策略。(新增于 3.5.2)FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(等同于未設置)未設置 (null)
safeRowBoundsEnabled是否允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置為 false。true | falseFalse
safeResultHandlerEnabled是否允許在嵌套語句中使用結(jié)果處理器(ResultHandler)。如果允許使用則設置為 false。true | falseTrue
mapUnderscoreToCamelCase是否開啟駝峰命名自動映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 映射到經(jīng)典 Java 屬性名 aColumn。true | falseFalse
localCacheScopeMyBatis 利用本地緩存機制(Local Cache)防止循環(huán)引用和加速重復的嵌套查詢。 默認值為 SESSION,會緩存一個會話中執(zhí)行的所有查詢。 若設置值為 STATEMENT,本地緩存將僅用于執(zhí)行語句,對相同 SqlSession 的不同查詢將不會進行緩存。SESSION | STATEMENTSESSION
jdbcTypeForNull當沒有為參數(shù)指定特定的 JDBC 類型時,空值的默認 JDBC 類型。 某些數(shù)據(jù)庫驅(qū)動需要指定列的 JDBC 類型,多數(shù)情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。JdbcType 常量,常用值:NULL、VARCHAR 或 OTHER。OTHER
lazyLoadTriggerMethods指定對象的哪些方法觸發(fā)一次延遲加載。用逗號分隔的方法列表。equals,clone,hashCode,toString
defaultScriptingLanguage指定動態(tài) SQL 生成使用的默認腳本語言。一個類型別名或全限定類名。org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultEnumTypeHandler指定 Enum 使用的默認 TypeHandler 。(新增于 3.4.5)一個類型別名或全限定類名。org.apache.ibatis.type.EnumTypeHandler
callSettersOnNulls指定當結(jié)果集中值為 null 的時候是否調(diào)用映射對象的 setter(map 對象時為 put)方法,這在依賴于 Map.keySet() 或 null 值進行初始化時比較有用。注意基本類型(int、boolean 等)是不能設置成 null 的。true | falsefalse
returnInstanceForEmptyRow當返回行的所有列都是空時,MyBatis默認返回 null。 當開啟這個設置時,MyBatis會返回一個空實例。 請注意,它也適用于嵌套的結(jié)果集(如集合或關(guān)聯(lián))。(新增于 3.4.2)true | falsefalse
logPrefix指定 MyBatis 增加到日志名稱的前綴。任何字符串未設置
logImpl指定 MyBatis 所用日志的具體實現(xiàn),未指定時將自動查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING未設置
proxyFactory指定 Mybatis 創(chuàng)建可延遲加載對象所用到的代理工具。CGLIB | JAVASSISTJAVASSIST (MyBatis 3.3 以上)
vfsImpl指定 VFS 的實現(xiàn)自定義 VFS 的實現(xiàn)的類全限定名,以逗號分隔。未設置
useActualParamName允許使用方法簽名中的名稱作為語句參數(shù)名稱。 為了使用該特性,你的項目必須采用 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參數(shù)可指定別名進行替換

<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{//....}

在內(nèi)部也有一些默認的別名:

別名映射的類型
_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)中的參數(shù)或從結(jié)果集中取出一個值時, 都會用類型處理器將獲取到的值以合適的方式轉(zhuǎn)換成 Java 類型。下表描述了一些默認的類型處理器。

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

類型處理器Java 類型JDBC 類型
BooleanTypeHandlerjava.lang.Boolean, boolean數(shù)據(jù)庫兼容的 BOOLEAN
ByteTypeHandlerjava.lang.Byte, byte數(shù)據(jù)庫兼容的 NUMERIC 或 BYTE
ShortTypeHandlerjava.lang.Short, short數(shù)據(jù)庫兼容的 NUMERIC 或 SMALLINT
IntegerTypeHandlerjava.lang.Integer, int數(shù)據(jù)庫兼容的 NUMERIC 或 INTEGER
LongTypeHandlerjava.lang.Long, long數(shù)據(jù)庫兼容的 NUMERIC 或 BIGINT
FloatTypeHandlerjava.lang.Float, float數(shù)據(jù)庫兼容的 NUMERIC 或 FLOAT
DoubleTypeHandlerjava.lang.Double, double數(shù)據(jù)庫兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal數(shù)據(jù)庫兼容的 NUMERIC 或 DECIMAL
StringTypeHandlerjava.lang.StringCHAR, VARCHAR
ClobReaderTypeHandlerjava.io.Reader-
ClobTypeHandlerjava.lang.StringCLOB, LONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHAR, NCHAR
NClobTypeHandlerjava.lang.StringNCLOB
BlobInputStreamTypeHandlerjava.io.InputStream-
ByteArrayTypeHandlerbyte[]數(shù)據(jù)庫兼容的字節(jié)流類型
BlobTypeHandlerbyte[]BLOB, LONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER 或未指定類型
EnumTypeHandlerEnumeration TypeVARCHAR 或任何兼容的字符串類型,用來存儲枚舉的名稱(而不是索引序數(shù)值)
EnumOrdinalTypeHandlerEnumeration Type任何兼容的 NUMERIC 或 DOUBLE 類型,用來存儲枚舉的序數(shù)值(而不是名稱)。
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.YearMonthVARCHAR 或 LONGVARCHAR
JapaneseDateTypeHandlerjava.time.chrono.JapaneseDateDATE

你可以重寫已有的類型處理器或創(chuàng)建你自己的類型處理器來處理不支持的或非標準的類型。 具體做法為:實現(xiàn) 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 類型的參數(shù)和結(jié)果的類型處理器。 要注意 MyBatis 不會通過檢測數(shù)據(jù)庫元信息來決定使用哪種類型,所以你必須在參數(shù)和結(jié)果映射中指明字段是 VARCHAR 類型, 以使其能夠綁定到正確的類型處理器上。這是因為 MyBatis 直到語句被執(zhí)行時才清楚數(shù)據(jù)類型。

通過類型處理器的泛型,MyBatis 可以得知該類型處理器處理的 Java 類型,不過這種行為可以通過兩種方法改變:

  • 在類型處理器的配置元素(typeHandler 元素)上增加一個 javaType 屬性(比如:javaType="String");
  • 在類型處理器的類上增加一個 @MappedTypes 注解指定與其關(guān)聯(lián)的 Java 類型列表。 如果在 javaType 屬性中也同時指定,則注解上的配置將被忽略。

可以通過兩種方式來指定關(guān)聯(lián)的 JDBC 類型:

  • 在類型處理器的配置元素上增加一個 jdbcType 屬性(比如:jdbcType="VARCHAR");
  • 在類型處理器的類上增加一個 @MappedJdbcTypes 注解指定與其關(guān)聯(lián)的 JDBC 類型列表。 如果在 jdbcType 屬性中也同時指定,則注解上的配置將被忽略。

當在 ResultMap 中決定使用哪種類型處理器時,此時 Java 類型是已知的(從結(jié)果類型中獲得),但是 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>

注意在使用自動發(fā)現(xiàn)功能的時候,只能通過注解方式來指定 JDBC 的類型。

你可以創(chuàng)建能夠處理多個類的泛型類型處理器。為了使用泛型類型處理器, 需要增加一個接受該類的 class 作為參數(shù)的構(gòu)造器,這樣 MyBatis 會在構(gòu)造一個類型處理器實例的時候傳入一個具體的類。

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 值轉(zhuǎn)換成對應的名字。

注意 EnumTypeHandler 在某種意義上來說是比較特別的,其它的處理器只針對某個特定的類,而它不同,它會處理任意繼承了 Enum 的類。

不過,我們可能不想存儲名字,相反我們的 DBA 會堅持使用整形值代碼。那也一樣簡單:在配置文件中把 EnumOrdinalTypeHandler 加到 typeHandlers 中即可, 這樣每個 RoundingMode 將通過他們的序數(shù)值來映射成對應的整形數(shù)值。

<!-- mybatis-config.xml --> <typeHandlers><typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/> </typeHandlers>

但要是你想在一個地方將 Enum 映射成字符串,在另外一個地方映射成整形值呢?

自動映射器(auto-mapper)會自動地選用 EnumOrdinalTypeHandler 來處理枚舉類型, 所以如果我們想用普通的 EnumTypeHandler,就必須要顯式地為那些 SQL 語句設置要使用的類型處理器。

(下一節(jié)才開始介紹映射器文件,如果你是首次閱讀該文檔,你可能需要先跳過這里,過會再來看。)

<!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 創(chuàng)建結(jié)果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成實例化工作。 默認的對象工廠需要做的僅僅是實例化目標類,要么通過默認無參構(gòu)造方法,要么通過存在的參數(shù)映射來調(diào)用帶有參數(shù)的構(gòu)造方法。 如果想覆蓋對象工廠的默認行為,可以通過創(chuàng)建自己的對象工廠來實現(xiàn)。比如:

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 接口很簡單,它包含兩個創(chuàng)建實例用的方法,一個是處理默認無參構(gòu)造方法的,另外一個是處理帶參數(shù)的構(gòu)造方法的。 另外,setProperties 方法可以被用來配置 ObjectFactory,在初始化你的 ObjectFactory 實例后, objectFactory 元素體中定義的屬性會被傳遞給 setProperties 方法。

plugins

MyBatis 允許你在映射語句執(zhí)行過程中的某一點進行攔截調(diào)用。默認情況下,MyBatis 允許使用插件來攔截的方法調(diào)用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

這些類中方法的細節(jié)可以通過查看每個方法的簽名來發(fā)現(xiàn),或者直接查看 MyBatis 發(fā)行包中的源代碼。 如果你想做的不僅僅是監(jiān)控方法的調(diào)用,那么你最好相當了解要重寫的方法的行為。 因為在試圖修改或重寫已有方法的行為時,很可能會破壞 MyBatis 的核心模塊。 這些都是更底層的類和方法,所以使用插件的時候要特別當心。

通過 MyBatis 提供的強大機制,使用插件是非常簡單的,只需實現(xiàn) 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” 方法調(diào)用, 這里的 Executor 是負責執(zhí)行底層映射語句的內(nèi)部對象。

提示 覆蓋配置類

除了用插件來修改 MyBatis 核心行為以外,還可以通過完全覆蓋配置類來達到目的。只需繼承配置類后覆蓋其中的某個方法,再把它傳遞到 SqlSessionFactoryBuilder.build(myConfig) 方法即可。再次重申,這可能會極大影響 MyBatis 的行為,務請慎之又慎。

environments

MyBatis 可以配置成適應多種環(huán)境,這種機制有助于將 SQL 映射應用于多種數(shù)據(jù)庫之中, 現(xiàn)實情況下有多種理由需要這么做。例如,開發(fā)、測試和生產(chǎn)環(huán)境需要有不同的配置;或者想在具有相同 Schema 的多個生產(chǎn)數(shù)據(jù)庫中使用相同的 SQL 映射。還有許多類似的使用場景,使用數(shù)據(jù)源需和事務一起配置。

配置示例:

<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 可以根據(jù)不同的數(shù)據(jù)庫廠商執(zhí)行不同的語句,這種多廠商的支持是基于映射語句中的 databaseId 屬性。 MyBatis 會加載帶有匹配當前數(shù)據(jù)庫 databaseId 屬性和所有不帶 databaseId 屬性的語句。 如果同時找到帶有 databaseId 和不帶 databaseId 的相同語句,則后者會被舍棄。 為支持多廠商特性,只要像下面這樣在 mybatis-config.xml 文件中加入 databaseIdProvider 即可:

<databaseIdProvider type="DB_VENDOR" />

databaseIdProvider 對應的 DB_VENDOR 實現(xiàn)會將 databaseId 設置為 DatabaseMetaData#getDatabaseProductName() 返回的字符串。 由于通常情況下這些字符串都非常長,而且相同產(chǎn)品的不同版本會返回不同的值,你可能想通過設置屬性別名來使其變短:

<databaseIdProvider type="DB_VENDOR"><property name="SQL Server" value="sqlserver"/><property name="DB2" value="db2"/><property name="Oracle" value="oracle" /> </databaseIdProvider>

在提供了屬性別名時,databaseIdProvider 的 DB_VENDOR 實現(xiàn)會將 databaseId 設置為數(shù)據(jù)庫產(chǎn)品名與屬性中的名稱第一個相匹配的值,如果沒有匹配的屬性,將會設置為 “null”。 在這個例子中,如果 getDatabaseProductName() 返回“Oracle (DataDirect)”,databaseId 將被設置為“oracle”。

你可以通過實現(xiàn)接口 org.apache.ibatis.mapping.DatabaseIdProvider 并在 mybatis-config.xml 中注冊來構(gòu)建自己的 DatabaseIdProvider:

public interface DatabaseIdProvider {default void setProperties(Properties p) { // 從 3.5.2 開始,該方法為默認方法// 空實現(xiàn)}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><!-- 使用映射器接口實現(xiàn)類的完全限定類名 --> <mappers><mapper class="org.mybatis.builder.AuthorMapper"/><mapper class="org.mybatis.builder.BlogMapper"/><mapper class="org.mybatis.builder.PostMapper"/> </mappers><!-- 將包內(nèi)的映射器接口實現(xiàn)全部注冊為映射器 --> <mappers><package name="org.mybatis.builder"/> </mappers>

?

總結(jié)

以上是生活随笔為你收集整理的Mybatis配置文件参数定义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。