MyBatis配置解析
核心配置文件
点进mybatis-config.xml的dtd头文件,可以看到能配置的相关信息。注意元素节点的顺序!顺序不对会报错
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
environments
<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/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
environments:可配置多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境
environment:具体的一套环境,id唯一
transactionManager:事务管理
dataSource:有三种内建的数据源unpooled,pooled,jndi,也有很多第三方实现如dbcp,c3p0,druid等
mappers
作用是定义映射SQL语句文件,MyBatis中的映射器组件支持xml映射和接口映射,有三种引入资源的方式
使用相对于类路径的资源引用
<mappers>
<mapper resource="com/dream/dao/UserMapper.xml"/>
</mappers>
使用映射器接口实现类的完全限定类名
<mappers>
<mapper class="com.dream.dao.UserMapper"/>
</mappers>
将包内的映射器接口实现全部注册为映射器
<mappers>
<package name="com.dream.dao"/>
</mappers>
Mapper
<?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">
<mapper namespace="com.dream.dao.UserMapper">
</mapper>
namespace:绑定Mapper接口,与接口同名且接口中的方法与映射文件中sql语句id对应
Properties
在资源目录下新建一个db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=root
将properties文件引入MyBatis配置文件中
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
typeAliases
类型别名只和xml配置有关,用来减少类完全限定名的冗余
<typeAliases>
<typeAlias type="com.dream.pojo.User" alias="User"/>
</typeAliases>
也可以指定一个包名,MyBatis 会在包名下面搜索需要的类
<typeAliases>
<package name="com.dream.pojo"/>
</typeAliases>
在没有注解的情况下,会使用类的首字母小写的非限定类名来作为它的别名,若有注解,则别名为其注解值
settings
可以配置懒加载,日志实现,缓存开启关闭等
作用域和生命周期
SqlSessionFactoryBuilder的作用在于创建 SqlSessionFactory,创建成功后SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,不能长期存在,因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域
SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象,其的生命周期存在于整个MyBatis 的应用之中
如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以 SqlSessionFactory 的最佳作用域是应用作用域
SqlSession 相当于一个数据库连接对象,可以在一个事务里面执行多条 SQL,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光
|