詳解MyBatis XML配置解析
MyBatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>

注意:接下來所有的配置,都要按照上圖的順序進行配置,否則會出錯
1. 環(huán)境配置(environments)
MyBatis 可以配置成適應多種環(huán)境,但每個 SqlSessionFactory 實例只能選擇一種環(huán)境。
environments 元素定義了如何配置環(huán)境。
其中可以嵌套多個環(huán)境
<environments default="development">
<!--環(huán)境1-->
<environment id="development">
<!--事務管理器-->
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<!--數(shù)據(jù)源-->
<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>
<!--環(huán)境2-->
<environment>
...
</environment>
<!--環(huán)境3-->
<environment>
...
</environment>
</environments>
子元素節(jié)點:environment
環(huán)境 ID:每個環(huán)境都有對應的一個環(huán)境ID
- 默認環(huán)境ID(比如:default=“development”)
- 環(huán)境可以隨意命名,但務必保證默認的環(huán)境 ID 要匹配其中一個環(huán)境 ID。
事務管理器(transactionManager)
- 在 MyBatis 中有兩種類型的事務管理器:JDBC/MANAGED
- 默認為 JDBC
數(shù)據(jù)源(dataSource)
- dataSource 元素使用標準的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對象的資源。
- 數(shù)據(jù)源是必須配置的。
- 有三種內(nèi)建的數(shù)據(jù)源類型 UNPOOLED/POOLED/JNDI
- unpooled:這個數(shù)據(jù)源的實現(xiàn)只是每次被請求時打開和關閉連接。
- pooled(默認):這種數(shù)據(jù)源的實現(xiàn)利用“池”的概念將 JDBC 連接對象組織起來 , 這是一種使得并發(fā) Web 應用快速響應請求的流行處理方式。
- jndi:這個數(shù)據(jù)源的實現(xiàn)是為了能在如 Spring 或應用服務器這類容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個 JNDI 上下文的
數(shù)據(jù)源也有很多第三方的實現(xiàn):dbcp、c3p0、druid等等…
2. 屬性(properties)
我們利用Properties屬性來實現(xiàn)應用配置文件
這些屬性可以在外部進行配置,并可以進行動態(tài)替換。
方式一:直接在Mybatis核心配置文件中配置這些屬性(我們先前的方法)

方式二:在 properties 元素的子元素中設置
編寫 config.properties
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSH=true&useUnicode=true&characterEncoding=UTF-8 username=root password=200024
在核心配置文件中引入
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--外部引入配置文件-->
<properties resource="config.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
</configuration>
引入外部文件的同時,也可以在其中增加一些屬性配置
優(yōu)先級問題:首先讀取在 properties 元素體內(nèi)指定的屬性
<properties resource="config.properties"> <property name="username" value="root"/> <property name="password" value="200024"/> </properties>
比如config.properties中的數(shù)據(jù)庫連接密碼正確,但是properties 元素體內(nèi)的密碼不正確,則會報錯,因為優(yōu)先讀取properties 元素體內(nèi)指定的屬性
3. 類型別名(typeAliases)
注意位置順序

方式一:通過typeAlias起別名
- 類型別名可為 Java 類型設置一個縮寫名字。
- 它僅用于 XML 配置,意在降低冗余的全限定類名書寫
<typeAliases> <typeAlias type="pojo.User" alias="User"/> </typeAliases>
type的值為指定Java類名,alias為新起的別名
方式二:通過package起別名
也可以指定一個包名,MyBatis 會在包名下面搜索對應的實體類

<typeAliases> <package name="pojo"/> </typeAliases>
每一個在包 pojo 中的 實體類,在沒有注解的情況下,會使用 實體類 的首字母小寫的非限定類名來作為它的別名。 比如 pojo.User 的別名為 user;若有注解,則別名為其注解值。
@Alias("hello")
public class User {
...
}
此時,別名為hello
建議
- 在實體類較少的時候,使用第一種方式
- 在實體類較多的時候,使用第二種方式
下面是一些為常見的 Java 類型內(nèi)建的類型別名。它們都是不區(qū)分大小寫的,注意,為了應對原始類型的命名重復,采取了特殊的命名風格。
| 別名 | 映射的類型 |
|---|---|
| _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 |
4. 設置(settings)
這是 MyBatis 中極為重要的調(diào)整設置,它們會改變 MyBatis 的運行時行為
設置(settings)查看幫助文檔https://mybatis.org/mybatis-3/zh/index.html
- 懶加載
- 日志實現(xiàn)
- 緩存開啟關閉
最常用:日志
4.1、日志工廠
如果一個數(shù)據(jù)庫操作出現(xiàn)了異常,我們需要排錯,日志是最好的助手!

logImpl
- SLF4J
- LOG4J
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING
- NO_LOGGING
在MyBatis核心配置文件中配置我們的日志
注意大小寫問題!??!不要寫錯??!
注意位置順序問題
<settings> <!--標準日志工廠實現(xiàn)--> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
然后運行我們的測試類,發(fā)現(xiàn)多了很多內(nèi)容,這就是我們的日志

4.2、LOG4J
什么是LOG4J?
Log4j是Apache的一個開源項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件,甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等我們也可以控制每一條日志的輸出格式通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼
使用步驟:
導包
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
配置log4j.properties
#將等級為DEBUG的日志信息輸出到console和file這兩個目的地,console和file的定義在下面的代碼
log4j.rootLogger=DEBUG,console,file
#控制臺輸出的相關設置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件輸出的相關設置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/zsr.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志輸出級別
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
在MyBatis核心配置文件中配置我們LOG4J
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
測試

同時在當前項目目錄下生成了zsr.log文件,這里面保存了我們的日志信息
這就是我們在log4j.properties進行的設置,我們同樣可以設置其他的內(nèi)容

IDEA可能出現(xiàn)打不開的情況,我們將其換成.txt格式就可以打開了


簡要使用
要在使用LOG4J的類中,導入包 org.apache.log4j.Logger
日志對象,參數(shù)為當前類的class
static Logger logger = Logger.getLogger(UserMapperTest.class);

編寫測試方法,三種常見日志級別
@Test
public void testLog4j() {
logger.info("info:進入了testLog4j方法");
logger.debug("debug:進入了testLog4j方法");
logger.error("error:進入了testLog4j方法");
}
運行該方法

5. 映射器(mappers)
mappers
映射器 : 定義映射SQL語句文件
告訴 MyBatis 到哪里去找映射文件
- 使用相對于類路徑的資源引用
- 使用完全限定資源定位符(包括
file:///的 URL) - 使用類名和包名等。
方式一:使用相對于類路徑的資源引用注冊綁定(推薦)
<mappers> <mapper resource="mapper/UserMapping.xml"/> </mappers>
方式二:使用映射器接口實現(xiàn)類的完全限定類名注冊綁定
<mappers> <mapper class="mapper.UserMapper"/> </mappers>
常見問題:

注意點:
- 接口和他的Mapper配置文件必須同名
- 接口和他的Mapper配置文件必須在同一個包下
我的問題:Mapper接口和Mapper配置文件沒有同名??!

修改后:
方式三: 將包內(nèi)的映射器接口實現(xiàn)全部注冊為映射器
<mappers> <package name="mapper"/> </mappers>
注意點同方式二:
- 接口和他的Mapper配置文件必須同名
- 接口和他的Mapper配置文件必須在同一個包下
6. 其他配置
了解~
typeHandlers(類型處理器)
- 無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數(shù)時,還是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型。
- 你可以重寫類型處理器或創(chuàng)建你自己的類型處理器來處理不支持的或非標準的類型?!玖私饧纯伞?/li>
objectFactory(對象工廠)
- MyBatis 每次創(chuàng)建結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成。
- 默認的對象工廠需要做的僅僅是實例化目標類,要么通過默認構造方法,要么在參數(shù)映射存在的時候通過有參構造方法來實例化。
- 如果想覆蓋對象工廠的默認行為,則可以通過創(chuàng)建自己的對象工廠來實現(xiàn)?!玖私饧纯伞?/li>
plugins(插件)
三個常用插件:
- mybatis-generator-core
- mybatis-plus
- 通用mapper
到此這篇關于詳解MyBatis XML配置解析的文章就介紹到這了,更多相關MyBatis XML配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java?Kryo,Protostuff,Hessian序列化方式對比
這篇文章主要介紹了Java?Kryo,Protostuff,Hessian序列化方式對比,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07
關于使用Mybatisplus自帶的selectById和insert方法時的一些問題
這篇文章主要介紹了關于使用Mybatisplus自帶的selectById和insert方法時的一些問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
Spring Data JPA使用Sort進行排序(Using Sort)
本篇文章主要介紹了Spring Data JPA使用Sort進行排序(Using Sort),具有一定的參考價值,有興趣的可以了解一下2017-07-07

