33TYyg"/>
其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值。
比如在数据源中使用的例子:
[html]viewplaincopy
这个例子中的username和password将会由properties元素中设置的相应值来替换。
driver和url属性将会由config.properties文件中对应的值来替换。
这样就为配置提供了诸多灵活选择。
属性也可以被传递到SqlSessionBuilder.build()方法中。
例如:
[html]viewplaincopy
SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,props);
//...or...
SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(reader,environment,props);
但是,这也就涉及到了优先级的问题,如果属性不只在一个地方配置,那么mybatis将会按照下面的顺序来加载:
在properties元素体内指定的属性首先被读取。
然后根据properties元素中的resource属性读取类路径下属性文件或根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性。
最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的是properties属性中指定的属性。
settings
setting是指定MyBatis的一些全局配置属性,这是MyBatis中极为重要的调整设置,它们会改变MyBatis的运行时行为,所以我们需要清楚的知道这些属性的作用及默认值。
设置参数描述有效值默认值
cacheEnabled该配置影响的所有映射器中配置的缓存的全局开关true|falsetrue
lazyLoadingEnabled延迟加载的全局开关。
当开启时,所有关联对象都会延迟加载。
特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态true|falsefalse
aggressiveLazyLoading当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载。
true|falsetrue
multipleResultSetsEnabled是否允许单一语句返回多结果集(需要兼容驱动)。
true|falsetrue
useColumnLabel使用列标签代替列名。
不同的驱动在这方面会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。
true|falsetrue
useGeneratedKeys允许JDBC支持自动生成主键,需要驱动兼容。
如果设置为true则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如Derby)。
true|falseFalse
autoMappingBehavior指定MyBatis应如何自动映射列到字段或属性。
NONE表示取消自动映射;PARTIAL只会自动映射没有定义嵌套结果集映射的结果集。
FULL会自动映射任意复杂的结果集(无论是否嵌套)。
NONE,PARTIAL,FULLPARTIAL
defaultExecutorType配置默认的执行器。
SIMPLE就是普通的执行器;REUSE执行器会重用预处理语句(preparedstatements);BATCH执行器将重用语句并执行批量更新。
SIMPLEREUSEBATCHSIMPLE
defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数。
AnypositiveintegerNotSet(null)
defaultFetchSizeSetsthedriverahintastocontrolfetchingsizeforreturnresults.Thisparametervaluecanbeoverridebyaquerysetting.AnypositiveintegerNotSet(null)
safeRowBoundsEnabled允许在嵌套语句中使用分页(RowBounds)。
true|falseFalse
mapUnderscoreToCamelCase是否开启自动驼峰命名规则(camelcase)映射,即从经典数据库列名A_COLUMN到经典Java属性名aColumn的类似映射。
true|falseFalse
localCacheScopeMyBatis利用本地缓存机制(LocalCache)防止循环引用(circularreferences)和加速重复嵌套查询。
默认值为SESSION,这种情况下会缓存一个会话中执行的所有查询。
若设置值为STATEMENT,本地会话仅用在语句执行上,对相同SqlSession的不同调用将不会共享数据。
SESSION|STATEMENTSESSION
jdbcTypeForNull当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。
某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,比如NULL、VARCHAR或OTHER。
JdbcTypeenumeration.Mostcommonare:
NULL,VARCHARandOTHEROTHER
lazyLoadTriggerMethods指定哪个对象的方法触发一次延迟加载。
Amethodnamelistseparatedbycommasequals,clone,hashCode,toString
defaultScriptingLanguage指定动态SQL生成的默认语言。
Atypealiasorfullyqualifiedclassname.org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver
callSettersOnNulls指定当结果集中值为null的时候是否调用映射对象的setter(map对象时为put)方法,这对于有Map.keySet()依赖或null值初始化的时候是有用的。
注意基本类型(int、boolean等)是不能设置成null的。
true|falsefalse
logPrefix指定MyBatis增加到日志名称的前缀。
AnyStringNotset
logImpl指定MyBatis所用日志的具体实现,未指定时将自动查找。
SLF4J|LOG4J|LOG4J2|JDK_LOGGING|COMMONS_LOGGING|STDOUT_LOGGING|NO_LOGGINGNotset
proxyFactory指定Mybatis创建具有延迟加载能力的对象所用到的代理工具。
CGLIB|JAVASSISTJAVASSIST(MyBatis3.3orabove)
一个完整的settings元素示例如下:
[html]viewplaincopy
typeAliases
类型别名是为Java类型设置一个短的名字。
它只和xml配置有关,存在的意义仅在于用来减少类完全限定名的冗余,例如:
[html]viewplaincopy
当这样配置时,Blog可以用在任何使用domain.blog.Blog的地方。
也可以指定一个包名,MyBatis会在包名下搜索需要的JavaBean,比如:
[html]viewplaincopy
每一个在包domain.blog中的JavaBean,在没有注解的情况下,会使用Bean的首字母小写的非限类名来作为它的别名。
比如domain.blog.Author的别名为author;若有注解,则别名为注解值。
看下面的例子:
[html]viewplaincopy
@Alias("author")publicclassAuthor
{
...}
已经为许多常见的Java类型内建了相应的类型别名。
它们都是大小写不敏感的,需要注意的是有基本类型名称重复导致的特殊处理。
别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator
typeHandlers
无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型。
下表描述了一些默认的类型处理器。
类型处理器Java类型JDBC类型
BooleanTypeHandlerjava.lang.Boolean,boolean数据库兼容的BOOLEAN
ByteTypeHandlerjava.lang.Byte,byte数据库兼容的NUMERIC或BYTE
ShortTypeHandlerjava.lang.Short,short数据库兼容的NUMERIC或SHORTINTEGER
IntegerTypeHandlerjava.lang.Integer,int数据库兼容的NUMERIC或INTEGER
LongTypeHandlerjava.lang.Long,long数据库兼容的NUMERIC或LONGINTEGER
FloatTypeHandlerjava.lang.Float,float数据库兼容的NUMERIC或FLOAT
DoubleTypeHandlerjava.lang.Double,double数据库兼容的NUMERIC或DOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal数据库兼容的NUMERIC或DECIMAL
StringTypeHandlerjava.lang.StringCHAR,VARCHAR
ClobTypeHandlerjava.lang.StringCLOB,LONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHAR,NCHAR
NClobTypeHandlerjava.lang.StringNCLOB
ByteArrayTypeHandlerbyte[]数据库兼容的字节流类型
BlobTypeHandlerbyte[]BLOB,LONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER或未指定类型
EnumTypeHandlerEnumerationTypeVARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引)
EnumOrdinalTypeHandlerEnumerationType任何兼容的NUMERIC或DOUBLE类型,存储枚举的索引(而不是名称)。
可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。
具体的做法为:
实现org.apache.ibatis.type.TypeHandler接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,然后可以选择性地将它映射到一个JDBC类型。
比如:
[html]viewplaincopy
//
ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)publicclassExampleTypeHandlerextendsBaseTypeHandler
{
@OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,Stringparameter,JdbcTypejdbcType)throwsSQLException
{ps.setString(i,
parameter)
;
}
@OverridepublicStringgetNullableResult(ResultSetrs,StringcolumnName)throwsSQLException
{return
rs.getString(columnName)
;
}
@OverridepublicStringgetNullableResult(ResultSetrs,intcolumnIndex)throwsSQLException
{return
rs.getString(columnIndex)
;
}
@OverridepublicStringgetNullableResult(CallableStatementcs,intcolumnIndex)throwsSQLException
{return
cs.getString(columnIndex);
}}
并且还需要在配置文件里面加上:
[html]viewplaincopy
--mybatis-config.xml-->
使用这个的类型处理器将会覆盖已经存在的处理Java的String类型属性和VARCHAR参数及结果的类型处理器。
要注意MyBatis不会窥探数据库元信息来决定使用哪种类型,所以必须在参数和结果映射中指明是VARCHAR类型字段,以使其能绑定到正确的类型处理器上。
这是因为,MyBatis直到语句被执行才清楚数据类型。
通过类型处理器的泛型,MyBatis可以得知该类型处理器的Java类型,不过这种行为可以通过两种方法改变:
在类型处理器的元素(typeHandlerelement)上增加一个javaType属性(比如,javaType="String");
在类型处理器的类上(TypeHa