深入浅出MyBatis:MyBatis的所有配置
为什么80%的码农都做不了架构师?>>>
上一篇介绍了JDBC的相关概念、MyBatis的特性与Hibernate的区别、MyBatis的基本组件与生命周期,基本可以使用MyBatis了。
这一篇详细介绍MyBatis的配置,首先看下配置XML文件的层次结构,然后详细介绍每个配置项,说明每项的作用,值的取值与含义。
下面列出MyBatis配置XML文件的层次结构,这些层次是不能够颠倒顺序的。
<?xml version="1.0" encoding="UTF-8"?>
<configuration> <properties/> <settings/> <typeAliases/> <typeHandles/> <objectFactory/> <plugins/> <environments> <environment> <transanctionManager/> <!-- 配置事务管理器 --> <dataSource/> <!-- 配置数据源 --> </environment> </environments> <databaseIdProvider/> <!-- 数据库厂商标识 --> <mappers/> <!-- 映射器 -->
</configuration>
properties元素
将一些公用、经常变更的值单独声明,能在配置文件的上下文中使用它,MyBatis提供了3种配置方式:
- property子元素
- properties配置文件
- 程序参数传递
property子元素
<properties><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mi-user"/><property name="username" value="root"/><property name="pwd" value="123456"/></properties>
properties配置文件
创建一个配置文件 jdbc.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mi-user
username = root
password = 123456
设置properties配置文件
<properties resource='jdbc.properties' />
程序参数传递
实际工作中,会遇到这种场景:系统由运维人员配置,生成数据库的密码对开发者是保密的,对用户名和密码进行了加密。可以通过程序参数传递的方式,先解密,再设置property。
//读入配置文件流
InputStream cfgStream = Resources.getResourceAsStream("mybatis-config.xml");
Reader cfgReader = new InputStreamReader(cfgStream);//读入属性文件流
InputStream proStream = Resources.getResourceAsStream("jdbc.properties");
Reader proReader = new InputStreamReader(proStream);Properties properties = new Properties();
properties.load(proReader);
//转换为明文
properties.setProperty("username",decode(properties.getProperty("username")));
properties.setProperty("pwd",decode(properties.getProperty("pwd")));//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(cfgReader,properties);
如果3种配置同时出现,优先级为第3种 > 第2种 > 第1种,推荐使用第2种,有特殊需求时使用第3种。
设置
设置会改变MyBatis运行时的行为,设置项很多,只会介绍常用的配置,想了解全部配置可以查看官方文档。
- cacheEnabled,全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为true;
- lazyLoadingEnabled,延迟加载的全局开关,当开启时,所有关联对象都会延迟加载,特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态,默认为false;
- aggressiveLazyLoading,当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载,3.4.1版本之前默认为true,3.4.1之后默认为false;
- autoMappingBehavior,指定MyBatis应如何自动映射列到字段或属性,NONE 表示取消自动映射,PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集,FULL 会自动映射任意复杂的结果集,默认为PARTIAL;
- autoMappingUnknownColumnBehavior,指定发现自动映射目标未知列(或者未知属性类型)的行为,NONE: 不做任何反应,WARNING: 输出提醒日志,FAILING: 映射失败,默认为NONE;
- defaultStatementTimeout,设置超时时间,它决定驱动等待数据库响应的秒数;
- mapUnderscoreToCamelCase,是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射,默认为false;
- defaultEnumTypeHandler,指定 Enum 使用的默认 TypeHandler,默认为org.apache.ibatis.type.EnumTypeHandler;
- returnInstanceForEmptyRow,当返回行的所有列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例,默认为false;
- localCacheScope,MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据,默认为SESSION;
- logImpl,指定日志的具体实现,比如SLF4J|LOG4J|COMMONS_LOGGING等;
别名
在配置映射文件中,需要指定类的全限定名,为了简化,可以声明一个简短的名称去指代它,可以在MyBatis上下文中使用。系统已经为我们定义了常用的类型,比如数值、字符串、日期、集合等。对于自定义的业务POJO,需要自定义别名。
<typeAliases><typeAlias alias="role" type="com.learn.chapter2.po.Role"/>
</typeAliases>
也可以通过注解方式进行,首先配置一个扫描的包,然后在类定义时添加注解@Alias("role")。
<typeAliases><package name="com.learn.chapter2.po" />
</typeAliases>
@Alias("role")
public class Role{
}
类型处理器
MyBatis在预处理语句中设置一个参数时,或者从结果集中取出一个值时,都会用注册了的typeHader进行处理。typeHander的作用就是将参数从javaType转化为jdbcType,或者从数据库取出结果时把jdbcType转化为javaType。
系统内部已经定义了常用的类型处理器,有些情况下,需要自定义。
MyBatis也提供了枚举类型的类型处理器,有2个转化枚举类型的typeHandler,EnumTypeHandler和EnumOrdinalTypeHandler,其中EnumTypeHandler是使用枚举字符串名称作为参数传递的,EnumOrdinalTypeHandler是使用整数下标作为参数传递的。
但这2个枚举类型应用不那么广泛,更多的时候,需要自定义typeHandler进行处理。
自定义类型处理器,首先要定义类型处理类,实现TypeHandler泛型接口:
public class SexEnumTypeHandler implements TypeHandler<Sex> {@Overridepublic void setParameter(PreparedStatement ps, int i, Sex sex, JdbcType jdbcType) throws SQLException {ps.setInt(i, sex.getId());}@Overridepublic Sex getResult(ResultSet rs, String name) throws SQLException {return Sex.getSex(rs.getInt(name));}@Overridepublic Sex getResult(ResultSet rs, int id) throws SQLException {return Sex.getSex(id);}@Overridepublic Sex getResult(CallableStatement cs, int id) throws SQLException {return Sex.getSex(cs.getInt(id));}
}
然后注册自定义的TypeHandler
<typeHandlers><typeHandler handler="com.qqdong.study.SexEnumTypeHandler" javaType="sex"/>
</typeHandlers>
最后,在定义映射器时,指定typeHandler即可
<select id="getUser" parameterType="long" resultType="userMap">
</select><resultMap id="userMap" type="user"><result column="sex" property="sex" typeHandler="com.qqdong.study.SexEnumTypeHandler">
</resultMap>
ObjectFactory
当MyBatis在构建一个结果返回的时候,都会使用ObjectFactory去构建POJO,在MyBatis中可以定制自己的对象工厂。一般不用配置,使用默认的DefaultObjectFactory即可。
插件plugin
插件比较复杂,后续单独一篇文章介绍。
environments配置环境
配置环境可以注册多个数据源,每个数据源包括基本配置和数据库事务配置。
<environments default="development"><environment id="development"><!-- 采用jdbc事务管理 --><transactionManager type="JDBC"><property name="autoCommit" value="false"></transactionManager><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>
其中,transactionManager指定数据库事务,有3种配置方法:
- JDBC,采用JDBC方式管理事务,在独立编码中常常使用;
- MANAGED,采用容器方式管理事务,在JNDI数据源中常用;
- 自定义,由使用者自定义数据库事务管理方法;
dataSource标签,配置数据源连接信息,type配置对数据库连接方式,有以下几种:
- UNPOOLED:非连接池数据库;
- POOLED:连接池数据库;
- JNDI:JNDI数据源;
- 自定义数据源;
databaseIdProvider数据库厂商标识
该属性的作用在于指定SQL到对应的数据库厂商提供的数据库中运行。不常用,就不介绍了。
映射器
映射器是MyBatis最复杂、最核心的配置,包括参数类型、动态SQL、定义SQL、缓存信息等功能,上篇文章也演示了具体的例子,下篇文章会重点介绍细节。
转载于:https://my.oschina.net/qqtalk/blog/1788406
深入浅出MyBatis:MyBatis的所有配置相关推荐
- 搭建eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo
前言:我这里搭建好eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo.新手快速上手直接看demo. 最后处提供完整高质量de ...
- SpringMVC+Mybatis基础知识和配置
SpringMVC和Mybatis简单的记录一下,因为现在有比较新的SpringBoot和Mybatis plus简化了很多步骤. SpringMVC 使用 创建maven项目,pom.xml < ...
- MyBatis二级缓存的配置
Mybatis的二级缓存配置非常简单,只需要在mapper.xml中添加一句 <cache /> 如果需要跟详细的配置可以配置其属性 <mapper namespace=" ...
- 基于maven的SpringMVC+Spring+MyBatis+Log4j2的pom配置
[0]README:本文旨在给出可以正常跑 测试用例的项目依赖配置, 同时还会给出 maven 编译项目时的坑儿: [1] pom配置: <project xmlns="http:// ...
- pom添加mysql依赖tomcat崩溃_Spring Boot + Mybatis + Spring MVC环境配置(一) :Spring Boot初始化,依赖添加...
最近在搭建一个Spring Boot + Mybatis + Spring MVC的环境,折腾来折腾去,两三天才搞定,记录下大概过程和遇到的错误 看一下Spring Boot官方的介绍 : Sprin ...
- MyBatis之优化MyBatis配置文件中的配置
MyBatis之优化MyBatis配置文件中的配置 2017/9/30 MyBatis配置文件很重要,首先我们来看看MyBatis配置文件中的内容和顺序: 文件目录结构如下: 1.<proper ...
- Spring+Mybatis使用MapperScannerConfigurer简化配置__MapperScannerConfigurer的作用
Spring+Mybatis使用MapperScannerConfigurer简化配置 MyBatis的一大亮点就是可以不用DAO层的实现类,而我们知道service层调dao层 如果没有实现类,Sp ...
- mybatis注解开发_快速搭建MyBatis开发环境(配置版+注解版)
下面我们搭建一下MyBaits的开发环境,也就是一个用MyBaits框架访问数据库的例子. 1.项目结构如下 这里搭建的是一个maven项目. 2.引入依赖pom.xml 4.0.0com.suibi ...
- Mybatis非mapper代理配置
转: Mybatis非mapper代理配置 2017年04月26日 20:13:48 待长的小蘑菇 阅读数:870 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版
SpringBoot数据访问Mybatis注解版,配置版,注解与配置一体版 注解版: 1.改druid 连接池,不改可以跳过这步 添加依赖 <dependency><groupId& ...
最新文章
- ubuntu16.04 安装网易云音乐
- 记前端项目首屏加载优化(网络篇)
- linux 查看cpu_看看你的嵌入式设备CPU温度是多少,能烤肉吗?
- Linux系统编程4:入门篇之最强编辑器vim的使用攻略
- np.linalg 线性代数
- Linux查看磁盘块大小
- mysql 丛集_MYSQL
- 一年读完100本书(5/100)《创新者的窘境》2021-02-25
- Excel如何实现随机不重复抽取
- VBA入门--VBA基础知识和简单技能技巧
- HDR高动态范围图像处理算法
- matlab遥感图像分类
- mysql存储视频_特殊格式文件(视频、声音等) 在数据库中的存储方式
- PCB添加图片或logo的方法
- 基于proteus的51单片机仿真实例五十七、定时器/计数器T0的定时实例
- Golang开发环境搭建
- 如何确认EasyNVR拉转推视频流到EasyDSS播放出现掉帧的问题?
- android 实例 super 什么意思
- 简单聊聊SOA和微服务
- 用range函数解码高斯等差数列求和