您的位置:首页 > 其它

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

2017-12-18 19:02 861 查看
详解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.Driver
jdbc.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
_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

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 类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: