4、配置文件
4.1、核心配置文件
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
mybatis定义的配置文件顺序,配置标签顺序不可以乱,必须要严格按照定义的顺序来
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
properties(属性)
<!--引入外部配置文件-->
<properties resource="db.properties"/>
可以用来引入外部配置文件
创建在resources文件根目录下创建db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username=root
password=root
使用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>
settings(设置)
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
typeAliases(类型别名)
可以使用typeAlias标签
<!--可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.zhangjiangbo.cn.bean.User" alias="User"></typeAlias>
</typeAliases>
也可以使用包名,使用包名则会默认bean的首字母小写作为他的别名
<typeAliases>
<package name="com.zhangjiangbo.cn.bean"/>
</typeAliases>
也可以使用注解的方式
@Alias("User")
public class User {
}
说明:当标签使用包名时,包下类有使用注解的则优先采用注解别名
environments(环境配置)
MyBatis 可以配置成适应多种环境,必须指定其中一个为默认运行环境(通过default指定)
子节点environment
- 具体的一套环境,通过设置id进行区别,id保证唯一!
- 子节点元素:transactionManager 事务管理器
- MyBatis默认的事务管理器就是JDBC
- 子节点元素:dataSource数据源
- 默认的数据源POOLED
mappers(映射器)
第一种方式(使用相对于类路径的资源引用)
<mappers>
<mapper resource="com/zhangjiangbo/cn/mapper/UserMapper.xml"/>
</mappers>
第二种方式(使用映射器接口实现类的完全限定类型)
需要配置文件名称和接口名称一致,并且位于同一目录下
<mappers>
<mapper class="com.zhangjiangbo.cn.mappers.UserMapper"/>
</mappers>
第三种方式(将包内的映射器接口全部注册为映射器)
需要配置文件名称和接口名称一致,并且位于同一目录下
<mappers>
<package name="com.zhangjiangbo.cn.mappers"></package>
</mappers>
mybaits的生命周期和作用域
SqlSessionFactoryBuilder:
- 创建sqlSessionFactory后边失去作用
- 最佳作用域是局部变量
SqlSessionFactory:
- 可以想象为:数据库连接池
- 创建sqlSession接口对象,存在于整个mybatis周期
- 单例模式,在应用中被共享
最佳作用域是成员变量
SqlSession:
- 连接到连接池的一个请求
- SqlSession不是线程安全的,执行完一个业务请求后需要关闭
通过try…catch…finally… 语句来保证其正确关闭
最佳作用域是局部变量
ResultMap标签
解决数据库字段和实体类字段名称不一致问题
问题:
运行结果
解决办法:
- 使用resultMap 标签一一对应 查询返回类型修改为resultMap=“BaseResultMap”
<resultMap id="BaseResultMap" type="com.zhangjiangbo.cn.bean.User">
<id column="id" jdbcType="INTEGER" property="id"></id>
<result column="username" jdbcType="VARCHAR" property="username"></result>
<result column="password" jdbcType="VARCHAR" property="pwd"></result>
</resultMap>
<select id="getAll" resultMap="BaseResultMap">
select * from `user`
</select>
resultMap 元素是 MyBatis 中最重要最强大的元素
ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。