- MyBatis核心配置文件包括属性:
- configuration
- environment
- transactionManager
- dataSource
- properties
- mapper
四、MyBatis核心配置文件详解
以下面的配置文件为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<configuration>
<environments default="mybatisDB">
<environment id="mybatisDB">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="poolMaximumActiveConnections" value="10"/>
<property name="poolTimeToWait" value="2000"/>
<property name="poolMaximumCheckoutTime" value="10000"/>
<property name="poolMaximumIdleConnections" value="5"/>
</dataSource>
</environment>
<environment id="javawebDB">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/javaweb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>
4.1 configuration
configuration
:根标签,表示配置信息。"http://mybatis.org/dtd/mybatis-3-config.dtd"
规定了配置文件中可以有哪些标签,标签的属性有哪些,标签的顺序是什么等等。1
2
3
4
5
6
7
<configuration>
......
</configuration>
4.2 ★environment
environment
对应数据库。environments
:环境(多个),以 “s” 结尾表示复数,也就是说mybatis-config.xml
的环境可以配置多个数据源。default
属性:表示默认使用的是哪个环境,default
后面填写的是 environment 的 id,default 的值只需要和 environment 的 id 值一致即可。
environment
:具体的环境配置(主要包括:事务管理器的配置 + 数据源的配置)id
:给当前环境一个唯一标识,在 java 程序中可以通过id
来选择要使用哪个环境。
1
2
3
4
5
6
7
8
9
10
11
12
13
14<!--default表示默认使用的环境。-->
<!--默认环境什么意思?当你使用mybatis创建SqlSessionFactory对象的时候,没有指定环境的话,就默认使用这个环境。-->
<environments default="mybatisDB">
<!--其中的一个环境。连接的数据库是mybatis-->
<!--一般一个数据库会对应一个SqlSessionFactory对象。-->
<!--一个环境environment会对应一个SqlSessionFactory对象-->
<environment id="mybatisDB">
...
</environment>
<!--这是mybatis的另一个环境,也就是连接的数据库是另一个数据库javaweb-->
<environment id="javawebDB">
...
</environment>
</environments>在 java 程序中创建
SqlSessionFactory
对象时,可以使用默认的环境,也可以使用指定的环境。1
2
3
4
5
6
7
8
public void testEnvironment() throws Exception {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 使用默认的环境,即对应mybatis数据库
SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 通过environment的id使用指定的环境,即对应javaweb数据库
SqlSessionFactory sqlSessionFactory2 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "javawebDB");
}
4.3 transactionManager
transactionManager
:配置事务管理器。type
属性:指定事务管理器具体使用什么方式,可选值包括两个:JDBC
和MANAGED
。
可见 2.2 小节。
1
2
3
4<environment id="mybatisDB">
<transactionManager type="JDBC"/>
...
</environment>
4.4 ★dataSource
dataSource
对应使用的数据库连接池技术。dataSource
被称为数据源。dataSource
作用是什么?为程序提供Connection
对象(但凡是给程序提供Connection
对象的,都叫做数据源)。
数据源实际上是一套规范,JDK 中有这套规范:
javax.sql.DataSource
(这个数据源的规范,这套接口实际上是 JDK 规定的)。我们自己也可以编写数据源组件,只要实现
javax.sql.DataSource
接口就行了。实现接口当中所有的方法。这样就有了自己的数据源。比如你可以写一个属于自己的数据库连接池(数据库连接池是提供连接对象的,所以数据库连接池就是一个数据源)。
常见的数据源组件有哪些呢【常见的数据库连接池有哪些呢】?
- 阿里巴巴的德鲁伊连接池:
druid
c3p0
- …
- 阿里巴巴的德鲁伊连接池:
dataSource
:指定数据源。type
属性:用来指定具体使用的数据库连接池的策略,就是指定具体使用什么方式来获取Connection
对象。可选值包括三个[UNPOOLED|POOLED|JNDI]
:UNPOOLED
:采用传统的获取连接的方式,不使用数据库连接池技术。每一次请求过来之后,都是创建新的Connection
对象,虽然也实现Javax.sql.DataSource
接口,但是并没有使用池的思想。当
type="UNPOOLED"
时,property
可以是:driver 这是 JDBC 驱动的 Java 类全限定名。
url 这是数据库的 JDBC URL 地址。
username 登录数据库的用户名。
password 登录数据库的密码。
……
1
2
3
4
5
6
7
8
9<environment id="mybatisDB">
<transactionManager type="JDBC"/>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>POOLED
:采用传统的javax.sql.DataSource
规范中的连接池,mybatis 中有针对规范的实现,即使用 mybatis 自己实现的数据库连接池。当
type="POOLED"
时,property
可以是(除了包含UNPOOLED
中之外):poolMaximumActiveConnections 在任意时间可存在的活动(正在使用)连接数量,默认值:10。
poolMaximumIdleConnections 任意时间可能存在的空闲连接数。
……
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<environment id="mybatisDB">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<!--提醒:正常使用连接池的话,池中有很多参数是需要设置的。设置好参数,可以让连接池发挥的更好。事半功倍的效果。-->
<!--具体连接池当中的参数如何配置呢?需要反复的根据当前业务情况进行测试。-->
<!--poolMaximumActiveConnections:连接池当中最多的正在使用的连接对象的数量上限。最多有多少个连接可以活动。默认值10-->
<property name="poolMaximumActiveConnections" value="10"/>
<!--每隔2秒打印日志,并且尝试获取连接对象-->
<property name="poolTimeToWait" value="2000"/>
<!--强行让某个连接空闲,超时时间的设置。这里设置为10s-->
<property name="poolMaximumCheckoutTime" value="10000"/>
<!--最多的空闲数量-->
<property name="poolMaximumIdleConnections" value="5"/>
</dataSource>
</environment>
JNDI
:集成其它第三方的数据库连接池,采用服务器提供的 JNDI 技术实现,来获取DataSource
对象,不同的服务器所能拿到DataSource
是不一样。如果不是 web 或者 maven 的 war 工程,JNDI 是不能使用的。JNDI 是一套规范,
Java Name and Directory Interface
,java 命名目录接口。谁实现了这套规范呢?大部分的 web 容器都实现了 JNDI 规范。例如:Tomcat、Jetty、WebLogic、WebSphere,这些服务器(容器)都实现了 JNDI 规范。- 当
type="JNDI"
时,property
可以是(最多只包含以下两个属性):- initial_context 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))这是个可选属性,如果忽略,那么将会直接从 InitialContext 中寻找 data_source 属性。
- data_source 这是引用数据源实例位置的上下文路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
关于 JNDI 的配置,等后面讲到在 Web 服务器中使用 mybatis 技术时会详细介绍。
- 当
4.5 properties
mybatis 提供了更加灵活的配置,连接数据库的信息可以单独写到一个属性资源文件中,假设在类的根路径下创建
jdbc.properties
文件,配置如下:1
2jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/powernode那么就可以在 mybatis 核心配置文件中引入并使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<configuration>
<!--java.util.Properties类。是一个Map集合,key和value都是String类型-->
<!--在properties标签中可以配置很多属性-->
<!--用resource="jdbc.properties"引入外部属性资源文件-->
<properties resource="jdbc.properties">
<!--这是其中的一个属性-->
<!--<property name="属性名" value="属性值"/>-->
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--使用${key}取值-->
<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>
<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>
</configuration>properties
两个属性:resource
:这个属性从类的根路径下开始加载【常用的】。url
:从指定的 url 加载,假设文件放在d:/jdbc.properties
,这个 url 可以写成:file:///d:/jdbc.properties
。注意是三个斜杠。- 类似于 2.1 节中注意细节的倒数第二条。
4.6 mapper
mapper
标签用来指定 SQL 映射文件的路径,包含多种指定方式,这里先主要看其中两种:第一种:
resource
,从类的根路径下开始加载【比 url 常用】:1
2
3<mappers>
<mapper resource="CarMapper.xml"/>
</mappers>如果是这样写的话,必须保证类的根下有
CarMapper.xml
文件。如果类的根路径下有一个包叫做
test
,CarMapper.xml
如果放在 test 包下的话,这个配置应该是这样写:1
2
3<mappers>
<mapper resource="test/CarMapper.xml"/>
</mappers>
第二种:
url
,从指定的 url 位置加载:假设
CarMapper.xml
文件放在 d 盘的根下,这个配置就需要这样写:1
2
3<mappers>
<mapper url="file:///d:/CarMapper.xml"/>
</mappers>
mapper 还有其他的指定方式,后面再看。