MyBatis XML配置

典型结构

<?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>
    <properties>
        <property/>
    </properties>

    <settings>
        <setting/>
    </settings>

    <typeAliases>
        <typeAlias/>
    </typeAliases>

    <environments>
        <environment>
            <transactionManager/>
            <dataSource>
                <property/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper/>
    </mappers>
</configuration>

属性参数

<properties resource="org/mybatis/example/config.properties">
    <property name="username" value="dev_user"/>
    <property name="password" value="F2Fa3!33TYyg"/>
</properties>

在XML中,以上方式定义的参数可以作为“变量”在配置文件中使用,使用方法例如${username}
可以使用${username:ut_user}为参数设置默认值,其中ut_user为username的默认值,当没有定义username时,其值就为默认值。
默认值默认为不可用,需要使用以下参数开启

    <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 -->
    <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- 修改默认值的分隔符为?: -->

属性加载顺序

在 properties 元素体内指定的属性首先被读取。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

MyBatis设置

<settings>
  <setting name="cacheEnabled" value="true"/><!--Mapper缓存开关-->
  <setting name="lazyLoadingEnabled" value="true"/><!--延迟加载开关,决定一个对象相关联的其他对象是否延迟加载-->
  <setting name="multipleResultSetsEnabled" value="true"/><!--单一语句返回多个结果集-->
  <setting name="useColumnLabel" value="true"/><!--使用列标签代替列名-->
  <setting name="useGeneratedKeys" value="false"/><!--允许 JDBC 支持自动生成主键-->
  <setting name="autoMappingBehavior" value="PARTIAL"/><!--指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。-->
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/><!--指定发现自动映射目标未知列(或者未知属性类型)的行为。-->
  <setting name="defaultExecutorType" value="SIMPLE"/><!--SQL语句执行器选择-->
  <setting name="defaultStatementTimeout" value="25"/><!--设置超时时间,它决定驱动等待数据库响应的秒数。-->
  <setting name="defaultFetchSize" value="100"/><!--为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。-->
  <setting name="safeRowBoundsEnabled" value="false"/><!--允许在嵌套语句中使用分页(RowBounds)-->
  <setting name="mapUnderscoreToCamelCase" value="false"/><!--是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。-->
  <setting name="localCacheScope" value="SESSION"/><!--MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 -->
  <setting name="jdbcTypeForNull" value="OTHER"/><!--空值默认的JDBC类型-->
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/><!--	指定哪个对象的方法触发一次延迟加载。-->
  <setting name="logImpl" value="LOG4J"/><!--MyBatis会优先使用Tomcat之类的默认日志来记录,不过这里可以指定MyBatis的log记录工具,比如这里是log4j。不过也可以在调用其他MyBatis方法前通过org.apache.ibatis.logging.LogFactory.useLog4JLogging();语句使用日志工具。-->
</settings>

类型别名

为Java类型设置一个短的名字,仅和XML配置有关。
Java内建类型的常见别名为其小写,基本类型还要在前面加_。

XML方式

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Post" type="domain.blog.Post"/>
</typeAliases>

用到domain.blog.Author的地方都可以直接用Author。

注解方式

自动从包里扫描所有的Bean,为其添加别名

<typeAliases>
  <package name="domain.blog"/>
</typeAliases>

使用@Alias注解为Java Bean添加别名,如果没有注解,会使用 Bean 的首字母小写的非限定类名来作为它的别名。

@Alias("author")
public class Author {
    ...
}

类型处理器

类型处理器会作为Java类型和JDBC类型的桥梁,对其进行相应转换。
通过实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,可以将Java类型映射到JDBC类型。
例如:

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

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
  <!-- 搭配注解方式自动查找类处理器 -->
  <package name="org.mybatis.example"/>
  <!-- 处理枚举类型 -->
  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>
</typeHandlers>

枚举类型

对于枚举类型,可以使用EnumTypeHandler 或者 EnumOrdinalTypeHandler的handler,EnumTypeHandler处理器可以把Enum值转换成名字,如果我们要用整型值代码,那就把handler设置为EnumOrdinalTypeHandler。

对象工厂

MyBatis创建结果对象时,如果希望它能做一些额外的事情,可以可以通过继承DefaultObjectFactory 类,创建自己的对象工厂。
该类的setProperties 方法可以接受XML配置的参数。
create方法可以用来创建。
然后创建出的ExampleObjectFactory类可以搭配以下设置使用:

<objectFactory type="org.mybatis.example.ExampleObjectFactory">
  <property name="someProperty" value="100"/>
</objectFactory>

插件

可以用插件来对MyBatis的语句执行行为进行拦截修改或监控,可以对以下类的方法进行覆盖重写。带来行为修改的覆盖将可能影响到MyBatis的低层行为,可能带来严重问题。
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
通过@Intercepts注解和继承Interceptor 接口,即可编写类对映射语句进行处理,该类的setProperties 方法可以接受XML配置的参数。

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  private Properties properties = new Properties();
  public Object intercept(Invocation invocation) throws Throwable {
    // implement pre processing if need
    Object returnObject = invocation.proceed();
    // implement post processing if need
    return returnObject;
  }
  public void setProperties(Properties properties) {
    this.properties = properties;
  }
}

然后在xml文件中的

<plugins>
  <plugin interceptor="org.mybatis.example.ExamplePlugin">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>

配置段指定插件类,进行配置拦截。

环境配置

针对开发/测试/生产的不同环境,可以进行不同的配置以供使用。但每个会话工厂实例只能选择一种环境。
在配置environments标签时,应注意:

  • 默认使用的环境 ID(比如:default="development")。
  • 每个 environment 元素定义的环境 ID(比如:id="development")。
  • 事务管理器的配置(比如:type="JDBC")(Spring+MyBatis环境下,Spring模块会使用自带管理器覆盖这个配置)。如果要自定义事务处理器的话,配置和实现TransactionFactory 和TransactionFactory 接口的两个类即可进行事务处理。
  • 数据源的配置(比如:type="POOLED")。这个标签与数据源类型相关,UNPOOLED在每次请求都会建立连接,可以设置数据库链接、驱动及用户名密码还有事务等级等,POOLED会利用连接池进行管理,额外可以设置连接数量(poolMaximumActiveConnections,poolMaximumIdleConnections等)和超时(poolMaximumCheckoutTime等)等参数优化连接。

数据库厂商标识

MyBatis针对不同的厂商可以执行不同的语句,基于映射语句中的databaseId属性,会选择匹配度最高的执行。需按照以下设置,该设置会将其设置为实际数据库版本,为使其变短,可以通过property参数设置别名。

<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

映射器

将对象与数据库对象关联需要配置SQL语句,该映射就被mapper标签设置,其方式如下:

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

mapper文件的编写和动态SQL后文再叙。

posted @ 2020-01-08 11:56  很懒的虫  阅读(247)  评论(0编辑  收藏  举报