MyBatis 配置文件

内容主要来自于mybatis文档

映射文件中的顶级元素

myBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息

  • configuration 配置
    • properties 属性
    • settings 设置
    • typeAliases 类型别名
    • typeHandlers 类型处理器
    • objectFactory 对象工厂
    • plugins 插件
    • environments 环境
    • environment 环境变量
    • transactionManager 事务管理器
    • dataSource 数据源
    • databaseIdProvider 数据库厂商标识
    • mappers 映射器
一.映射器(Mapper)

Mybatis配置文件有一个Mappers元素可以指定mybatis去哪里找映射文件

	<mappers>
		<mapper resource="org/mybatis/mapper/StudentMapper.xml"/>
		<mapper class="org.mybatis.mapper.StudentMapper"/>
		<mapper  url="file:///D:/mybatisDemo/StudentMapper.xml"/>
		<package name="org.mybatis.mapper"/>
	</mappers>

mybatis配置文件有四种寻找映射文件的方式:

  • resource: 该路径为XXXmapper.xml文件classpath 路径
  • url: 限定资源定位符(URL),file:/// file_absolute_path
  • class: 该方式要求mapper接口和mapper映射文件在同一个目录下,且文件名称相同
  • package: 会加载指定包下的所有mapper,同样要求mapper接口和mapper映射文件在同一个目录下且文件名称相同

注意:使用package和class这两种加载方式,映射文件还需要满足以下两点:

  • 映射文件的namespace="mapperInterface.class"
  • mapperInterface方法名和对应操作元素id 一致。
    这样通过代理,就可以找到对应的语句,“className”.“methodName” ---->“namespace”.“elementId”

除此之外,还可以直接在spring中配置Mapper的路径,但是mybatis.xml还是必不可少的

在sqlSessionFactory中设置 MyBatis 映射文件的加载路径

<!-- MustConfigPoint MyBatis begin -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="typeAliasesPackage" value="实体类包路径" />
		<property name="typeAliasesSuperType" value="实体类顶级包路径" />
		<property name="mapperLocations" value="classpath:/mybatis/mappings/**/*.xml" />
		<property name="configLocation" value="classpath:/mybatis/mybatis-config.xml"></property>
	</bean>

配置Mapper 接口的加载路径

<!-- MustConfigPoint 扫描basePackage下所有以@MyBatisDao注解的接口 -->
	<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="mapper类的包路径" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
		<property name="annotationClass" value="com.msyd.framework.common.persistence.annotation.MyBatisDao" />
	</bean>
二.属性(properties)

加载配置文件用于配置一些可变的属性值,也可以在子元素property中指定

<properties resource="org/mybatis/example/mysql.properties">
  <property name="username" value="guest"/>
  <property name="password" value="123456"/>
</properties>

定义的这些属性就可以在整个配置文件中被用来替换需要动态配置的属性值。

<dataSource type='pooled'>
	<property name="driver" value="${driver}"/>
	<property name="url" value="${url}"/>
	.....
</dataSource>

如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

  • 在 properties 元素体内指定的属性首先被读取。
  • properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
    因此属性优先级如下,method_args > resource_file_property > property
设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。

<settings>
  <setting name="cacheEnabled" value="true"/>  //全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存。(一级缓存和二级缓存)
  <setting name="lazyLoadingEnabled" value="true"/> //全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。
  <setting name="multipleResultSetsEnabled" value="true"/>//是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true
  <setting name="useColumnLabel" value="true"/> 是否可以使用列的别名 (取决于驱动的兼容性) default:true 
  <setting name="useGeneratedKeys" value="false"/> //允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作。
  <setting name="autoMappingBehavior" value="PARTIAL"/>  //指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。
  <setting name="autoMappingUnknownColumnBehavior" value="NONE"/>指定发现自动映射目标未知列(或者未知属性类型)的行为。
  <setting name="defaultExecutorType" value="SIMPLE"/>  //	配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。
  <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"/>MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。
  <setting name="jdbcTypeForNull" value="OTHER"/>  //当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
  <setting name="logImpl" value="SLF4J "/>//指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J | LOG4J2 |JDK_LOGGING|COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
  <setting name="logPrefix" value="任何字段"/>//指定 MyBatis 增加到日志名称的前缀。
  <setting name="callSettersOnNulls" value="true" /> //指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。默认值false
  <setting name="returnInstanceForEmptyRow"  value="true"/>//当返回行的所有列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集.默认false
  <setting name="useActualParamName" value="true"/>	//允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项"
</settings>

下面重点说一下几个属性:

  • mapUnderscoreToCamelCase:一般数据库,字段名称不区分大小写,所以通常会结合“_”来命名表字段。通常的JavaBean的属性使用驼峰标记 。这样开启这个配置以后,数据库字段就可以映射到javaBean中的属性中USER_NAME ->userName

  • useGeneratedKeys: 允许JDBC 支持自动生成主键,需要驱动兼容。设置了配置以后,会调用JDBC 的getGeneratedKeys方法,需要jdbc驱动的支持(mysql,sqlserver)。

  • callSettersOnNulls : 返回列值为null时,是否调用setter(Map的put)方法。如果设置了选项,那么建议返回值使用javaBean而不是Map。
    Mybatis的配置文件

<?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>
	<settings>
	    <!-- 使全局的映射器启用或禁用缓存。 -->
		<setting name="cacheEnabled" value="true" />
		<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
		<setting name="lazyLoadingEnabled" value="true" />
		<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->        
         <setting name="aggressiveLazyLoading" value="true"/>        
         <!-- 是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true -->
		<setting name="multipleResultSetsEnabled" value="true" />
		<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
		<setting name="useColumnLabel" value="true" />
		<!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。  default:false  -->
		<setting name="useGeneratedKeys" value="false" />
		<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分  FULL:全部  -->
		<setting name="autoMappingBehavior" value="PARTIAL" />
		<!-- 这是默认的执行类型  (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新)  -->
		<setting name="defaultExecutorType" value="SIMPLE" />
		<setting name="defaultFetchSize" value="100" />
		
		<setting name="safeRowBoundsEnabled" value="false" />
		<!-- 使用驼峰命名法转换字段。 -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
		<!-- 设置本地缓存范围 session:就会有数据的共享  statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
		<setting name="localCacheScope" value="SESSION" />
		<!-- 默认为OTHER,为了解决oracle插入null报错的问题要设置为NULL -->
		<setting name="jdbcTypeForNull" value="NULL" />
		<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
	</settings>
</configuration>

类型别名(typeAliases)

类型别名是为 Java 类型设置一个短的名字,存在的意义仅在于用来减少类完全限定名的冗余。

这是一些为常见的 Java 类型内建的相应的类型别名。它们都是大小写不敏感的,需要注意的是由基本类型名称重复导致的

别名           	映射的类型
_byte	         byte
_long	         long
_short	         short
_int	         int
_integer	     int
_double	         double
_float	         float
_boolean	     boolean
string	         String
byte	         Byte
long	         Long
short	         Short
int	             Integer
integer	         Integer
double	         Double
float			 Float
boolean			 Boolean
date			 Date
decimal			 BigDecimal
bigdecimal		 BigDecimal
object			Object
map				Map
hashmap			HashMap
list			List
arraylist		ArrayList
collection		Collection
iterator		Iterator
类型处理器(typeHandlers)

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis 内置了大量的类型处理器

//@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter);
  }

  @Override
  public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return rs.getString(columnName);
  }

  @Override
  public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return rs.getString(columnIndex);
  }

  @Override
  public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return cs.getString(columnIndex);
  }
}

配置全局的类型处理器

<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"  jdbcType="VARCHAR"/>
</typeHandlers>
  • 在类型处理器的配置元素(typeHandler element)上增加一个 javaType 属性(比如:javaType=“String”);
  • 在类型处理器的类上(TypeHandler class)增加一个 @MappedTypes 注解来指定与其关联的 Java 类型列表。 如果在 javaType 属性中也同时指定,则注解方式将被忽略。
类型处理器Java 类型JDBC 类型
BooleanTypeHandlerjava.lang.Boolean, boolean数据库兼容的 BOOLEAN
ByteTypeHandlerjava.lang.Byte, byte数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandlerjava.lang.Short, short数据库兼容的 NUMERIC 或 SHORT INTEGER
IntegerTypeHandlerjava.lang.Integer, int数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandlerjava.lang.Long, long数据库兼容的 NUMERIC 或 LONG INTEGER
FloatTypeHandlerjava.lang.Float, float数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandlerjava.lang.Double, double数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal数据库兼容的 NUMERIC 或 DECIMAL
StringTypeHandlerjava.lang.StringCHAR, VARCHAR
ClobReaderTypeHandlerjava.io.Reader-
ClobTypeHandlerjava.lang.StringCLOB, LONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHAR, NCHAR
NClobTypeHandlerjava.lang.StringNCLOB
BlobInputStreamTypeHandlerjava.io.InputStream-
ByteArrayTypeHandlerbyte[]数据库兼容的字节流类型
BlobTypeHandlerbyte[]BLOB, LONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAny OTHER 或未指定类型
环境配置(environments)
<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </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>

注意这些关键点;

  • 默认的环境iddefault="development"
  • 每个环境中定义的环境idid="development"
  • 事务管理器配置type="JDBC"
  • 数据源配置type="POOLED"
    可以对环境随意命名,但一定要保证默认的环境 ID 要匹配其中一个环境 ID
transactionManager

mybatis支持两种事务管理器类型(type="[JDBC|MANAGED]"

  • jdbc 这个配置直接使用jdbc的提交和回滚,它依赖于从数据源得到的连接来管理事务作用域
  • MANAGED 这个配置几乎不做任何事情。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期

提示:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。

dataSource

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):

  • UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。 不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性:

     - driver – 这是 JDBC 驱动的 Java 类的完全限定名(并不是 JDBC 驱动中可能包含的数据源类)。
     -  url – 这是数据库的 JDBC URL 地址。
     -  username – 登录数据库的用户名。
     -  password – 登录数据库的密码。
     -   defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
    

作为可选项,你也可以传递属性给数据库驱动。要这样做,属性的前缀为“driver.”,例如:driver.encoding=UTF8
这将通过 DriverManager.getConnection(url,driverProperties) 方法传递值为 UTF8 的 encoding 属性给数据库驱动。

  • POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
    除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 POOLED 的数据源:

    • poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
    • poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
    • poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
    • poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
    • poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程. 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3 (新增于 3.4.5)
    • poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
    • poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
    • poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
  • JNDI – 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这种数据源配置只需要两个属性:

    • initial_context – 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么 data_source 属性将会直接从 InitialContext 中寻找。
    • data_source – 这是引用数据源实例位置的上下文的路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
      和其他数据源配置类似,可以通过添加前缀“env.”直接把属性传递给初始上下文。比如:env.encoding=UTF8
插件(plugins)

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

参考文献:
Mybatis 加载 Mapper配置的四种方式
mybatis文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值