mybatis-config.xml
是 MyBatis 的核心配置文件,用于配置整個 MyBatis 框架的全局行為,比如環境(數據源)、事務、類型別名、插件、Mapper 映射等。
示例:
<?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文件 --><properties resource="db.properties"/><!-- 開啟Mybatis對標準日志的視線 --><settings><setting name="logImpl" value="SLF4J"/></settings><environments default="development"><!-- 每一個environment對應一個SqlSessionFactory --><environment id="development"><!-- 事務管理器 --><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 執行XxxMapper.xml文件的路徑 --><!-- resource路徑自動會從根路徑下開始查找資源 --><mappers><mapper resource="CarMapper.xml"/></mappers>
</configuration>
一、xml配置文件的開頭:
1、任意的xml文件的首行,都是如下的配置:
<?xml version="1.0" encoding="UTF-8" ?>
?
2、xml文件中根標簽的名字
3、dtd是對xml文件的約束:能有什么標簽,標簽的順序,標簽的屬性,有哪些子標簽......
二、<environments>:環境標簽
可以配置多個環境,一個環境對應一個sqlsessionFactory對象。
在java中創建sqlSessionFactory的時候,可以指定環境的id,表明,用哪一個數據庫創建的sqlSessionFactory:
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();// 兩種方式創建sqlSessionFactory
// 1、沒有指明具體的environment中的id,則用默認的environment
SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));// 2、指明具體的environment中的id
SqlSessionFactory sqlSessionFactory2 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"),
三、Mybatis的事務管理器
<transactionManager>標簽:
1、作用:配置事務管理器。指定mybatis具體使用什么方式去管理事務。
2、type屬性有兩個值:
????????第一個:JDBC:使用原生的JDBC代碼來管理事務。?
????????第二個:MANAGED:mybatis不再負責事務的管理,將事務管理交給其它的JEE(JavaEE)容器來管理。例如:spring
3、大小寫無所謂。不區分大小寫。但是不能寫其他值。只能是二選一: jdbc、managed
4、在mybatis中提供了一個事務管理器接口:Transaction 該接口下有兩個實現類:
- JdbcTransaction
- ManagedTransaction
如果type="JDBC",那么底層會實例化JdbcTransaction對象。
如果type="MANAGED",那么底層會實例化ManagedTransaction。
四、dataSource配置
3-1、基本配置介紹
1、dataSource被稱為數據源。
2、dataSource作用是什么?
為程序提供Connection對象。
【注意】:
????????但凡是給程序提供Connection對象的,都叫做數據源。
3、數據源實際上是一套規范(接口)。
JDK中有這套規范:javax.sql.DataSource(這個數據源的規范,這套接口實際上是JDK規定的。)
4、我們自己也可以編寫數據源組件,只要實現javax.sql.DataSource接口就行了。實現接口當中所有的方法。這樣就有了自己的數據源。
比如你可以寫一個屬于自己的數據庫連接池(數據庫連接池是提供連接對象的,所以數據庫連接池就是一個數據源)。
5、常見的數據源組件有哪些呢【常見的數據庫連接池有哪些呢】?
阿里巴巴的德魯伊連接池:druid
c3p0
dbcp
....
6、type屬性用來指定數據源的類型,就是指定具體使用什么方式來獲取Connection對象:
type屬性有三個值:必須是三選一。
type="[UNPOOLED|POOLED|JNDI]"
- UNPOOLED:不使用數據庫連接池技術。每一次請求過來之后,都是創建新的Connection對象。
- POOLED:使用mybatis自己實現的數據庫連接池。
- JNDI:集成其它第三方的數據庫連接池。
3-2、JNDI
JNDI是一套規范,大部分web容器都實現了這個規范:例如Tomcat、Jetty、WebLogic、WebSphere。這些服務器(容器)都實現了JNDI規范。
所以,可以把對應的連接池,配置到服務器(容器)中,如:druid配置到Tomcat中,然后Tomcat會給druid提供一個上下文的名稱,將上下文的名稱配到對應的<datasource>位置即可。
使用
<dataSource type="JNDI">
就是告訴 MyBatis:別自己創建數據庫連接了,去應用服務器(Tomcat/GlassFish/WebLogic)拿現成的連接池資源。
?
3-3、type = "POOLED"和UNPOOLED對比
測試代碼:
@Testpublic void testType() throws Exception{SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));// SqlSessionFactory可以創建多個SqlSession!SqlSession sqlSession = sqlSessionFactory.openSession();Object selectById = sqlSession.selectOne("selectById", 12);System.out.println(selectById);sqlSession.commit();sqlSession.close();// 第二次創建SqlSession sqlSession2 = sqlSessionFactory.openSession();Object selectById2 = sqlSession2.selectOne("selectById", 12);System.out.println(selectById2);sqlSession2.commit();sqlSession2.close();}
情況一:type = "UNPOOLED"?
兩個connection對象不一樣!
情況二:type = "POOLED"?
?同一個connection對象!
五、property標簽
在 MyBatis 的 mybatis-config.xml
配置文件中,<properties>
標簽用于引入外部屬性文件或者在 XML 中內聯配置參數,這些參數可以被用于整個配置文件中的占位符(${}
)替換,例如數據庫連接、分頁插件參數等。
一句話理解:
<properties>
就是給 MyBatis 提供參數值的地方,支持從外部.properties
文件讀取,也可以直接在 XML 中寫死鍵值對,用于${xxx}
占位符替換。
4-1、用法示例 1:引入外部屬性文件
文件結構
src/
├── mybatis-config.xml
└── db.properties
db.properties 內容:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
jdbc.username=root
jdbc.password=123456
mybatis-config.xml 內容:
<configuration><!-- 映入外部的properties文件 --><properties resource="db.properties"/><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments></configuration>
resource 路徑是 classpath 相對路徑
示例:resource="db.properties"
表示類路徑下的db.properties
?
【備注】:
?
不建議!
4-2、用法示例 2:在 XML 中內聯寫屬性
<configuration><properties><property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver"/><property name="jdbc.url" value="jdbc:mysql://localhost:3306/mydb"/><property name="jdbc.username" value="root"/><property name="jdbc.password" value="123456"/></properties><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments></configuration>
4-3、屬性優先級(默認行為):
如果你同時指定了外部文件(resource
或 url
)和內聯屬性(<property>
子標簽),那么:
內聯屬性優先,會覆蓋外部文件中相同的屬性值。
4-4、常見屬性用途
位置 | 用途 |
---|---|
<dataSource> | 數據庫連接參數 |
插件(如分頁插件) | 配置插件行為 |
<settings> | 配置全局行為開關 |