配置文件详解
核心配置文件
<?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"> <!--default 指定默认的数据库环境id-->
<!--数据库环境具体配置:事务管理器+数据源-->
<environment id="development">
<!--事务管理器-->
<transactionManager type="JDBC"/>
<!--数据源 实现 javax.-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/powernode"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"/>
...
</mappers>
</configuration>属性(properties)
<properties resource|url>
<property name value/>
</properties>- resource:引入外部的资源文件 .properties(从类的根路径下查找),并解析键值对。
设置好的属性可以在整个配置文件中用 ${name} 来替换需要动态配置的属性值。如:
<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>如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载(顺序越靠后,优先级越高):
读取在 properties 元素体内指定的属性。
根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
读取作为方法参数 props传递的属性,并覆盖之前读取过的同名属性。
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
- 优先级:props > .properties >
<property>
从 MyBatis 3.4.2 开始,可以为属性占位符指定一个默认值,如 ${username:ut_user},表示当没有解析到这个属性时,采用默认值 ut_user。这个特性默认关闭,需要手动配置开启:
<properties>
<!-- 启用默认值特性 -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value"
value="true"/>
</properties>数据库环境
<environments default>
<environment id>
<transactionManager type/>
<dataSource type>
<property name value/>
...
</dataSource>
</environment>
</environments><environment>:具体的数据库环境配置。主要包括:事务管理器、数据源的配置。
- id 属性:此环境的唯一标识。
事务管理器
<!--type属性值不区分大小写-->>
<transactionManager type="JDBC | MANAGED"/>没有事务:只要执⾏⼀条DML语句,则提交⼀次;不支持多条DML同时成功或失败。即底层自动提交。
JDBC:使⽤JDBC原⽣的事务管理机制。
默认关闭自动提交,需要手动提交(默认开启事务)。
底层创建的事务管理器对象:JdbcTransaction对象。
底层JDBC:
conn.setAutoCommit(false); // 开启事务(关闭自动提交)
conn.rollback(); // 回滚事务
conn.commit(); // 提交事务MANAGED:事务交由其他容器管理,如 web Logic、JBOSS、Spring等。
它几乎什么也没做,从不提交或回滚一个连接,如果没有管理事务的容器,则没有事务。默认情况下它会关闭连接,可以设置 closeConnection 属性为 false 来阻止默认的关闭行为。
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>数据源
<dataSource type="POOLED | POOLED | JNDI">
...
</dataSource>数据源:底层实现 Javax.sql.DataSource 接⼝,这是JDK自带的规范。使不使用连接池由具体的实现确定。
UNPOOLED:采⽤传统的获取连接的⽅式,虽然也实现Javax.sql.DataSource接⼝,但是并没有使用池的思想,每次都新建连接。
property可以是:
- driver:JDBC 驱动的 Java 类全限定名。
- url:数据库的 JDBC URL 地址。
- username:登录数据库的⽤户名。
- password:登录数据库的密码。
- defaultTransactionIsolationLevel:默认的连接事务隔离级别。
- defaultNetworkTimeout:等待数据库操作完成的默认⽹络超时时间(单位:毫秒)
POOLED:采⽤连接池获取连接,Mybatis 中由针对规范的实现。
除了包含UNPOOLED中之外,还支持的 property:
poolMaximumActiveConnections:在任意时间可存在的活动(正在使⽤)连接数量。默认值:10
最大使用中连接数:如果已触及这个上限,则新的连接请求会被搁置,直到有连接使用完毕。
poolMaximumIdleConnections:任意时间可能存在的空闲连接数。 默认值:5
最大空闲连接数:如果空闲的连接数量超过这个限制,则会关闭多余空闲的连接,以减小数据库的开销。
其它.... (参考手册)
默认配置如下:

JNDI:采⽤服务器提供的JNDI技术实现,来获取DataSource对象。
不同的服务器所能拿到 DataSource是不⼀样。
如果不是web或者maven的war⼯程,JNDI是不能使⽤的。
JNDI:java命名目录接口。是一套规范,大部分的web容器都实现了这个规范。
JNDI ⽅式给了我们可以使⽤第三⽅连接池的接⼝。如果想使⽤dbcp、c3p0、druid(德鲁伊)等,需要使⽤这种⽅式。
property 最多只包含以下两个属性:
- initial_context:这个属性⽤来在 InitialContext 中寻找上下⽂,即
initialContext.lookup(initial_context)。这是个可选属性,如果忽略,那么将会直接从 InitialContext 中寻找 data_source 属性。 - data_source:这是引⽤数据源实例位置的上下⽂路径。提供了 initial_context 配置时会在其返回的上下⽂中进⾏查找,没有提供时则直接在 InitialContext 中查找。
引入SQL映射文件
<mappers>
<mapper resource|url|class/>
<package name>
</mappers>SQL映射⽂件的配置⽅式包括四种:
resource:从类路径中加载
url:从指定的全限定资源路径中加。
绝对路径使用file协议。不建议,移植性差。
class:使⽤映射器接⼝的完全限定类名 。
- SQL映射⽂件和mapper接⼝放在同⼀个目录下。
- SQL映射⽂件的名字也必须和mapper接口名⼀致。
<mappers> <mapper class="com.powernode.mybatis.mapper.CarMapper"/> <!--resource="com/powernode/mybatis/mapper/CarMapper.xml"--> </mappers>包名 —— 目录
类名.class —— 文件名.xml
package:将包内的映射器接⼝实现全部注册为映射器。
<mappers> <package name="com.powernode.mybatis.mapper"/> <!--为包下的每个接口都引入对应的mapper.xml--> <!--<mapper class="..."/>--> </mappers>- 实际开发中使用的。
- 要求XML文件必须和 mapper 接口放在一起,并且名字一致(同class)。
包/目录 |---XxxMapper.class |---XxxMapper.xml
SQL映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace>
<insert id>
SQL
</insert>
<delete id>
SQL
</delete>
<select id resultType>
...
</select>
...
</mapper>sql语句可不以
;结尾sql允许使用
#{...} ${...}占位符供参数传递。见 07-MyBatis小技巧
文件名也不是固定的,一般命名为:XxxMapper.xml。
一张表对应一个 SQL 映射文件。
路径也不固定。(只要能找到就行,一般以类加载路径为根)
namespace:命名空间。对sql进行区分的次依据(主依据是 id)。
id:这条SQL语句在这个文件内的唯一标识。这个id就代表了这条SQL语句。
resultType:pojo全限定类名。根据查询结果集的字段名,在pojo中进行 setter方法的匹配,从而进行封装。
