属性(properties)
<properties resource="/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
说明
1.
d
r
i
v
e
r
值
从
p
r
o
p
e
r
t
i
e
s
标
签
中
的
r
e
s
o
u
r
c
e
指
定
资
源
中
找
2.
{driver}值从properties标签中的resource指定资源中找 2.
driver值从properties标签中的resource指定资源中找2.{username}在中找因为定义了它
注意:加载顺序
•在 properties 元素体内指定的属性首先被读取。
•然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
•最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
使用占位符指定一个默认值,,,,这个特性是关闭的
<dataSource type="POOLED">
<!-- ... -->
<property name="username" value="${username:ut_user}"/> <!-- 如果属性 'username' 没有被配置,'username' 属性的值将为 'ut_user' -->
</dataSource>
开启占位符指定一个默认值和启用默认值的分隔符
<properties resource="org/mybatis/example/config.properties">
<!-- ... -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 -->
<property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- 修改默认值的分隔符 -->
</properties>
开启他们两就可以动态切换参数值。。。比如使用三元运算符
<dataSource type="POOLED">
<!-- ... -->
<property name="username" value="${db:username?:ut_user}"/>
</dataSource>
设置(settings)
<settings>
//全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存。默认值true
<setting name="cacheEnabled" value="true"/>
//延迟加载的全局开关。当开启时,所有关联对象都会延迟加载默认值false
<setting name="lazyLoadingEnabled" value="true"/>
//是否允许单一语句返回多结果集(需要驱动支持)。
<setting name="multipleResultSetsEnabled" value="true"/>
//使用列标签代替列名。
<setting name="useColumnLabel" value="true"/>
//允许 JDBC 支持自动生成主键,需要驱动支持。如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能 支持但仍可正常工作(比如 Derby)。
<setting name="useGeneratedKeys" value="false"/>
//指定 MyBatis 应如何自动映射列到字段或属性。
<setting name="autoMappingBehavior" value="PARTIAL"/>
//指定发现自动映射目标未知列(或者未知属性类型)的行为。
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
///配置默认的执行器。SIMPLE 就是普通的执行器
<setting name="defaultExecutorType" value="SIMPLE"/>
//设置超时时间,它决定驱动等待数据库响应的秒数。
<setting name="defaultStatementTimeout" value="25"/>
//为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。
<setting name="defaultFetchSize" value="100"/>
//允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为 false。
<setting name="safeRowBoundsEnabled" value="false"/>
//是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。
<setting name="mapUnderscoreToCamelCase" value="false"/>
//MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。
<setting name="localCacheScope" value="SESSION"/>
//当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。
<setting name="jdbcTypeForNull" value="OTHER"/>
//指定哪个对象的方法触发一次延迟加载。
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
类型别名(typeAliases)
<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
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。见下面的例子:
@Alias("author")
public class Author {
...
}
插件(plugins)
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
• Executor(update, query, flushStatements, commit, rollback,getTransaction, close,isClosed)
•ParameterHandler(getParameterObject, setParameters)
•ResultSetHandler(handleResultSets, handleOutputParameters)
•StatementHandler(prepare, parameterize, batch, update, query)
这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。因为如果在试图修改或重写已有方法的行为的时候,你很可能在破坏 MyBatis 的核心模块。这些都是更低层的类和方法,所以使用插件的时候要特别当心。
通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。
// 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;
}
}
配置文件
<!-- mybatis-config.xml -->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
上面的插件将会拦截在 Executor 实例中所有的 “update” 方法调用,这里的 Executor 是负责执行低层映射语句的内部对象。
思考一下:method = "update"是否可以是多个参数??????
映射器(mappers)
<!-- 使用相对于类路径的资源引用 -->
<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>
这些配置会告诉了 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了