博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入浅出MyBatis:MyBatis的所有配置
阅读量:7099 次
发布时间:2019-06-28

本文共 4741 字,大约阅读时间需要 15 分钟。

  hot3.png

上一篇介绍了JDBC的相关概念、MyBatis的特性与Hibernate的区别、MyBatis的基本组件与生命周期,基本可以使用MyBatis了。

这一篇详细介绍MyBatis的配置,首先看下配置XML文件的层次结构,然后详细介绍每个配置项,说明每项的作用,值的取值与含义。

下面列出MyBatis配置XML文件的层次结构,这些层次是不能够颠倒顺序的。

properties元素

将一些公用、经常变更的值单独声明,能在配置文件的上下文中使用它,MyBatis提供了3种配置方式:

  • property子元素
  • properties配置文件
  • 程序参数传递
property子元素
properties配置文件

创建一个配置文件 jdbc.properties

driver = com.mysql.jdbc.Driverurl = jdbc:mysql://localhost:3306/mi-userusername = rootpassword = 123456

设置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")));//创建sqlSessionFactorySqlSessionFactory 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,需要自定义别名。

也可以通过注解方式进行,首先配置一个扫描的包,然后在类定义时添加注解@Alias("role")。

@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
{ @Override public void setParameter(PreparedStatement ps, int i, Sex sex, JdbcType jdbcType) throws SQLException { ps.setInt(i, sex.getId()); } @Override public Sex getResult(ResultSet rs, String name) throws SQLException { return Sex.getSex(rs.getInt(name)); } @Override public Sex getResult(ResultSet rs, int id) throws SQLException { return Sex.getSex(id); } @Override public Sex getResult(CallableStatement cs, int id) throws SQLException { return Sex.getSex(cs.getInt(id)); }}

然后注册自定义的TypeHandler

最后,在定义映射器时,指定typeHandler即可

ObjectFactory

当MyBatis在构建一个结果返回的时候,都会使用ObjectFactory去构建POJO,在MyBatis中可以定制自己的对象工厂。一般不用配置,使用默认的DefaultObjectFactory即可。

插件plugin

插件比较复杂,后续单独一篇文章介绍。

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

你可能感兴趣的文章
使用ServiceStack构建Web服务
查看>>
vbox磁盘空间扩容
查看>>
java的IO操作
查看>>
PHP curl Post请求和Get请求~
查看>>
PostgreSQL 9.6.0 文档
查看>>
【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
查看>>
python socket编程
查看>>
adjacent_diffenerce
查看>>
Borland DelphiXE5 正版软件价格代理商
查看>>
php取得当前时间函数
查看>>
orcal从同一段分别查出市和省,并分列显示
查看>>
善用思维导图来整理发散的思维
查看>>
2014百度之星 Party
查看>>
win10 adb(Android Debug Bridge)导出日志
查看>>
js选择栏select插件 简易
查看>>
sql中truncate 、delete与drop区别
查看>>
【转】养成一个SQL好习惯带来一笔大财富
查看>>
BZOJ1087[SCOI2005]互不侵犯——状压DP
查看>>
SQL2005 2008配置错误,无法识别的配置节 system.serviceModel machine.config配置文件有问题...
查看>>
Scala 学习笔记之集合(8) Try和Future
查看>>