MyBatis——XML配置解析
目錄
- 1. 環(huán)境配置(environments)
- 2. 屬性(properties)
- 3. 類(lèi)型別名(typeAliases)
- 方式一:通過(guò)typeAlias起別名
- 方式二:通過(guò)package起別名
- 建議
- 4. 設(shè)置(settings)
- 4.1、日志工廠
- 4.2、LOG4J
- 5. 映射器(mappers)
- 方式一:使用相對(duì)于類(lèi)路徑的資源引用注冊(cè)綁定(推薦)
- 方式二:使用映射器接口實(shí)現(xiàn)類(lèi)的完全限定類(lèi)名注冊(cè)綁定
- 方式三: 將包內(nèi)的映射器接口實(shí)現(xiàn)全部注冊(cè)為映射器
- 6. 其他配置
- MyBatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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>
注意:接下來(lái)所有的配置,都要按照上圖的順序進(jìn)行配置,否則會(huì)出錯(cuò)
1. 環(huán)境配置(environments)
MyBatis 可以配置成適應(yīng)多種環(huán)境,但每個(gè) SqlSessionFactory 實(shí)例只能選擇一種環(huán)境。
environments 元素定義了如何配置環(huán)境。
其中可以嵌套多個(gè)環(huán)境
<environments default="development"><!--環(huán)境1--><environment id="development"><!--事務(wù)管理器--><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é)點(diǎn):environment
- 環(huán)境 ID:每個(gè)環(huán)境都有對(duì)應(yīng)的一個(gè)環(huán)境ID
- 默認(rèn)環(huán)境ID(比如:default=“development”)
- 環(huán)境可以隨意命名,但務(wù)必保證默認(rèn)的環(huán)境 ID 要匹配其中一個(gè)環(huán)境 ID。
- 事務(wù)管理器(transactionManager)
- 在 MyBatis 中有兩種類(lèi)型的事務(wù)管理器:
JDBC/MANAGED - 默認(rèn)為
JDBC
- 在 MyBatis 中有兩種類(lèi)型的事務(wù)管理器:
- 數(shù)據(jù)源(dataSource)
- dataSource 元素使用標(biāo)準(zhǔn)的 JDBC 數(shù)據(jù)源接口來(lái)配置 JDBC 連接對(duì)象的資源。
- 數(shù)據(jù)源是必須配置的。
- 有三種內(nèi)建的數(shù)據(jù)源類(lèi)型
UNPOOLED/POOLED/JNDI- unpooled:這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)只是每次被請(qǐng)求時(shí)打開(kāi)和關(guān)閉連接。
- pooled(默認(rèn)):這種數(shù)據(jù)源的實(shí)現(xiàn)利用“池”的概念將 JDBC 連接對(duì)象組織起來(lái) , 這是一種使得并發(fā) Web 應(yīng)用快速響應(yīng)請(qǐng)求的流行處理方式。
- jndi:這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)是為了能在如 Spring 或應(yīng)用服務(wù)器這類(lèi)容器中使用,容器可以集中或在外部配置數(shù)據(jù)源,然后放置一個(gè) JNDI 上下文的
- 數(shù)據(jù)源也有很多第三方的實(shí)現(xiàn):
dbcp、c3p0、druid等等…
2. 屬性(properties)
我們利用Properties屬性來(lái)實(shí)現(xiàn)應(yīng)用配置文件
這些屬性可以在外部進(jìn)行配置,并可以進(jìn)行動(dòng)態(tài)替換。
-
方式一:直接在Mybatis核心配置文件中配置這些屬性(我們先前的方法)
- 方式二:在 properties 元素的子元素中設(shè)置
- 編寫(xiě) 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 configurationPUBLIC "-//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"><!--這里就不用配置屬性了,默認(rèn)即可--><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>
</configuration>
-
引入外部文件的同時(shí),也可以在其中增加一些屬性配置
-
優(yōu)先級(jí)問(wèn)題:首先讀取在 properties 元素體內(nèi)指定的屬性
<properties resource="config.properties"><property name="username" value="root"/><property name="password" value="200024"/> </properties>比如config.properties中的數(shù)據(jù)庫(kù)連接密碼正確,但是properties 元素體內(nèi)的密碼不正確,則會(huì)報(bào)錯(cuò),因?yàn)閮?yōu)先讀取properties 元素體內(nèi)指定的屬性
3. 類(lèi)型別名(typeAliases)
注意位置順序
方式一:通過(guò)typeAlias起別名
- 類(lèi)型別名可為 Java 類(lèi)型設(shè)置一個(gè)縮寫(xiě)名字。
- 它僅用于 XML 配置,意在降低冗余的全限定類(lèi)名書(shū)寫(xiě)
<typeAliases><typeAlias type="pojo.User" alias="User"/>
</typeAliases>
type的值為指定Java類(lèi)名,alias為新起的別名
方式二:通過(guò)package起別名
-
也可以指定一個(gè)包名,MyBatis 會(huì)在包名下面搜索對(duì)應(yīng)的實(shí)體類(lèi)
<typeAliases><package name="pojo"/>
</typeAliases>
每一個(gè)在包 pojo 中的 實(shí)體類(lèi),在沒(méi)有注解的情況下,會(huì)使用 實(shí)體類(lèi) 的首字母小寫(xiě)的非限定類(lèi)名來(lái)作為它的別名。 比如 pojo.User 的別名為 user;若有注解,則別名為其注解值。
@Alias("hello")
public class User {...
}
此時(shí),別名為hello
建議
- 在實(shí)體類(lèi)較少的時(shí)候,使用第一種方式
- 在實(shí)體類(lèi)較多的時(shí)候,使用第二種方式
下面是一些為常見(jiàn)的 Java 類(lèi)型內(nèi)建的類(lèi)型別名。它們都是不區(qū)分大小寫(xiě)的,注意,為了應(yīng)對(duì)原始類(lèi)型的命名重復(fù),采取了特殊的命名風(fēng)格。
| 別名 | 映射的類(lèi)型 |
|---|---|
| _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. 設(shè)置(settings)
這是 MyBatis 中極為重要的調(diào)整設(shè)置,它們會(huì)改變 MyBatis 的運(yùn)行時(shí)行為
-
設(shè)置(settings)查看幫助文檔https://mybatis.org/mybatis-3/zh/index.html
-
- 懶加載
- 日志實(shí)現(xiàn)
- 緩存開(kāi)啟關(guān)閉
最常用:日志
4.1、日志工廠
如果一個(gè)數(shù)據(jù)庫(kù)操作出現(xiàn)了異常,我們需要排錯(cuò),日志是最好的助手!
logImpl
- SLF4J
- LOG4J
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING
- NO_LOGGING
在MyBatis核心配置文件中配置我們的日志
- 注意大小寫(xiě)問(wèn)題!!!不要寫(xiě)錯(cuò)!!
- 注意位置順序問(wèn)題
<settings><!--標(biāo)準(zhǔn)日志工廠實(shí)現(xiàn)--><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
然后運(yùn)行我們的測(cè)試類(lèi),發(fā)現(xiàn)多了很多內(nèi)容,這就是我們的日志
4.2、LOG4J
什么是LOG4J?
- Log4j是Apache的一個(gè)開(kāi)源項(xiàng)目,通過(guò)使用Log4j,我們可以控制日志信息輸送的目的地是控制臺(tái)、文件、GUI組件,甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護(hù)進(jìn)程等
- 我們也可以控制每一條日志的輸出格式
- 通過(guò)定義每一條日志信息的級(jí)別,我們能夠更加細(xì)致地控制日志的生成過(guò)程
- 可以通過(guò)一個(gè)配置文件來(lái)靈活地進(jìn)行配置,而不需要修改應(yīng)用的代碼
使用步驟:
- 導(dǎo)包
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
- 配置log4j.properties
#將等級(jí)為DEBUG的日志信息輸出到console和file這兩個(gè)目的地,console和file的定義在下面的代碼
log4j.rootLogger=DEBUG,console,file#控制臺(tái)輸出的相關(guān)設(shè)置
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#文件輸出的相關(guān)設(shè)置
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#日志輸出級(jí)別
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>
- 測(cè)試
-
同時(shí)在當(dāng)前項(xiàng)目目錄下生成了zsr.log文件,這里面保存了我們的日志信息
這就是我們?cè)?strong>log4j.properties進(jìn)行的設(shè)置,我們同樣可以設(shè)置其他的內(nèi)容
IDEA可能出現(xiàn)打不開(kāi)的情況,我們將其換成.txt格式就可以打開(kāi)了
簡(jiǎn)要使用
-
要在使用LOG4J的類(lèi)中,導(dǎo)入包 org.apache.log4j.Logger
-
日志對(duì)象,參數(shù)為當(dāng)前類(lèi)的class
static Logger logger = Logger.getLogger(UserMapperTest.class); -
編寫(xiě)測(cè)試方法,三種常見(jiàn)日志級(jí)別
@Test public void testLog4j() {logger.info("info:進(jìn)入了testLog4j方法");logger.debug("debug:進(jìn)入了testLog4j方法");logger.error("error:進(jìn)入了testLog4j方法"); } -
運(yùn)行該方法
5. 映射器(mappers)
mappers
- 映射器 : 定義映射SQL語(yǔ)句文件
- 告訴 MyBatis 到哪里去找映射文件
- 使用相對(duì)于類(lèi)路徑的資源引用
- 使用完全限定資源定位符(包括
file:///的 URL) - 使用類(lèi)名和包名等。
方式一:使用相對(duì)于類(lèi)路徑的資源引用注冊(cè)綁定(推薦)
<mappers><mapper resource="mapper/UserMapping.xml"/>
</mappers>
方式二:使用映射器接口實(shí)現(xiàn)類(lèi)的完全限定類(lèi)名注冊(cè)綁定
<mappers><mapper class="mapper.UserMapper"/>
</mappers>
常見(jiàn)問(wèn)題:
注意點(diǎn):
- 接口和他的Mapper配置文件必須同名
- 接口和他的Mapper配置文件必須在同一個(gè)包下
我的問(wèn)題:Mapper接口和Mapper配置文件沒(méi)有同名!!
修改后:
方式三: 將包內(nèi)的映射器接口實(shí)現(xiàn)全部注冊(cè)為映射器
<mappers><package name="mapper"/>
</mappers>
注意點(diǎn)同方式二:
- 接口和他的Mapper配置文件必須同名
- 接口和他的Mapper配置文件必須在同一個(gè)包下
6. 其他配置
了解~
- typeHandlers(類(lèi)型處理器)
- 無(wú)論是 MyBatis 在預(yù)處理語(yǔ)句(PreparedStatement)中設(shè)置一個(gè)參數(shù)時(shí),還是從結(jié)果集中取出一個(gè)值時(shí), 都會(huì)用類(lèi)型處理器將獲取的值以合適的方式轉(zhuǎn)換成 Java 類(lèi)型。
- 你可以重寫(xiě)類(lèi)型處理器或創(chuàng)建你自己的類(lèi)型處理器來(lái)處理不支持的或非標(biāo)準(zhǔn)的類(lèi)型。【了解即可】
- objectFactory(對(duì)象工廠)
- MyBatis 每次創(chuàng)建結(jié)果對(duì)象的新實(shí)例時(shí),它都會(huì)使用一個(gè)對(duì)象工廠(ObjectFactory)實(shí)例來(lái)完成。
- 默認(rèn)的對(duì)象工廠需要做的僅僅是實(shí)例化目標(biāo)類(lèi),要么通過(guò)默認(rèn)構(gòu)造方法,要么在參數(shù)映射存在的時(shí)候通過(guò)有參構(gòu)造方法來(lái)實(shí)例化。
- 如果想覆蓋對(duì)象工廠的默認(rèn)行為,則可以通過(guò)創(chuàng)建自己的對(duì)象工廠來(lái)實(shí)現(xiàn)。【了解即可】
- plugins(插件)
- 三個(gè)常用插件:
- mybatis-generator-core
- mybatis-plus
- 通用mapper
- 三個(gè)常用插件:
總結(jié)
以上是生活随笔為你收集整理的MyBatis——XML配置解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MyBatis常规CURD详解及拓展~
- 下一篇: MyBatis 一对多、多对一的处理~