MyBatis中的配置文件詳解
前言
在 MyBatis 中,配置文件分為 全局配置文件(核心配置文件) 和 映射配置文件 。通過這兩個配置文件,MyBatis 可以根據(jù)需要動態(tài)地生成 SQL 語句并執(zhí)行,同時將結(jié)果集轉(zhuǎn)換成 Java 對象,使得在 Java 程序中操作數(shù)據(jù)庫變得更加方便和靈活。
全局配置文件
全局配置文件(Core Configuration File),是 MyBatis 的核心配置文件,通常命名為 mybatis-config.xml 。這個文件包含 MyBatis 運(yùn)行時所需的核心配置信息,如數(shù)據(jù)庫連接信息、事務(wù)管理器、別名、映射文件等。
全局配置文件通常的結(jié)構(gòu)
configuration(配置)
properties(屬性)
settings(設(shè)置)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環(huán)境配置)
– environment(環(huán)境變量)
---- transactionManager(事務(wù)管理器)
---- dataSource(數(shù)據(jù)源)
databaseIdProvider(數(shù)據(jù)庫廠商標(biāo)識)
mappers(映射器)
常見全局配置標(biāo)簽
標(biāo)簽 | 說明 |
---|---|
configuration | 配置文件的根標(biāo)簽。包含其他所有的配置標(biāo)簽 |
properties | 設(shè)置外部配置且可動態(tài)替換的標(biāo)簽。一般用于讀取外部的 properties 屬性文件 |
settings | 配置 MyBatis 運(yùn)行時行為的標(biāo)簽。一般情況下使用默認(rèn)值即可 |
typeAliases | 設(shè)置別名的標(biāo)簽。可以簡化類型名稱的書寫,如可以用一個別名代替一個類全名 |
typeHandlers | 指定處理 Java 類型的 TypeHandler 的標(biāo)簽。通過配置 typeHandlers,可以在全局范圍內(nèi)注冊自定義的 TypeHandler,使得在所有的 SQL 語句中都可以使用該 TypeHandler 來處理特定的 Java 類型 |
objectFactory | 指定對象工廠的標(biāo)簽。通過配置 objectFactory ,可以在全局范圍內(nèi)指定一個自定義的對象工廠,用于創(chuàng)建所有映射器文件中需要的對象實(shí)例 |
plugins | 注冊插件的標(biāo)簽。通過配置 plugins ,可以在全局范圍內(nèi)注冊自定義的插件,使得插件可以攔截目標(biāo)方法,并在目標(biāo)方法執(zhí)行前后添加額外的邏輯,如日志記錄、權(quán)限校驗(yàn)、緩存控制等 |
environments | 配置環(huán)境的標(biāo)簽。如開發(fā)環(huán)境、測試環(huán)境和生產(chǎn)環(huán)境等。每個環(huán)境(environment)可以設(shè)置一個事務(wù)管理器(Transaction Manager)和一個數(shù)據(jù)源(DataSource) |
databaseIdProvider | 指定數(shù)據(jù)庫標(biāo)識提供者的標(biāo)簽。MyBatis 可以根據(jù)不同的數(shù)據(jù)庫廠商執(zhí)行不同的 SQL 語句 |
mappers | 指定映射文件路徑的標(biāo)簽。MyBatis 會加載這些文件并將其應(yīng)用于相應(yīng)的數(shù)據(jù)庫操作 |
settings 標(biāo)簽中的屬性
屬性 | 說明 |
---|---|
cacheEnabled | 默認(rèn)值為 true ,全局開關(guān)所有映射器配置文件中已配置的任何緩存 |
lazyLoadingEnabled | 默認(rèn)值為 false ,延遲加載的全局開關(guān)。當(dāng)開啟時,所有關(guān)聯(lián)對象都會延遲加載。特定關(guān)聯(lián)關(guān)系中可通過設(shè)置 fetchType 屬性來覆蓋該項(xiàng)的開關(guān)狀態(tài) |
aggressiveLazyLoading | 默認(rèn)值為 false ,當(dāng)開啟時,任何方法的調(diào)用都會加載該對象的所有延遲加載屬性。反之,每個延遲加載屬性將會按需加載 |
multipleResultSetsEnabled | 默認(rèn)值為 true ,是否允許單個語句返回多結(jié)果集(需要數(shù)據(jù)庫驅(qū)動支持) |
useColumnLabel | 默認(rèn)值為 true ,使用列標(biāo)簽代替列名。實(shí)際表現(xiàn)依賴于數(shù)據(jù)庫驅(qū)動,具體可參考數(shù)據(jù)庫驅(qū)動的相關(guān)文檔 |
useGeneratedKeys | 默認(rèn)值為 false ,允許 JDBC 支持自動生成主鍵,需要數(shù)據(jù)庫驅(qū)動支持。如果設(shè)置為 true,將強(qiáng)制使用自動生成主鍵。盡管一些數(shù)據(jù)庫驅(qū)動不支持此特性,但仍可正常工作(如 Derby) |
autoMappingBehavior | 默認(rèn)值為 PARTIAL ,指定 MyBatis 應(yīng)如何自動映射列到字段或?qū)傩浴ONE 表示關(guān)閉自動映射;PARTIAL 表示只會自動映射沒有定義嵌套結(jié)果映射的字段;FULL 表示會自動映射任何復(fù)雜的結(jié)果集(無論是否嵌套) |
autoMappingUnknownColumnBehavior | 默認(rèn)值為 none(不處理),指定發(fā)現(xiàn)自動映射目標(biāo)未知列(或未知屬性類型)的行為 |
defaultExecutorType | 默認(rèn)值為 simple ,配置默認(rèn)的執(zhí)行器。SIMPLE 是普通執(zhí)行器;REUSE 執(zhí)行器會重用預(yù)處理語句(PreparedStatement); BATCH 執(zhí)行器不僅重用語句還會執(zhí)行批量更新 |
defaultStatementTimeout | 默認(rèn)值為 null ,設(shè)置超時時間,它決定數(shù)據(jù)庫驅(qū)動等待數(shù)據(jù)庫響應(yīng)的秒數(shù) |
defaultFetchSize | 默認(rèn)值為 null ,為驅(qū)動的結(jié)果集獲取數(shù)量(fetchSize)設(shè)置一個建議值。此參數(shù)只可以在查詢設(shè)置中被覆蓋 |
defaultResultSetType | 默認(rèn)值為 null ,指定語句默認(rèn)的滾動策略 |
safeRowBoundsEnabled | 默認(rèn)值為 false ,是否允許在嵌套語句中使用分頁(RowBounds)。如果允許使用設(shè)置為 false |
safeResultHandlerEnabled | 默認(rèn)值為 true ,是否允許在嵌套語句中使用結(jié)果處理器(ResultHandler)。如果允許使用設(shè)置為 false |
mapUnderscoreToCamelCase | 默認(rèn)值為 false ,是否開啟駝峰命名自動映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 映射到經(jīng)典 Java 屬性名 aColumn |
localCacheScope | 默認(rèn)值為 SESSION,會緩存一個會話中執(zhí)行的所有查詢。 若設(shè)置值為 STATEMENT ,本地緩存將僅用于執(zhí)行語句,對相同 SqlSession 的不同查詢將不會進(jìn)行緩存。MyBatis 利用本地緩存機(jī)制(Local Cache)防止循環(huán)引用和加速重復(fù)的嵌套查詢 |
jdbcTypeForNull | 當(dāng)沒有為參數(shù)指定特定的 JDBC 類型時,空值的默認(rèn) JDBC 類型。 某些數(shù)據(jù)庫驅(qū)動需要指定列的 JDBC 類型,多數(shù)情況直接用一般類型即可,如 NULL、VARCHAR 或 OTHER |
lazyLoadTriggerMethods | 指定對象的哪些方法觸發(fā)一次延遲加載 |
defaultScriptingLanguage | 指定動態(tài) SQL 生成使用的默認(rèn)腳本語言 |
defaultEnumTypeHandler | 指定 Enum 使用的默認(rèn) TypeHandler |
callSettersOnNulls | 默認(rèn)值為 false ,指定當(dāng)結(jié)果集中值為 null 時,是否調(diào)用映射對象的 setter(map 對象時為 put)方法,這依賴于 Map.keySet() 或 null 值進(jìn)行初始化時比較有用。注意基本類型(int、boolean 等)是不能設(shè)置成 null 的 |
returnInstanceForEmptyRow | 默認(rèn)值為 false ,當(dāng)返回行的所有列都是空時,MyBatis 默認(rèn)返回 null 。 當(dāng)開啟這個設(shè)置時,MyBatis會返回一個空實(shí)例。 注意:它也適用于嵌套的結(jié)果集(如集合或關(guān)聯(lián)) |
logPrefix | 指定 MyBatis 增加到日志名稱的前綴 |
logImpl | 指定 MyBatis 所用日志的具體實(shí)現(xiàn),未指定時將自動查找 |
proxyFactory | 指定 Mybatis 創(chuàng)建可延遲加載對象所用到的代理工具 |
vfsImpl | 指定 VFS 的實(shí)現(xiàn) |
useActualParamName | 默認(rèn)值為 true ,允許使用方法簽名中的名稱作為語句參數(shù)名稱。 為了使用該特性,項(xiàng)目中必須采用 Java 8 編譯并加上 -parameters 選項(xiàng) |
configurationFactory | 指定一個提供 Configuration 實(shí)例的類。 這個被返回的 Configuration 實(shí)例用來加載被反序列化對象的延遲加載屬性值。 這個類必須包含一個簽名為 static Configuration getConfiguration() 的方法 |
shrinkWhitespacesInSql | 默認(rèn)值為 false ,從 SQL 中刪除多余的空格字符。注意:這也會影響 SQL 中的文字字符串 |
defaultSqlProviderType | 指定一個擁有 provider 方法的 sql provider 類 。 這個類適用于指定 sql provider 注解上的 type(或 value) 屬性(當(dāng)這些屬性在注解中被忽略時),如 @SelectProvider |
nullableOnForEach | 默認(rèn)值為 false ,為 foreach 標(biāo)簽的 nullable 屬性指定默認(rèn)值 |
argNameBasedConstructorAutoMapping | 默認(rèn)值為 false ,當(dāng)應(yīng)用構(gòu)造器自動映射時,參數(shù)名稱被用來搜索要映射的列,而不再依賴列的順序 |
簡單示例:
在Java持久層框架:MyBatis介紹文章的案例基礎(chǔ)上
1.typeAliases 標(biāo)簽:設(shè)置別名的標(biāo)簽??梢院喕愋兔Q的書寫,如可以用一個別名代替一個類全名
首先,在 mybatis.xml 配置文件中配置以下內(nèi)容
<!-- typeAliases:設(shè)置別名,簡化類型名稱的書寫。用一個別名代替一個類全名 --> <typeAliases> <!-- 即 user 名稱可以替代 cn.edu.MyBatisDemo.model.User 類全名 --> <!-- 設(shè)置單個別名的方式 --> <!-- <typeAlias type="cn.edu.MyBatisDemo.model.User" alias="user" /> --> <!-- 設(shè)置多個別名的方式,別名默認(rèn)為類名(首字母為小寫) --> <!-- 可以使用 @Alias() 注解在實(shí)體類的上方設(shè)置自定義的別名 --> <package name="cn.edu.MyBatisDemo.model" /> </typeAliases>
接著,在其他配置文件(如 UserMapper.xml )中使用到 cn.edu.MyBatisDemo.model.User 的類全名都可以寫成 user 名稱
最后,測試結(jié)果
結(jié)果如圖:
2.mappers 標(biāo)簽:指定映射文件路徑的標(biāo)簽。MyBatis 會加載這些文件并將其應(yīng)用于相應(yīng)的數(shù)據(jù)庫操作
首先,在 mybatis.xml 配置文件中配置以下內(nèi)容
<!-- POJO對象與數(shù)據(jù)表的映射配置 --> <mappers> <!-- 1.類路徑 --> <!-- <mapper resource="cn/edu/MyBatisDemo/model/UserMapper.xml" /> --> <!-- 2.包全名(注:映射文件與接口必須在同一個包和相同的文件名)--> <package name="cn.edu.MyBatisDemo.mapper" /> </mappers>
接著,查看映射文件與接口是否在同一個包里和相同的文件名
最后,測試結(jié)果
結(jié)果如圖:
映射配置文件
映射配置文件(Mapping Configuration File),用于定義 SQL 語句和結(jié)果集的映射關(guān)系。每個映射配置文件都對應(yīng)于數(shù)據(jù)庫中的一個表或一個存儲過程。映射配置文件通常會以 .xml 格式保存,并且命名方式通常是 [實(shí)體名] Map.xml 或者 [表名] Map.xml 。
常見映射配置標(biāo)簽
標(biāo)簽 | 說明 |
---|---|
mapper | 映射文件的根元素,包含了其他的映射定義 |
cache | 開啟緩存以及配置屬性來定制緩存的行為 |
cache-ref | 引用另一個命名空間的緩存配置,允許在多個命名空間之間共享緩存配置 |
resultMap | 定義一個結(jié)果集的映射關(guān)系,用于將數(shù)據(jù)庫中的結(jié)果集轉(zhuǎn)換成 Java 對象 |
select | 定義一個 SQL 查詢語句,用于從數(shù)據(jù)庫中獲取數(shù)據(jù) |
insert | 定義一個 SQL 插入語句,用于向數(shù)據(jù)庫中插入數(shù)據(jù) |
update | 定義一個 SQL 更新語句,用于更新數(shù)據(jù)庫中的數(shù)據(jù) |
delete | 定義一個 SQL 刪除語句,用于從數(shù)據(jù)庫中刪除數(shù)據(jù) |
簡單示例:
在上面的案例基礎(chǔ)上,再實(shí)現(xiàn)用戶的增刪改功能
首先,在接口 UserMapper 上聲明增刪改的方法
public void insert(User user); // 新增用戶 public void update(User user); // 修改用戶信息 public void delete(int id); // 刪除指定用戶
接著,在 UserMapper.xml 映射文件中添加對應(yīng)的標(biāo)簽來實(shí)現(xiàn)
<!-- 通過 useGeneratedKeys 和 keyProperty 屬性獲取 MySQL 自增的主鍵 id 值 --> <!-- useGeneratedKeys:開啟添加記錄后返回其 id 值 --> <!-- keyProperty:設(shè)置返回的值放到對象指定的屬性值上 --> <insert id="insert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO `user` (`name`,`password`,`date`,`state`) VALUES (#{name},#{password},#{date},#{state}) </insert> <update id="update" > UPDATE `user` SET `name`=#{name},`password`=#{password},`date`=#{date},`state`=#{state} WHERE `id`=#{id} </update> <delete id="delete" > DELETE FROM `user` WHERE `id`=#{id} </delete>
最后,測試結(jié)果
package cn.edu.MyBatisDemo.test; import cn.edu.MyBatisDemo.mapper.UserMapper; import cn.edu.MyBatisDemo.model.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.Date; public class MyBatisTest { @Test public void test() throws IOException { //1.根據(jù)配置文件創(chuàng)建數(shù)據(jù)庫連接會話的工廠類 InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); //獲取工廠類 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2.通過工廠類獲取數(shù)據(jù)庫連接的會話 SqlSession sqlSession = sqlSessionFactory.openSession(); //3.通過 sqlSession 操作數(shù)據(jù)庫 try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //新增用戶信息 User insertUser = new User("諸葛亮","ccc",new Date(),1); // 在實(shí)體類中添加對應(yīng)的參數(shù)構(gòu)造方法 userMapper.insert(insertUser); //獲取新增用戶的 id 值 int id = insertUser.getId(); //查看指定用戶 User selectUser = userMapper.selectUserById(id); System.out.println(selectUser); /** * //修改指定用戶 * User updateUser = new User("曹操","ccc",new Date(),1); * updateUser.setId(20230815); * userMapper.update(updateUser); * * //刪除指定用戶 * userMapper.delete(20230815); */ sqlSession.commit(); } finally { sqlSession.close(); } } } 結(jié)
結(jié)果如圖:
注
參數(shù)數(shù)量
在案例的 selectUserById 方法中,只傳遞一個 id 值作為參數(shù)(單個參數(shù)),在 UserMapper.xml 映射文件中通過 #{id} 來接收。通常情況下,使用相同名字輸入在 #{} 內(nèi),也可以使用任意字符串輸入在 #{} 內(nèi)。
但是,在多個參數(shù)的情況下,MyBatis 會把參數(shù)封裝成 Map 對象,#{} 內(nèi)將從 Map 對象中獲取對應(yīng)值,其獲取方式分為三種:
書寫格式1:參數(shù)1—param1,參數(shù)2—param2 …
書寫格式2:參數(shù)1—arg0,參數(shù)2—arg1 …
書寫格式3:在接口方法的參數(shù)上使用 @Param() 注解指定名字
另外,也可以將多個參數(shù)封裝成 POJO 對象,通過 #{ POJO 對象屬性} 形式獲取傳遞的值
參數(shù)類型
當(dāng)接口方法上的參數(shù)類型為集合或數(shù)組時,同樣 MyBatis 也是將參數(shù)封裝成 Map 對象,然后分別通過 #{collection} 和 #{array} 方式獲取參數(shù)值。另外,List 集合可以通過 #{list} 方式獲取。
書寫格式1:參數(shù)1—#{collection[0]},參數(shù)2—#{collection[1]} …
書寫格式2:參數(shù)1—#{array[0]},參數(shù)2—#{array[1]} …
書寫格式3:參數(shù)1—#{list[0]},參數(shù)2—#{list[1]} …
參數(shù)符號
在映射文件中,獲取參數(shù)所使用的參數(shù)符號分為兩種:#{} 和 ${} 。
#{}:PreparedStatement 對象來執(zhí)行的 SQL 語句(預(yù)編譯,基本情況下使用該參數(shù)符號)
${}:Statement 對象來執(zhí)行的 SQL 語句 (拼接成 SQL 語句,存在注入攻擊風(fēng)險。一般用于傳入數(shù)據(jù)庫對象,如表名、order by 排序字段)
select 標(biāo)簽屬性
resultType 屬性
1.當(dāng)返回結(jié)果為 List 集合類型時,resultType 屬性值為類全名或設(shè)置的別名
2.當(dāng)返回結(jié)果為 Map 集合類型時,resultType 屬性值為已設(shè)定的別名 map
resultMap 屬性
1.自定義數(shù)據(jù)庫字段與對象屬性的對應(yīng)名字
2.實(shí)現(xiàn)關(guān)聯(lián)查詢
到此這篇關(guān)于MyBatis:配置文件的文章就介紹到這了,更多相關(guān)MyBatis配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java創(chuàng)建子類對象設(shè)置并調(diào)用父類的變量操作
這篇文章主要介紹了java創(chuàng)建子類對象設(shè)置并調(diào)用父類的變量操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01Springboot+MDC+traceId日志中打印唯一traceId
本文主要介紹了Springboot+MDC+traceId日志中打印唯一traceId,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10如何使用SpringBoot集成Kafka實(shí)現(xiàn)用戶數(shù)據(jù)變更后發(fā)送消息
Spring Boot集成Kafka實(shí)現(xiàn)用戶數(shù)據(jù)變更后,向其他廠商發(fā)送消息,我們需要考慮配置Kafka連接、創(chuàng)建Kafka Producer發(fā)送消息、監(jiān)聽用戶數(shù)據(jù)變更事件,并將事件轉(zhuǎn)發(fā)到Kafka,本文分步驟給大家講解使用SpringBoot集成Kafka實(shí)現(xiàn)用戶數(shù)據(jù)變更后發(fā)送消息,感興趣的朋友一起看看吧2024-07-07深入理解spring boot異步調(diào)用方式@Async
Spring為任務(wù)調(diào)度與異步方法執(zhí)行提供了注解支持。通過在方法上設(shè)置@Async注解,可使得方法被異步調(diào)用。下面這篇文章主要給大家介紹了關(guān)于spring boot異步調(diào)用方式@Async的相關(guān)資料,需要的朋友可以參考下。2017-07-07