mybatis中xml文件结构
MyBatis 的 XML 配置文件包含了影响 MyBatis 行为甚深的设置和属性信息。 XML 文档的高层级结构如下:
- configuration 配置
- properties 属性
- settings 设置
- typeAliases 类型命名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- environment 环境变量
- 映射器
下面是一个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">
<!-- mybatis的基本配置文件:主要配置基本的上下文参数和运行环境 -->
<configuration>
<!--配置-->
<properties></properties>
<!--设置 -->
<settings></settings>
<!--类型命名 -->
<!--别名:pojo对象的别名 -->
<typeAliases>
<typeAlias alias="user" type="com.pojo.User"></typeAlias>
<typeAlias alias="enterprice" type="com.pojo.enterprice"></typeAlias>
</typeAliases>
<!--类型处理器 -->
<typeHandlers></typeHandlers>
<!--对象工厂 -->
<objectFactory></objectFactory>
<!--插件 -->
<plugins></plugins>
<!-- 环境模式:development开发模式 work工作模式 -->
<environments default="development">
<!--环境变量 -->
<environment id="development">
<!--事务管理器 -->
<transactionManager type="JDBC" />
<!--数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.pwd}" />
</dataSource>
</environment>
</environments>
<!--数据库厂商标示 -->
<databaseIdProvider></databaseIdProvider>
<!-- 映射器 -->
<mappers>
<mapper resource="com/mapper/UserMapper.xml" />
<mapper resource="com/mapper/EnterpricetMapper.xml" />
</mappers>
</configuration>
值得注意的是配置顺序是不可颠倒的,一旦发生了颠倒,在mybaties启动时就会发生异常,导致程序无法运行。
首先我们这里介绍properties配置,properties配置有三种方式:
- property子元素:也就是在properties中增加子属性property,设置name、value键值对;
- properties文件:抽象子属性抽象成一个 .properties 文件,后通过resource属性引入即可;
- 程序代码方式传参:一般不推荐使用,若有加密信息,才会使用;
一、property子元素
<properties>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maxActive" value="100"/>
<property name="maxIdle" value="20"/>
<property name="minIdle" value="0"/>
<property name="maxWait" value="500"/>
<property name="defaultAutoCommit" value="true"/>
<property name="minEvictableIdleTimeMillis" value="60000"/>
<property name="removeAbandoned" value="false"/>
<property name="removeAbandonedTimeout" value="60"/>
</properties>
一旦配置项过多,配置文件就会很大,为解决这个缺点,一般都会将配置参数写到配置文件中,进行调用。
二、properties文件
提取peoperty属性到db.properties文件:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
maxActive=100
maxIdle=20
minldle=0
maxWait=500
defaultAutoCommit=ture
minEvictableIdleTimeMillis=60000
removeAbandoned=false
removeAbandonedTimeout=60
然后将其引入mybatis配置文件
<properties resource="db.properties" />
这样就把db.properties中所有配置都加在到了MyBatis中,如果配置文件中的值需要进行加密,就只能通过程序代码传递了。
三、程序代码方式传参
这种方式一般只针对需要加密的配置参数就行处理,一般与方式二配合使用,以数据库的用户名和密码为例:
public static SqlSessionFactory getSqlSessionFactoryByXml() {
synchronized (Lock) {
if (null != sqlSessionFactory) {
return sqlSessionFactory;
}
String resource = "mybatis-config.xml";
InputStream inputStream;
InputStream is = null;
try {
// 加载数据库配置文件
is = Resources.getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(is);
// 获取加密信息
String userName = properties.getProperty("username");
String pwd = properties.getProperty("password");
// 解密用户名和密码,并重置属性
properties.setProperty("username", CyperTool.decodeByBase64(userName));
properties.setProperty("pwd", CyperTool.decodeByBase64(pwd));
// 读取mybatis配置文件
inputStream = Resources.getResourceAsStream(resource);
// 通过SqlSessionFactoryBuilder类的builder方法进行构建,并使用程序传递的方式覆盖原有属性
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return sqlSessionFactory;
}
}
以上就是properties属性的所有内容,推荐使用第二种方式。
另外,如果使用了多种方式加载属性的话,MyBatis将按照如下的顺序加载:
- 在properties 元素体内的属性首先被读取。
- 从类路径下资源或properties 元素的 url 属性中加载的属性第二被读取,并且将覆盖已经存在的完全一样的属性。
- 作为方法参数传递的属性最后被读取,一样也会覆盖已经存在的完全一样的属性,这些属性可能是从 properties 元素体内和资源 /url 属性中加载的。
因此,优先级最高的属性是作为方法参数的属性,然后是资源 / url 属性,最后才是 properties 元素中指定的参数。