Mybatis配置结构
MyBatis文件API 地址
http://www.mybatis.org/mybatis-3/zh/configuration.html
MyBatis 配置文件包含设置和属性用来决定这MyBatis的行为,其中,在MyBatis中,配置的目录结构如下,其中存在的个数只能是一个或者没有 :
一个大致的Mybatis配置文件:
<?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>
<!-- 单个 别名的设置 别名的设置是为了方便在单个xml中进行引用 -->
<typeAliases>
<typeAlias type="com.wf.model.User" alias="user"/>
</typeAliases>
<!-- 包别名的配置,在引用的时候,是根据包中的类名引用,可以大小写 ,包别名的设置可以代替单个别名的设置-->
<typeAliases>
<package name="com.wf.model"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED" >
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 通过resource加载单个文件,没有利用代理 -->
<mappers>
<mapper resource="sqlMapper/user.xml"/>
<mapper resource="sqlMapper/student.xml"/>
</mappers>
<!-- 通过class加载单个配置文件,使用了代理 -->
<mappers>
<mapper class="com.wf.dao.UserDaoMapper"/>
</mappers>
<!-- 通过package 加载包,前提是利用了代理,利用了代理的好处是不用谢dao实现,持久层是ibatis处理的 -->
<mappers>
<package name="com.wf.dao"/>
</mappers>
</configuration>
properties属性
properties 属性都是用来引入外部可配置且可动态替换的文件既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。我们一般利用这个属性用来加载我们的数据库数据源文件,一般情况下,我们都将我们的数据库配置在一个单独的文件中,然后我们利用这个属性来进行文件的引入,方便对参数进行统一管理,其它xml可以引用该db.properties。
properties特性:
注意: MyBatis 将按照下面的顺序来加载属性:
在 properties 元素体内定义的属性首先被读取。
然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。
建议:
不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。
在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX
settings属性
MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为,比如:开启二级缓存、开启延迟加载等等。(建议去myBatis开发手册中查询)
一个配置完整的 settings 元素的示例如下:
<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>
typeAliases属性
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。有两种表现形式:
<typeAliases>
<typeAlias type="com.wf.model.User" alias="user"/>
</typeAliases>
<typeAliases>
<package name="com.wf.model"/>
</typeAliases>
单个 别名的设置 : 别名的设置是为了方便在单个mapper的 xml中进行引用 。
包别名的配置: 在引用的时候,是根据使用 Bean 的首字母小写或者大写的非限定类名来作为它的别名引用,建议小写,包别名的设置可以代替单个别名的设置。 比如 com.wf.model.User 的别名为 user
typeHandlers属性
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
mybatis中通过typeHandlers完成jdbc类型和java类型的转换。
通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义。
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型。
对象工厂(objectFactory)属性
MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。
配置环境(environments)属性
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者共享相同 Schema 的多个生产数据库, 想使用相同的 SQL 映射。许多类似的用例。
不过要记住:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:每个数据库对应一个 SqlSessionFactory 实例
映射器(mappers)属性
用来定义 SQL 映射语句了。既是我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等,这些配置会告诉了 MyBatis 去哪里找映射文件。
<!-- 通过resource加载单个文件,没有利用代理 -->
<mappers>
<mapper resource="sqlMapper/user.xml"/>
<mapper resource="sqlMapper/student.xml"/>
</mappers>
<!-- 通过class加载单个配置文件,使用了代理 -->
<mappers>
<mapper class="com.wf.dao.UserDaoMapper"/>
</mappers>
<!-- 通过package 加载包,前提是利用了代理,利用了代理的好处是不用写dao实现,持久层是ibatis处理的 -->
<mappers>
<package name="com.wf.dao"/>
</mappers>