zoukankan      html  css  js  c++  java
  • 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后文再叙。

  • 相关阅读:
    Hibernate配置
    Log4j 局部笔记
    有关接口 笔记 懒人版
    JAVA面向对象编程这本书的摘录~!(2016-5-23)
    关于关闭数据流
    安卓桌面开发小应用
    ACM Sdut 2158 Hello World!(数学题,排序) (山东省ACM第一届省赛C题)
    hdu 1573 A/B (扩展欧几里得)
    hdu 1788 Chinese remainder theorem again(最小公倍数)
    ACM hdu 1019 Least Common Multiple
  • 原文地址:https://www.cnblogs.com/CoveredWithDust/p/MyBatis_XML.html
Copyright © 2011-2022 走看看