(一)Mybatis全局配置文件简介
通常在项目中只配置一个Mybatis全局配置文件,并且编写后不会轻易改写。Mybatis全局配置文件通常用来配置数据库连接和加载Mapper.xml资源文件。
参考:Mybatis官方文档
(二)Mybatis全局配置文件主要元素
如图所示
项目结构
1. <properties>元素
<properties> 是一个配置属性的元素,通常用来配置数据库连接的属性。
(一)在项目的src目录下创建db.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
(二)在mybatis-config.xml使用 <properties> 配置db.properties文件
<properties resource="db.properties"/>
(三)mybatis-config.xml的内容
<?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>
<!--加载db.properties文件-->
<properties resource="db.properties"/>
<!--1.配置环境 ,默认的环境id为mysql -->
<environments default="mysql">
<!--1.2.配置id为mysql的数据库环境 -->
<environment id="mysql">
<!-- 使用JDBC的事务管理 -->
<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>
</configuration>
2. <settings>元素
01.<settings>元素用于改变Mybatis运行时的行为,比如开启二级缓存、开启延时加载等操作。
02.<settings>元素的常见配置MyBatis XML配置
(一)一级缓存默认开启,缓存在sqlSession中
@Test//一级缓存默认开启,缓存在sqlSesssion中
public void cacheOnetest() {
SqlSession sqlSession = MybatisUtils.getSession();
Customer customer = sqlSession.selectOne("com.wang.mapper" + ".CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
//再次查询
customer = sqlSession.selectOne("com.wang.mapper" + ".CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
sqlSession.close();
}
结果:
注意:只发送一条SQL语句
DEBUG [main] - ==> Preparing: select*from t_customer where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
Customer [id=1, username=joy, jobs=doctor, phone=18990123432]
Customer [id=1, username=joy, jobs=doctor, phone=18990123432]
(二)一级缓存默认开启,缓存在sqlSession中,并执行清空一级缓存操作
@Test//一级缓存默认开启,缓存在sqlSesssion中
public void cacheOnetest() {
SqlSession sqlSession = MybatisUtils.getSession();
Customer customer = sqlSession.selectOne("com.wang.mapper" + ".CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
//清空一级缓存
sqlSession.commit();
//再次查询
customer = sqlSession.selectOne("com.wang.mapper" + ".CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
sqlSession.close();
}
结果:
注意:向数据库发送两条SQL语句
DEBUG [main] - ==> Preparing: select*from t_customer where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
Customer [id=1, username=joy, jobs=doctor, phone=18990123432]
DEBUG [main] - ==> Preparing: select*from t_customer where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
Customer [id=1, username=joy, jobs=doctor, phone=18990123432]
(三)二级缓存在SqlSessionFactory中,需要手动在mybatis-config.xml开启。
第一步:在mybatis-config.xml<settings> 标签开启二级缓存
<?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>
<!--加载db.properties文件 -->
<properties resource="db.properties" />
<settings>
<!--开启二级缓存,true表示开启,默认是关闭的-->
<setting name="cacheEnabled" value="true" />
</settings>
<!--1.配置环境 ,默认的环境id为mysql -->
<environments default="mysql">
<!--1.2.配置id为mysql的数据库环境 -->
<environment id="mysql">
<!-- 使用JDBC的事务管理 -->
<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>
</configuration>
第二步:CustomerMapper.xml中使用<cache> 标签开启二级缓存
<?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">
<!-- namespace表示命名空间 -->
<mapper namespace="com.wang.mapper.CustomerMapper">
<!--开启二级缓存,空标签即可表示开启缓存-->
<cache/>
<!--1.根据客户编号获取客户信息 -->
<select id="findCustomerById" parameterType="Integer"
resultType="com.wang.po.Customer">
select*from t_customer where id=#{id}
</select>
</mapper>
3.第三步:POJO类必须实现序列化接口
public class Customer implements Serializable{
private Integer id;
private String username;
private String jobs;
private String phone;
----省略setter和getter----
@Override
public String toString() {
return "Customer [id=" + id + ", username=" + username +
", jobs=" + jobs + ", phone=" + phone + "]";
}
}
4.测试二级缓存
@Test
public void cacheTwotest() {
//第一次查询会话
SqlSession sqlSession = MybatisUtils.getSession();
Customer customer = sqlSession.selectOne("com.wang.mapper" + ".CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
sqlSession.close();
//第二次查询会话
sqlSession = MybatisUtils.getSession();
customer = sqlSession.selectOne("com.wang.mapper" + ".CustomerMapper.findCustomerById", 1);
System.out.println(customer.toString());
sqlSession.close();
}
结果:
第一步:缓存中没有数据,再向数据库中发送SQL
DEBUG [main] - Cache Hit Ratio [com.wang.mapper.CustomerMapper]: 0.0
DEBUG [main] - ==> Preparing: select*from t_customer where id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
Customer [id=1, username=joy, jobs=doctor, phone=18990123432]
第二步:二级缓存保存了第一次查询的数据,所以第二次不需要再次向数据库发送SQL
DEBUG [main] - Cache Hit Ratio [com.wang.mapper.CustomerMapper]: 0.5
Customer [id=1, username=joy, jobs=doctor, phone=18990123432]
3. <typeAliases>元素
<typeAliases> 元素 用于为配置文件中的Java类型设置一个别名,目的是减少权限定类名的冗余。
01.配置单个POJO类
第一步:在mybatis-config.xml文件中添加<typeAliases>元素
<?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>
<!-- 定义别名-->
<typeAliases>
<typeAlias alias="customer" type="com.wang.po.Customer"/>
</typeAliases>
</configuration>
第二步:使用mybatis-config.xml文件中配置的别名替换CustomerMapper.xml<select> 元素中的resultType属性的值。
<?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">
<!-- namespace表示命名空间 -->
<mapper namespace="com.wang.mapper.CustomerMapper">
<!--1.resultType使用全限定类名 -->
<select id="findCustomerById" parameterType="Integer"
resultType="com.wang.po.Customer">
select*from t_customer where id=#{id}
</select>
<!--2.使用别名代替-->
<select id="findCustomerById" parameterType="Integer"
resultType="customer">
select*from t_customer where id=#{id}
</select>
</mapper>
02.配置多个POJO类
第一步:在mybatis-config.xml文件中添加<typeAliases>元素
<?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>
<!-- 使用自动扫描包来定义别名-->
<typeAliases>
<package name="com.wang.po"/>
</typeAliases>
</configuration>
第二步:CustomerMapper.xml<select> 元素中的resultType属性的值就是该包下类以首字母为小写的非限定类名来作为别名。
<?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">
<!-- namespace表示命名空间 -->
<mapper namespace="com.wang.mapper.CustomerMapper">
<!--2.以Customer类首字母为小写作为别名-->
<select id="findCustomerById" parameterType="Integer"
resultType="customer">
select*from t_customer where id=#{id}
</select>
</mapper>
4. <mapper>元素
在mybatis-config.xml配置文件中,使用<mapper>元素元素指定Mybatis映射文件的位置。有以下4中引入映射文件的方式。
01.使用类路径引入
<mappers>
<mapper resource="com/wang/mapper/CustomerMapper.xml" />
</mappers>
02.使用本地文件路径引入
<mappers>
<mapper resource="file:///D:/com/wang/mapper/CustomerMapper.xml" />
</mappers>
03.使用接口类映入
<mappers>
<mapper resource="com.wang.mapper.CustomerMapper" />
</mappers>
04.使用包引入
<mappers>
<mapper resource="com.wang.mapper" />
</mappers>
5. <environments>元素
<environments>元素用来配置多种数据库。
<environments default="mysql">
<!--1.2.配置id为mysql的数据库环境 -->
<environment id="mysql">
<!-- 使用JDBC的事务管理 -->
<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>