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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

深入理解MyBatis的原理(三):配置文件(上)

發布時間:2025/7/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解MyBatis的原理(三):配置文件(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:前文提到一個入門的demo,從這里開始,會了解深入 MyBatis 的配置,本文講解 MyBatis 的配置文件的用法。

目錄

1、properties 元素

2、設置(settings)

3、別名(typeAliases)

配置 XML 文件的層次結構?

<?xml version="1.0" encoding="UTF-8"?> <configuration><!--配置--><properties/><!--屬性--><settions/><!--設置--><typeAliases/><!--類型命名,不區分大小寫--><typeHandlers/><!--類型處理器--><objectFactory/><!--對象工廠--><plugins/><!--插件--><environments><!--配置環境--><environment><transactionManager/><!--事務管理器--><dataSource/><!--數據源--></environment></environments><databaseIdProvider/><!--數據庫廠商標識--><mappers/><!--映射器--> </configuration>

  注意:MyBatis 配置 XML 文件的層次結構。這些層次是不能夠顛倒順序的,如果顛倒順序,MyBatis 在解析 XML 文件的時候就會出現異常。

xml 為什么不能顛倒順序

  至于為什么不能顛倒順序,是由于 MyBatis3 是使用 dtd 文件作為 xml 文件的格式校驗的,而在 xml 規范中,dtd 是有嚴格校驗順序的。

  在 idea 中,如果顛倒順序,idea 會提示下圖信息:

  查看源碼可以得知,在 org/apache/ibatis/builder/xml/mybatis-3-config.dtd 文件中,有明確定義該順序:

1、properties 元素

  properties 是一個配置屬性的元素,讓我們能夠在配置文件的上下文中(其他配置屬性里面,比如環境配置)使用它。

  我們可以有 3 種配置方式:property 子元素、properties 配置文件、程序的參數傳遞。

1.1、property 子元素

  dtd 的規則

  

  配置好后在數據庫環境配置里使用

<!--屬性,property 子元素--><properties><property name="driver" value="oracle.jdbc.OracleDriver"/><property name="datasourceurl" value="jdbc:oracle:thin:@localhost:1521:ORCL"/><property name="username" value="testdev"/><property name="password" value="test1234"/></properties><!--配置環境--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${datasourceurl}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>

1.2 properties 配置文件

  經常,我們都喜歡使用 properties 配置文件來配置屬性值,方便我們在多個配置文件中重復使用,更是為了方便系統上線后的維護和修改。

  dtd 的規則

  建一個 db.properties 文件

driver=oracle.jdbc.OracleDriver datasourceurl=jdbc:oracle:thin:@localhost:1521:ORCL username=testdev password=test1234

  配置文件

<properties resource="config/system/db.properties"/><!--配置環境--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${datasourceurl}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>

1.3 程序參數傳遞

  有時,我們的數據庫名和密碼不對開發公布,而是由運維人員配置的,所以這是數據庫名和密碼可以加密配置在 db.properties 文件中,然后由程序去 decode,創建 sqlSessionFactory 時采用 SqlSessionFactoryBuilder 的?public SqlSessionFactory build(Reader reader, Properties roperties) 方法。

  程序部分代碼如下

  /*** 初始化sqlSessionFactory,針對數據庫的密碼和用戶名加密的情況* @throws IOException*/public void initSqlSessionFactoryForEncodeDbInfo() throws IOException {//讀入配置文件流InputStream inputStream = Resources.getResourceAsStream("configuration.xml");Reader reader = new InputStreamReader(inputStream);//讀入屬性文件Reader propertiesReader = new InputStreamReader(Resources.getResourceAsStream("config/system/db.properties"));Properties properties = new Properties();properties.load(propertiesReader);//解密properties.setProperty("username", decode(properties.get("username")));properties.setProperty("password", decode(properties.get("password")));sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, properties);}

1.4 優先級

  方法參數傳遞的屬性優先級最高,次之是 resource/url 屬性中的配置,最后是 property 中的屬性。

  但是在實際中最好使用 properties 文件的配置方式。

2、設置(settings)

  settings 比較復雜,也很重要,它會改變 MyBatis 運行時的行文。不配置 settings,MyBatis也可以正常工作。

  大部分情況下,我們都可以不去配置 settings,或者只需修改幾個配置即可。

設置參數描述有效值默認值
cacheEnabled該配置影響的所有映射器中配置的緩存的全局開關true | falsetrue
lazyLoadingEnabled延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態true | falsefalse
aggressiveLazyLoading當啟用時,對任意延遲屬性的調用會使帶有延遲加載屬性的對象完整加載;反之,每種屬性將會按需加載。true | falsetrue
multipleResultSetsEnabled是否允許單一語句返回多結果集(需要兼容驅動)。true | falsetrue
useColumnLabel使用列標簽代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。true | falsetrue
useGeneratedKeys允許 JDBC 支持自動生成主鍵,需要驅動兼容。 如果設置為 true 則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容但仍可正常工作(比如 Derby)。true | falseFalse
autoMappingBehavior指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集(無論是否嵌套)。NONE, PARTIAL, FULLPARTIAL
defaultExecutorType配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句并執行批量更新。SIMPLE REUSE BATCHSIMPLE
defaultStatementTimeout設置超時時間,它決定驅動等待數據庫響應的秒數。Any positive integerNot Set (null)
defaultFetchSizeSets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting.Any positive integerNot Set (null)
safeRowBoundsEnabled允許在嵌套語句中使用分頁(RowBounds)。true | falseFalse
mapUnderscoreToCamelCase是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。true | falseFalse
localCacheScopeMyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。SESSION | STATEMENTSESSION
jdbcTypeForNull當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。JdbcType enumeration. Most common are: NULL, VARCHAR and OTHEROTHER
lazyLoadTriggerMethods指定哪個對象的方法觸發一次延遲加載。A method name list separated by commasequals,clone,hashCode,toString
defaultScriptingLanguage指定動態 SQL 生成的默認語言。A type alias or fully qualified class name.org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
callSettersOnNulls指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這對于有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(int、boolean等)是不能設置成 null 的。true | falsefalse
logPrefix指定 MyBatis 增加到日志名稱的前綴。Any StringNot set
logImpl指定 MyBatis 所用日志的具體實現,未指定時將自動查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGINGNot set
proxyFactory指定 Mybatis 創建具有延遲加載能力的對象所用到的代理工具。CGLIB | JAVASSISTJAVASSIST (MyBatis 3.3 or above)

3、別名(typeAliases)

  ?別名是一個指代的名稱??梢栽?MyBatis 的上下文中使用。

  在 MyBatis 中別名是不分大小寫的。

  一個 typeAliases 的實例是在解析配置文件時(源碼在?XMLConfigBuilder 中)生成的,然后長期保存在 Configuration 對象中,當我們使用它時,再把它拿出來,這樣就沒有必要運行時再次生成它的實例了。

  別名分為系統定義別名和自定義別名。

3.1 為什么 MyBatis 中別名是部分大小寫的

  因為源碼 org.apache.ibatis.type.TypeAliasRegistry 如下:

public void registerAlias(String alias, Class<?> value) {if(alias == null) {throw new TypeException("The parameter alias cannot be null");} else {String key = alias.toLowerCase(Locale.ENGLISH);if(this.TYPE_ALIASES.containsKey(key) && this.TYPE_ALIASES.get(key) != null && !((Class)this.TYPE_ALIASES.get(key)).equals(value)) {throw new TypeException("The alias '" + alias + "' is already mapped to the value '" + ((Class)this.TYPE_ALIASES.get(key)).getName() + "'.");} else {this.TYPE_ALIASES.put(key, value);}}}

3.2 系統定義別名

  MyBatis 自己有定義一些常用的別名,我們可以直接使用它們,不用自己定義,也不要再使用時重復定義把它們給覆蓋了。

  支持數組類型的只要加“[]”即可。比如 Integer 數組,則別名為 int[]。

別名Java類型是否支持數組
_bytebytey
_longlongy
_shortshorty
_intinty
_integerinty
_doubledoubley
_floatfloaty
_booleanbooleany
stringStringy
byteBytey
longLongy
shortShorty
intIntegery
integerIntegery
doubleDoubley
floatFloaty
booleanBooleany
dateDatey
decimalBigDecimaly
bigdecimalBigDecimaly
objectObjecty
mapMapn
hashmapHashMapn
listListn
arraylistArrayListn
collectionCollectionn
iteratorIteratorn
ResultSetResultSet

n

?

  源碼?org.apache.ibatis.type.TypeAliasRegistry 中可以看出其自定義注冊的信息,源碼如下:

public TypeAliasRegistry() {this.registerAlias("string", String.class);this.registerAlias("byte", Byte.class);this.registerAlias("long", Long.class);this.registerAlias("short", Short.class);this.registerAlias("int", Integer.class);this.registerAlias("integer", Integer.class);this.registerAlias("double", Double.class);this.registerAlias("float", Float.class);this.registerAlias("boolean", Boolean.class);this.registerAlias("byte[]", Byte[].class);this.registerAlias("long[]", Long[].class);this.registerAlias("short[]", Short[].class);this.registerAlias("int[]", Integer[].class);this.registerAlias("integer[]", Integer[].class);this.registerAlias("double[]", Double[].class);this.registerAlias("float[]", Float[].class);this.registerAlias("boolean[]", Boolean[].class);this.registerAlias("_byte", Byte.TYPE);this.registerAlias("_long", Long.TYPE);this.registerAlias("_short", Short.TYPE);this.registerAlias("_int", Integer.TYPE);this.registerAlias("_integer", Integer.TYPE);this.registerAlias("_double", Double.TYPE);this.registerAlias("_float", Float.TYPE);this.registerAlias("_boolean", Boolean.TYPE);this.registerAlias("_byte[]", byte[].class);this.registerAlias("_long[]", long[].class);this.registerAlias("_short[]", short[].class);this.registerAlias("_int[]", int[].class);this.registerAlias("_integer[]", int[].class);this.registerAlias("_double[]", double[].class);this.registerAlias("_float[]", float[].class);this.registerAlias("_boolean[]", boolean[].class);this.registerAlias("date", Date.class);this.registerAlias("decimal", BigDecimal.class);this.registerAlias("bigdecimal", BigDecimal.class);this.registerAlias("biginteger", BigInteger.class);this.registerAlias("object", Object.class);this.registerAlias("date[]", Date[].class);this.registerAlias("decimal[]", BigDecimal[].class);this.registerAlias("bigdecimal[]", BigDecimal[].class);this.registerAlias("biginteger[]", BigInteger[].class);this.registerAlias("object[]", Object[].class);this.registerAlias("map", Map.class);this.registerAlias("hashmap", HashMap.class);this.registerAlias("list", List.class);this.registerAlias("arraylist", ArrayList.class);this.registerAlias("collection", Collection.class);this.registerAlias("iterator", Iterator.class);this.registerAlias("ResultSet", ResultSet.class);} View Code

3.3 自定義別名

  (1)在配置文件中寫法如下

<!--定義別名--><typeAliases><typeAlias type="com.yule.user.entity.User" alias="user"/></typeAliases>

  (2)或者當實體類較多的時候,使用自動掃描的形式自定義別名

<!--定義別名--><typeAliases> <package name="com.yule.user.entity"/></typeAliases>

  同時也可以在實體類上使用注解 @Alias

@Alias("user") public class User {//do somethings }

  注意:如果配置了包掃描的路徑,那么沒有在實體上加注解 @Alias 的類也在裝載在 MyBatis 的上下文中,只是 MyBatis 將類名的第一個字母變為小寫,作為 MyBatis 上下文中的別名,所以要特別注意避免重名的情況,建議使用部分包名+類名的限定。

?

轉載于:https://www.cnblogs.com/yuxiaole/p/9463120.html

總結

以上是生活随笔為你收集整理的深入理解MyBatis的原理(三):配置文件(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 三区四区| 91综合网 | 中文字幕第31页 | 免费涩涩| 国产农村妇女毛片精品久久 | 欧美三级一区 | 亚洲精品9| 丰满女人又爽又紧又丰满 | 久久精品五月天 | 久久久久亚洲av成人毛片韩 | 日韩av在线网 | www.亚洲 | 精品美女在线观看 | 最新av网址在线观看 | 国产精品情侣呻吟对白视频 | 国产色婷婷 | 亚洲黄在线观看 | 亚洲精品一二三四区 | 99久久久久久久久 | 打美女白嫩屁屁网站 | 男女日批网站 | 91久久精品国产91性色69 | 欧美成人亚洲 | 三级特黄 | 第四色在线视频 | 美女干b视频 | 国产99久久九九精品无码免费 | 伊人久久精品一区二区三区 | 国内自拍欧美 | 国产在线观看免费视频软件 | 欧美成人高清在线 | 婷婷去俺也去 | 国产精品秘入口18禁麻豆免会员 | 六月丁香婷婷网 | 亚洲天堂中文字幕 | 日韩在线观看网址 | 欧美精品久久久久久久久老牛影院 | 特黄特色大片免费 | 黄色美女毛片 | 国产每日更新 | 成人动漫免费在线观看 | 男生和女生一起搞鸡 | 一区二区三区四区影院 | 女人高潮潮呻吟喷水 | av国产免费 | 深夜激情影院 | 999久久久免费精品国产 | 福利视频在线看 | 野外做受又硬又粗又大视频√ | wwwww在线观看| www.桃色 | 国产精品6 | 宿舍女女闺蜜调教羞辱 | 国产肥白大熟妇bbbb视频 | 找国产毛片看 | 亚洲少妇第一页 | 国产一级片自拍 | 黄色视屏在线播放 | 综合99 | 午夜影院免费体验区 | www五月天com | 日韩激情免费 | 欧美三区四区 | 中文字幕av影院 | 少妇视频| 久色网 | 国产youjizz | 亚洲欧美另类综合 | 国产三级在线播放 | 一级国产黄色片 | 蜜桃精品在线 | 精品国产无码一区二区 | 亚洲精品一区在线 | 青娱乐在线免费视频 | av天天射 | 亚洲精品一区二区三区蜜桃久 | 青青视频网站 | 日韩有码中文字幕在线 | 国产中文字幕三区 | 免费不卡av | 福利精品| 亚洲美女一区二区三区 | 中文字幕日韩精品在线观看 | 中文字幕av一区二区三区谷原希美 | 懂色av一区二区三区免费观看 | 永久毛片 | 欧美老熟妇一区二区三区 | 狠狠操狠狠插 | 9999精品视频 | 国产高清一区二区三区 | av三级网站 | 欧美成人三级在线播放 | 精品国产97| 日韩福利片在线观看 | 新红楼梦2005锦江版高清在线观看 | 国产视频一二三四区 | 天天操国产| 好吊色综合 | 超碰老司机 |