一、本课目标
- 掌握核心配置文件结构
二、核心配置文件
分析:
1、properties:描述一些外部的、可以替代的一些属性。比如说之前的测试中的读取数据库的database.properties文件。可以配置在java属性配置文件中。
2、settings:设置一些比较重要的配置项,比如说通过settings元素设置了mybatis的log实现为log4j。通过这种设置可以修改mybatis在运行时的一些行为方式,当然也还有很多其他方面的setting,后续会学习到。
3、typeAliases:为Java类型命名一个别名(简称)
4、typeHandlers、objectFactory、plugins这几个没用到,简单了解一下就可以了。
5、environments:这个是配置文件中很重要的一个,我们要配置我们的运行环境,之所以是复数形式,是因为运行环境可以有多套。
6、environment:运行环境;如果设置一套运行环境,需要设置事务管理器transactionManager和dataSource数据源。运行环境其实就是连接数据库的一些数据源啊、事务啊等等。
7、mappers:映射器;通过映射器才可以引入sqlMapper映射文件,之后再进行一些相应的sql操作。
注:
1、这个配置文件在书写的时候一定要注意元素的顺序。
三、标签分析
3.1、配置properties元素
配置properties元素有两种方式:
- 通过外部指定的方式(database.properties),实现动态配置
- 直接配置为xml,实现动态配置
第一种方式就是之前一直使用的方式。
第一种方式:通过外部指定的方式(database.properties),实现动态配置
可以通过properties标签的resource属性指定外部文件,然后在配置环境的时候去指定的外部文件中拿值。
第二种方式:直接配置为xml,实现动态配置
直接将值配置为xml,然后在dataSource中拿到上面配置的值。
此处发现一个bug,已经定位到,但是不知道怎么解决,特此记录:
使用第二种方式配置如下:
单元测试如下:
package cn.smbms.dao.user;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import cn.smbms.pojo.User;
import cn.smbms.utils.MyBatisUtil;
public class UserMapperTest {
private Logger logger = Logger.getLogger(UserMapperTest.class);
@Before
public void setUp() throws Exception {
}
@Test
public void test() {
int count = 0;
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtil.createSqlSession();
// 4、调用mapper文件来对数据进行操作,操作之前必须将mapper文件引入到mabatis-config.xml中
count = sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
logger.debug("UserMapperTest count ---->" + count);
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
}
@Test
public void testGetUserList() {
List userList = null;
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtil.createSqlSession();
// 4、调用mapper文件来对数据进行操作,操作之前必须将mapper文件引入到mabatis-config.xml中
// userList = sqlSession.selectList("cn.smbms.dao.user.UserMapper.getUserList");
userList = sqlSession.getMapper(UserMapper.class).getUserList();
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
for (User user:userList) {
logger.debug("testGetUserList userCode:" + user.getUserCode()
+ "and userName" + user.getUserName() + user.getModifyDate());
}
}
}
在以上mybatis-config.xml配置下,测试test,此时测试正常。但是测试testGetUserList会出异常:
这个异常的解决方法是:将url改变为:
String url = "jdbc:mysql://localhost:3306/test?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull";
但是如果在property标签中将值改变为:
则测试test或者testGetUserList的时候根本没有结果。
第三、如果两种方式都采用了,那么哪种方式会优先呢?
如果两种方式同时都用了,那么哪种方式优先?
- 配置properties的resource指定
- 配置property的name和value
示例如下:
database.properties中的数据如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username=root
password=41312019
注:在xml配置中的密码是错的,是为了判断到底哪个配置起作用了。
在以上情况下,对test进行测试,单元测试代码如下:
@Test
public void test() {
int count = 0;
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtil.createSqlSession();
// 4、调用mapper文件来对数据进行操作,操作之前必须将mapper文件引入到mabatis-config.xml中
count = sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
logger.debug("UserMapperTest count ---->" + count);
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
}
运行结果:
是可以正常运行的,但是如果把database.properties中的密码写错,而把xml文件中的密码写正确的话,则会报数据库连接异常。
分析:在xml文件和外部文件中同时设置了属性的话,则xml文件中的设置是会被先读取的;读取了之后,由于又通过resource进行了外部指定,外部指定文件中也设置了这些个属性,那么resource指定文件中的同名属性则会覆盖xml文件中指定的值。即resource属性值的优先级高于property子节点配置的值
3.2settings元素
- 用来修改MyBatis运行是的行为方式
- 主要是MyBatis的一些全局配置属性的设置
如下代码:
3.3typeAliases元素
- 类型别名
-
仅仅只关联XML配置,简写冗长的Java类名
image.png
应用示例:
比如之前的UserMapper.xml映射文件中,查询用户列表的时候,返回结果类型设置的是cn.smbms.pojo.User
,这样写太长了,可以这么操作:
在配置文件中增加typeAliases标签(如果不知道该标签所在的顺序位置,可以在design里面右键点击configuration,选择add child)给cn.smbms.pojo.User
起一个别名,这样做会简化写法。具体如下:
配置文件为:
映射文件为:
此时进行单元测试也没有任何问题。
如果pojo有多个,则就需要加多个:
同时还有一种更简化的写法:
这种写法相当于把pojo包中的所有实体类都直接起了一个别名,这个默认的别名就是实体类的名字,不区分大小写。
3.4environments元素
- 表示配置Mybatis的多套运行环境,将SQL映射到多个不同的数据库上
- 子元素节点:environment,但是必须指定其中一个默认运行环境(通过default属性指定)
注:每个SqlSessionFactory实例只能选择一个运行环境
具体配置如下:
分析:
1、在environments表中的default属性中指定默认的运行环境id,这个运行环境id是下面的environment标签中的某一个id。
2、运行环境id要确保唯一。
3、transactionManager标签设置事务管理器类型,MyBatis一共有两种事务管理器类型:JDBC和Managed。这里主要是使用JDBC的提交和回滚的功能,从数据源获取连接来管理事务的生命周期。
4、dataSource是数据源,数据源的类型有三种,这里使用的是POOLED。
transactionManager事务管理器
dataSource
- dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源
-
有三种内建的数据源类型
image.png
3.5Mapper元素
- 映射器,定义SQL映射语句
-
须在配置中引用mapper映射文件
image.png