詳解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>
注意
:接下來(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
數(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 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"> <!--這里就不用配置屬性了,默認(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)型?!玖私饧纯伞?/li>
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
到此這篇關(guān)于詳解MyBatis XML配置解析的文章就介紹到這了,更多相關(guān)MyBatis XML配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入理解Java設(shè)計(jì)模式之訪問(wèn)者模式
這篇文章主要介紹了JAVA設(shè)計(jì)模式之訪問(wèn)者模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解2021-11-11Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與OJ題
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與OJ題,本文章先是對(duì)隊(duì)列進(jìn)行介紹,后又介紹了四道OJ相關(guān)的題目,來(lái)使其深入理解,需要的朋友可以參考下2023-01-01聊聊DecimalFormat的用法及各符號(hào)的意義
這篇文章主要介紹了DecimalFormat的用法及各符號(hào)的意義,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10MyBatis實(shí)現(xiàn)插入大量數(shù)據(jù)方法詳解
最近在公司項(xiàng)目開(kāi)發(fā)中遇到批量數(shù)據(jù)插入或者更新,下面這篇文章主要給大家介紹了關(guān)于MyBatis實(shí)現(xiàn)批量插入的相關(guān)資料,需要的朋友可以參考下2022-11-11Java中統(tǒng)計(jì)字符個(gè)數(shù)以及反序非相同字符的方法詳解
本篇文章是對(duì)Java中統(tǒng)計(jì)字符個(gè)數(shù)以及反序非相同字符的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Java使用easypoi快速導(dǎo)入導(dǎo)出的實(shí)現(xiàn)
這篇文章主要介紹了實(shí)現(xiàn)Java使用easypoi快速導(dǎo)入導(dǎo)出的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03淺談Spring框架中@Autowired和@Resource的區(qū)別
最近review別人代碼的時(shí)候,看到了一些@Autowired不一樣的用法,覺(jué)得有些意思,下面這篇文章主要給大家介紹了關(guān)于Spring框架中@Autowired和@Resource區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-10-10