XML文件中的高层级的结构涉及到以下:
propertiessettingstypeAliasestypeHandlersobjectFactorypluginsenvironmentsenvironmenttransactionManagerdataSourcedatabaseIdProvidermappers这些属性是可以被外部引用或者文件本身里面可以被使用的属性元素 . 这些元素可以在其他文件中被引用.
<properties resource="org/mybatis/example/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>配置文件也可以这样传递到SqlSessionFactoryBuilder.build()
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props); // ... or ... SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);如果某个属性在多个文件中存在 ,那么mybatis按以下顺序读取他们:
property元素中的第一优先级被读取从classpath或者 url中读取的属于第二优先级 , 以及覆盖已经有的属性通过代码的形式加载进去的第三优先级,覆盖已有的属性 所以 , 代码加载的属性是最新的,其次是resource/url , 最后是properties文件. 从3.4.2以后 , 可以设置默认值 <dataSource type="POOLED"> <!-- ... --> <property name="username" value="${username:ut_user}"/> <!-- If 'username' property not present, username become 'ut_user' --> </dataSource>这个特性默认是关闭的, 需要在这个配置文件中加一个property才能开启
<properties resource="org/mybatis/example/config.properties"> <!-- ... --> <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- Enable this feature --> </properties>以下是一些对于MyBatis来说非常重要的值 , 详细列表到这个地址查询: http://www.mybatis.org/mybatis-3/configuration.html
<settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="defaultFetchSize" value="100"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> </settings>就是为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>也可以设置包名 ,这样的话 , MyBatis就知道去哪个位置搜索
<typeAliases> <package name="domain.blog"/> </typeAliases>未完成 , 待看http://www.mybatis.org/mybatis-3/zh/configuration.html
MyBatis每次创建新的对象实例的时候 , 都会调用一个对象工厂. 默认的对象工厂的功能就是实例化一个类, 要么通过默认的构造方法. 要么在参数映射存在的情况下, 通过参数构造方法来实例化. 如果需要覆盖默认的构造方法. 我们可以提供自己的构造方法.
// ExampleObjectFactory.java public class ExampleObjectFactory extends DefaultObjectFactory { public Object create(Class type) { return super.create(type); } public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) { return super.create(type, constructorArgTypes, constructorArgs); } public void setProperties(Properties properties) { super.setProperties(properties); } public <T> boolean isCollection(Class<T> type) { return Collection.class.isAssignableFrom(type); }} <!-- mybatis-config.xml --> <objectFactory type="org.mybatis.example.ExampleObjectFactory"> <property name="someProperty" value="100"/> </objectFactory>MyBatis允许我们在映射语句的某个节点对执行过程进行拦截.一下是可以拦截的列表:
Executor (update,query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSets, handleOutputParameters)StatementHandler (prepare, parameterize, batch, update, query) 这几个类的方法的实现可以参照源码. 如果需要更深入的调用的时候 , 需要谨慎 . 不然容易破坏底层的一些MyBatis的特性. 插件的定义非常简单, 只需要实现Interceptor接口,并指定用来拦截的方法即可. // ExamplePlugin.java @Intercepts({@Signature( type= Executor.class, method = "update", args = {MappedStatement.class,Object.class})}) public class ExamplePlugin implements Interceptor { public Object intercept(Invocation invocation) throws Throwable { return invocation.proceed(); } public Object plugin(Object target) { return Plugin.wrap(target, this); } public void setProperties(Properties properties) { } } <!-- mybatis-config.xml --> <plugins> <plugin interceptor="org.mybatis.example.ExamplePlugin"> <property name="someProperty" value="100"/> </plugin> </plugins>注意: 除了用插件来修改 MyBatis 核心行为之外,还可以通过完全覆盖配置类来达到目的。只需继承后覆盖其中的每个方法,再把它传递到 SqlSessionFactoryBuilder.build(myConfig) 方法即可。再次重申,这可能会严重影响 MyBatis 的行为,务请慎之又慎
MyBatis可以配置成适应多种环境 , 但是: 尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。即, 每个数据库需要对应一个SqlSessionFactory实例. 使用参数指定创建的环境:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment,properties);如果忽略了环境参数,默认环境会被加载:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader,properties);environment元素定义了如何配置环境:
<environments default="development"> <environment id="development"> <transactionManager type="[JDBC|MANAGED]"> <property name="..." value="..."/> </transactionManager> <dataSource type="[UNPOOLED|POOLED|JNDI]"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>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> <!-- 将这个包中的所有interface注册为mapper --> <mappers> <package name="org.mybatis.builder"/> </mappers>