前提
Mbatis的配置文件中的顺序如下:
MyBatis核心配置文件中的标签必须安装指定的顺序配置。
(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
不要问为什么必须这样排序,因为上这句话是再写配置文件的时候,故意写错顺序后IDE报错的信息。
当然其只是一个顺序而已,不是必须将上面的标签都写上,有些是可以不写的。
environment属性
environment属性在environments标签内,这样也意味着可以配置多个environment。一般的时候如下配置:
<!-- 配置数据库连接信息,-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/testmybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
配置多个环境
<!-- environments的 default属性配置的是默认 运行环境,其后面的值就是environment中的id -->
<environments default="development">
<environment id="development">
......
</environment>
<environment id="test">
.....
</environment>
</environments>
environments的 default属性配置的是默认 运行环境,其后面的值就是environment中的id
这就意味着在调用配置文件的时候,有一个方法是可以选择不同的id名字来选择不同的配置环境。
其实翻看文件当可以看出sqlSessionFactoryBuilder.build 方法有一个参数的,也有一个两个参数的。
// 返回SqlSessionFactory 因为是一个参数可以得到默认的配置环境
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);// 等同于build(inputStream,"development");
// 返回SqlSessionFactory 调用两个参数,可以把test的环境和development环境一样,然后修改密码是一个错误值 运行的话就会报错,可以看出其通过第二个参数来指定不同的运行环境
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream,"test");
这个其实了解即可,一般的时候不会设置两个环境变量,毕竟测试环境和开发环境一般都会一致,这样出现问题的话会更加容易知道。
transactionManager
这个标签其实是放在environment标签中的,
<environment id="development">
<transactionManager type="JDBC|MANAGED"/>
.......
</environment>
transactionManager这个标签是设置事务管理器,其属性名type。但是其有三个不同的属性值:
- JDBC: 使用JDBC中原生的事务管理。
- MANAGED: 被管理,比如和spring进行整合的时候,会选择这个属性值。
dataSource
这个标签也是放在environment标签中:
<environments default="development">
<environment id="development">
......
<dataSource type="POOLED | UNPOOLED | JNDI">
.......
</dataSource>
</environment>
</environments>
dataSource标签也有一个属性type,其也有三个值:
- POOLED: 使用数据库连接池
- UNPOOLED: 不适用数据库连接池
- JNDI : 使用上下文的数据库源,简单说就是myBatis 会从JNDI 服务上查找DataSource 实例,然后返回使用 。这种配置如何实现后面单独补上一篇,不然篇幅会很长。
当然在datasource中通过property标签进行配置数据库连接的驱动,url,用户密码名。
但是dataSource标准type=“JNDI” 这种使用上下文的数据库源,就需要简单的进行演示了。
引用资源配置文件
这个首先创建一个properties文件:jdbc.properties,其内容如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/testmybatis
jdbc.username=root
jdbc.password=root
其路径是
然后mybatis-config.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<!--配置文件中可以使用哪些标签,这个地方是配置这是一个mybatis文件,使用mybatis文件标签-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--开始配置信息-->
<configuration>
<!-- 导入配置文件 -->
<properties resource="jdbc.properties"></properties>
<!-- environments的 default属性配置的是默认 运行环境,其后面的值就是environment中的id -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- com.mysql.jdbc.Driver -->
<property name="driver" value="${jdbc.driver}"/>
<!-- jdbc:mysql:///demo?characterEncoding=utf-8 -->
<property name="url" value="${jdbc.url}"/>
<!-- root -->
<property name="username" value="${jdbc.username}"/>
<!-- root -->
<property name="password" value="${jdbc.password}"/>
<
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="映射文件这个地方配置sql语句,后面具体演示"></mapper>-->
<mapper resource="mappers/StudentMapper.xml"></mapper>
</mappers>
</configuration>
然后运行测试程序即可。
typeAliases 以及其子标签typeAlias
typeAlias标签这个其实效果有点像是sql语句中的as关键字,其作用是:设置类型的别名。
而typeAliases 就是包含所有typeAlias标签的根标签,所以不再多说什么。
这个又有三种不同的情况,有不同的效果。
首先这个是标签是写在核心配置文件的,其别名一般在映射文件中使用。
例子1: 为一个类指定一个别名
<!-- 创建一个类,其包+类名 com.xzd.domain.Student -->
<!-- 这个配置是写在mybatis-config.xml中的 -->
<configuration>
....
<typeAliases >
<typeAlias type="com.xzd.domain.Student" alias="testname">
</typeAliases>
....
</configuration>
<!-- 这个配置是写在studentMapper.xml中的 这个返回类型就可以使用自定义别名了 -->
<select id="getAllStudent" resultType="testname">
SELECT * FROM testmybatis.student
</select>
但是这样有一个问题,那就是每次为一个类写一个别名都需要写一条。
例子2: 为某个类来使用默认类名作为别名
<!-- 创建一个类,其包+类名 com.xzd.domain.Student -->
<!-- 这个配置是写在mybatis-config.xml中的 -->
<configuration>
....
<typeAliases >
<typeAlias type="com.xzd.domain.Student">
</typeAliases>
....
</configuration>
<!-- 这个配置是写在studentMapper.xml中的 这个返回类型就可以使用默认的类名作为别名了-->
<select id="getAllStudent" resultType="Student">
SELECT * FROM testmybatis.student
</select>
这个说白指定好类,然后不适用alias属性,默认会自动使用类名作为别名。但也有例子1中的弊端,需要对此写
补充 通过package指定包下所有类具有默认别名
<!-- 创建一个类,其包+类名 com.xzd.domain.Student -->
<!-- 这个配置是写在mybatis-config.xml中的 -->
<configuration>
....
<!-- 这样其包下的所有类,都会默认使用类名作为别名 -->
<typeAliases >
<!-- <typeAlias type="com.xzd.domain.Student"></typeAlias>-->
<package name="com.xzd.domain"></package>
</typeAliases>
....
</configuration>
<!-- 这个配置是写在studentMapper.xml中的 这个返回类型就可以使用默认的类名作为别名了-->
<select id="getAllStudent" resultType="Student">
SELECT * FROM testmybatis.student
</select>
**name=“com.xzd.domain” 这样直接写包,会默认其包下的类名即为别名,而且不区别大小写。 **
注意:
- 通过测试创建com.xzd.domain.test,这种方式可以让包名所在包之下的test包的类也可以启用默认别名,但是com.xzd.domain这个包下必须有类,也就是直接的在这个包下创建java类,不然会报错。
mappers以及其子标签mapper
这个可以导入映射配置文件,通过前面演示的例子可以看出其功能。不过有一个问题,那就是配置文件导入的一两个还好,如下:
<mappers>
<!-- <mapper resource="映射文件这个地方配置sql语句,后面具体演示"></mapper>-->
<mapper resource="mappers/StudentMapper.xml"></mapper>
</mappers>
但是如果是多个的话,那是需要输入很多行,所以其也支持包(应该说文件夹)导入,然后将其包下的配置文件,全部导入其中。
通过package包导入映射文件
而满足这种包导入需要,需要满足两个条件:
-
mapper接口和映射文件所在的包必须一致。
-
mapper接口和映射文件名字必须一致。
看图理解:
当然在创建配置文件的时候,没有package这个创建项目,需要通过创建directory,其中目录需要通过 **/**隔离:
如果中间使用 **. ** 或者 \ 的话,如果打开硬盘,就会发现其不是目录而是文件名。
然后配置文件如下:
....
<mappers>
<package name="com.xzd.mapper" ></package>
</mappers>
....
是否好奇为什么,其实如果看编程的话,似乎是分开,但是打开其,编译后输出如下:
就会发现其会自动归档在一个路径下。