SSM项目从零开始到入门011-详解mybatis的XML 映射配置文件

来源:互联网 发布:什么才叫做数据库 编辑:程序博客网 时间:2024/04/29 15:21
详解mybatis的XML 映射配置文件

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

文档的顶层结构如下:顺序不可以打乱

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

1.properties 属性


xml文件中的属性值都是可外部配置且可动态替换的,即用 ${ xxx }

例子:在上节工程中resource下创建jdbc.properties文件


jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8

到mybatis-config.xml文件中引入jdbc.properties并配置
<?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 resource="jdbc.properties">  <property name="username" value="root"/> <!-- 添加属性 -->  <property name="password" value="root"/>  </properties>  <!-- 配置环境 -->  <environments default="development">    <!-- 环境变量 -->    <environment id="development">      <!-- 事务管理器  -->      <transactionManager type="JDBC"/>      <!-- 数据源 -->      <dataSource type="POOLED">        <property name="driver" value="${jdbc.driverClassName}"/>        <property name="url" value="${jdbc.url}"/>        <property name="username" value="${username}"/>        <property name="password" value="${password}"/>      </dataSource>    </environment>  </environments>    <!-- mappers映射器 -->  <mappers>      <mapper resource="mapper/UserMapper.xml"/> <!-- 默认为classpath目录-->  </mappers></configuration>
这个例子中的 username 和 password 将会由 properties 元素中设置的相应值来替换。
driver 和 url 属性将会由 jdbc.properties 文件中对应的值来替换。这样就为配置提供了诸多灵活选择。


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


在 properties 元素体内指定的属性首先被读取。
然后会读取从类路径下资源或 properties 元素中的 url 属性(url attributes)中加载的属性,它会覆盖已读取的同名属性。
最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

因此,通过方法参数传递的属性具有最高优先级,资源文件及 url 属性配置的次之,最低优先级的是 properties 属性中指定的属性。


2.settings

调整 settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。



一个配置完整的 settings 元素的示例如下:
  <!-- 设置  -->  <settings>    <!-- 该配置影响的所有映射器中配置的缓存的全局开关。 默认true -->  <setting name="cacheEnabled" value="true"/>  <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 默认false -->  <setting name="lazyLoadingEnabled" value="true"/>  <!-- 是否允许单一语句返回多结果集(需要兼容驱动)。 默认true -->  <setting name="multipleResultSetsEnabled" value="true"/>  <!-- 使用列标签代替列名。  value="true"-->  <setting name="useColumnLabel" value="true"/>  <!-- 允许 JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true 则这个设置强制使用自动生成主键  默认false -->  <setting name="useGeneratedKeys" value="false"/>  <!-- 指定 MyBatis 是否以及如何自动映射指定的列到字段或属性。 默认PARTIAL -->  <setting name="autoMappingBehavior" value="PARTIAL"/>  <!-- 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新。 -->  <setting name="defaultExecutorType" value="SIMPLE"/>  <!-- 设置超时时间,它决定驱动等待数据库响应的秒数。 -->  <setting name="defaultStatementTimeout" value="25"/>  <!-- 允许在嵌套语句中使用行分界(RowBounds)。  默认false -->  <setting name="safeRowBoundsEnabled" value="false"/>  <!-- 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射   默认false -->  <setting name="mapUnderscoreToCamelCase" value="false"/>  <!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。        默认值为 SESSION,此会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 -->  <setting name="localCacheScope" value="SESSION"/>  <!-- 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型  -->  <setting name="jdbcTypeForNull" value="OTHER"/>  <!-- 指定哪个对象的方法触发一次延迟加载 -->  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>  </settings>

3.typeAliases


类型别名是为 Java 类型命名的一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

<typeAliases>  <typeAlias alias="Author" type="domain.blog.Author"/>  <typeAlias alias="Blog" type="domain.blog.Blog"/>  <typeAlias alias="Comment" type="domain.blog.Comment"/>  <typeAlias alias="Post" type="domain.blog.Post"/>  <typeAlias alias="Section" type="domain.blog.Section"/>  <typeAlias alias="Tag" type="domain.blog.Tag"/></typeAliases>

使用这个配置,“Blog”可以用在任何使用“domain.blog.Blog”的地方。

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

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

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。

比如 domain.blog.Author 的别名为 Author;若有注解,则别名为其注解值。

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

已经为普通的 Java 类型内建了许多相应的类型别名。它们都是大小写不敏感的,需要注意的是由于重载原始类型的名称所做的特殊处理。

别名       映射的类型_byte       byte_long       long_short       short_int       int_integerint_double       double_float       float_boolean       booleanstring       Stringbyte       Bytelong       Longshort       Shortint       Integerinteger       Integerdouble       Doublefloat       Floatboolean       Booleandate       Datedecimal  BigDecimalbigdecimalBigDecimalobject       Objectmap       Maphashmap       HashMaplist       ListarraylistArrayListcollectionCollectioniteratorIterator

4.typeHandlers

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

下面描述了一些默认的类型处理器。

类型处理器                          Java 类型                                     JDBC 类型BooleanTypeHandler                  java.lang.Boolean, boolean                    任何兼容的布尔值ByteTypeHandler                          java.lang.Byte, byte                            任何兼容的数字或字节类型ShortTypeHandler                  java.lang.Short, short                    任何兼容的数字或短整型IntegerTypeHandler                  java.lang.Integer, int                    任何兼容的数字和整型LongTypeHandler                          java.lang.Long, long                            任何兼容的数字或长整型FloatTypeHandler                  java.lang.Float, float                    任何兼容的数字或单精度浮点型DoubleTypeHandler                  java.lang.Double, double                    任何兼容的数字或双精度浮点型BigDecimalTypeHandler                  java.math.BigDecimal                       任何兼容的数字或十进制小数类型StringTypeHandler                  java.lang.String                            CHAR 和 VARCHAR 类型ClobTypeHandler                          java.lang.String                            CLOB 和 LONGVARCHAR 类型NStringTypeHandler                  java.lang.String                            NVARCHAR 和 NCHAR 类型NClobTypeHandler                  java.lang.String                            NCLOB 类型ByteArrayTypeHandler                  byte[]                                    任何兼容的字节流类型BlobTypeHandler                       byte[]                                    BLOB 和 LONGVARBINARY 类型DateTypeHandler                          java.util.Date                            TIMESTAMP 类型DateOnlyTypeHandler                  java.util.Date                            DATE 类型TimeOnlyTypeHandler                  java.util.Date                            TIME 类型SqlTimestampTypeHandler                  java.sql.Timestamp                            TIMESTAMP 类型SqlDateTypeHandler                  java.sql.Date                                DATE 类型SqlTimeTypeHandler                  java.sql.Time                                    TIME 类型ObjectTypeHandler                  Any                                            其他或未指定类型EnumTypeHandler                   Enumeration Type                            VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)EnumOrdinalTypeHandler                  Enumeration Type                     任何兼容的 NUMERIC 或 DOUBLE 类型,作为位置存储(而不是代码本身)。
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口,或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler,然后可以将它映射到一个 JDBC 类型。








阅读全文
0 0
原创粉丝点击