添加dtd约束
-
通过Mybatis的jar包中org\apache\ibatis\builder\xml 目录下可以发现两个dtd文件
- mybatis-3-config.dtd
- mybatis-3-mapper.dtd
-
在IDEA中编写mybatis的全局配置文件时可以通过以下的方式配置全局文件的dtd约束
-
复制红色框中的URI路径
- 打开IDEA的[file]—>[settings]—>[schemas and DTDS]
- 选择右侧的"+"号
- uri就是全局配置文件中的路径
- file为本地的dtd所在位置
- 配置好之后,在全局配置文件中编写标签时会有提示信息
引入外部配置文件
- 示例:定义datasource.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatisdb
jdbc.user=root
jdbc.password=mysqladmin
- 修改全局配置文件
<!--配置外部资源文件路径
resource表示类路径下
usl表示磁盘或者外部资源文件
使用${key} 的形式读取资源文件的内容
-->
<properties resource="properties/datasource.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>
运行时行为设置
- 示例:设置启用驼峰命名
- 配置全局配置文件,<settings>标签的位置必须在<environments>标签之上
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
类别名
- 用typeAliases 起的类别名默认为类名第一个字母小写,例如"Employee"类,那么默认为"employee"
- 示例:通过全局配置文件定义类别名
<!--
为java程序类取别名
为单个java类取别名,使用\<typeAlias\> 标签指定
如果要为一个包下所有的类取别名,则可以使用\<package\> 标签指定
默认的别名为 类的第一个字母小写
-->
<typeAliases>
<typeAlias type="mao.shu.mybatis.entity.Employee" alias="employee"/>
<package name="mao.shu.mybatis.entity"/>
</typeAliases>
- 示例:通过@Alias注解的方式设置类别名
@Alias("employee")
public class Employee {
...
}
类型处理器
plugins插件简介
environments(配置环境)
- 每个<enviroment>标签代表一个环境设置,每个环境设置中必须要有
-
<transactionManager>标签:事务管理器,取值共有两种:JDBC|MANAGED
- JDBC:使用JDBC原生的事务设置,使用得到的Connection链接控制提交或回滚
- MANAGER:由容器来控制事务(例如web容器)
-
<dataSource>标签:数据库连接,控制数据库的链接,不同的环境可以连接不同的数据库
- <dataSource>标签的type有四种取值:
- UNPOOLED:不使用数据库连接池,每次操作都创建一个新的数据库连接对象
- POOLED:使用数据库连接池概念
- JNDI – 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
- <dataSource>标签的type有四种取值:
- 示例:配置环境
<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>
<!--定义测试时的环境设置-->
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="UNPOOLED">
<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>
- 虽然能够配置多个环境,但是只有一个SqlSessionFactory实例,在获取SqlSessionFactory的时候,可以通过以下的方法,获取指定环境的SqlSessionFactory
- 其中environment参数为配置的<environment>环境的id值
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
多数据库配置databaseIdProvider
- 示例:配置多个数据库
- 在环建设之中,配置两个数据库链接
- mysql
- Oracle
<environments default="test">
<!--定义开发时的环境配置
链接mysql数据库
-->
<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>
<!--定义测试时的环境设置
链接Oracle数据库
-->
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="UNPOOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:mldn "/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
- 为两个数据库标识符取别名
<databaseIdProvider type="DB_VENDOR">
<property name="MySql" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
- 编写sql映射文件
- 为同一个查询方法定义两条查询语句
<!-- 链接mysql时使用的查询语句-->
<select id="getEmp" resultType="mao.shu.mybatis.entity.Employee" databaseId="mysql">
select id, ename, age, job
from employee
where id = #{id}
</select>
<!-- 连接oracle时查询的语句-->
<select id="getEmp" resultType="mao.shu.mybatis.entity.Employee" databaseId="oracle">
select EMPNO id, ENAME, JOB
from EMP
where EMPNO = #{id}
</select>
- 测试:
@Test
public void testInterface(){
EmployeeMapper employeeMapper = this.session.getMapper(EmployeeMapper.class);
Employee employee = employeeMapper.getEmp(7369);
System.out.println(employee);
}
- 链接Oracle时
链接MySQL时
mappers映射器
- 示例:使用接口名称注册
- 使用"class"属性注解接口,但是要保证对应的sql映射文件必须与接口在同一个路径下
<mappers>
<!--单个注册-->
<mapper class="mao.shu.mybatis.dao.EmployeeMapper"/>
</mappers>
- 示例:使用@Select 注解的方式注册
- 定义一个新的接口
- 接口的方法上使用@Select注解修饰,将查询的sql语句,写在@Select注解中
public interface EmployeeAnnotation {
@Select(" select id, ename, age, job from employee where id = #{id}")
public Employee getEmp(Integer id);
}
- 在全局配置文件中注册这个接口,
- 此时不需要在写sql映射文件了
<!--注册带有@Select注解的接口-->
<mapper class="mao.shu.mybatis.dao.EmployeeAnnotation"/>
- 示例:进行批量注册
- name属性填写的是类路径下的包名称,此时这个包下的所有带有注解的接口都会被自动注册,但是如果是使用sql配置文件的接口,需要将配置文件和接口放在同一个路径下才能够生效
<!--注册sql-->
<mappers>
<!--进行批量注册-->
<package name="mao.shu.mybatis.dao"/>
</mappers>
小结
- MyBatis的全局配置文件中的标签位置是有顺序安排的,可以不明确写出来,但是不能够更换前后关系
- properties
- settings
- typeAliases
- typeHandlers
- objectFactory
- objectWrapperFactory
- reflectorFactory
- plugins
- environments
- databaseIdProvider
- mappers