在MyBatis框架的核心配置文件中,
元素是配置文件的根元素,其他元素都要在
元素内配置。 具体元素层次结构如下图所示:
properties元素
是一个配置属性的元素,该元素通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性。例如,数据库的连接等属性,就可以通过典型的Java属性文件中的配置来替换,具体方式如下: 创建一个文件db.properties 把在配置jdbc的地方进行抽离。
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
配置properties元素:
使用:完成上述配置后, dataSource 中连接数据库的 个属性( driver url username password)值将会由 db.properties文件中对应的值来动态替换 这样就为配置提供了诸多灵活的选择
settings元素
元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。 不对setting进行配置也是可以运行MyBatis的。具体配置参数如下表所示:
参数 | 说明 | 有效值 | 默认值 |
---|---|---|---|
cacheEnabled | 该配置影响所有映射器中配置的缓存全局开关 | true、false | false |
lazyLoadingEnabled | 延迟加载的全局开关。开启时,所有关联对象都会延迟加载。特定关联关系中可以通过设置fetchType属性来覆盖该项的开关状态 | true/false | false |
aggressiveLazyLoading | 关联对象属性的延迟加载开关。当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性都会按需加载 | true/false | true |
multipleResultSetsEnable | 是否允许单一语句返回多结果集(需要兼容驱动) | true/false | true |
useColumnLabel | 使用列标签代替列名。不同的驱动在这方面有不同的表现。具体可参考驱动文档或通过测试两种模式来观察所 | true/false | true |
useGeneratedKeys | 用驱动的行为允许JDBC支持自动生成主键,需要驱动兼容。如果设置为true,则这个设置强制使用自动生成主键,尽管一些驱动不兼容但仍可正常工作 | true/false | false |
autoMappingBehavior | 指定MyBatis应如何自动映射列到字段或属性NONE表示取消自动映射: PARTIAL只会自动映射没有定义嵌套结果集映射的结果集; FULL会自动映射任意复杂结果集(无论是否嵌套) | NONE、PARTIAL、FULL | PARTIAL |
defaultExecutorType | 配置默认的执行器。SIMPLE就是普通的执行器: REUSE执行器会重用预处理语句( prepared statements) ;BATCH执行器将重用语句并执行批量更新 | SIMPLE、REUSE、BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数。没有设置的时候,它取的就是驱动默认的时间 | 任何正整数 | 没有设置 |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则( camel case)映射 | true、false | false |
jdbcTypeForNull | 当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,比如NULL、VARCHAR或OTHER | VARCHAR、NULL、OTHER | OTHER |
示例代码如下所示:使用name获取属性,使用value获取值。
<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" />
</settings>
typeAliases元素
元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。
如下代码所示:对一个java类设置别名为user。
其中,
元素的子元素
中的 type属性用于指定需要被定义别名的类的全限定名 alias属性的属性值user就是自定义的别名,它可以代替com.lzq.po.User 使用在MyBatis文件的任何位置,如果省略alias属性, MyBatis会默认将类名首字母小写后的名称作为别名
<typeAliases>
<typeAlias alias="user" type="com.lzq.po.User"/>
</typeAliases>
当POJO类过多时,还可以通过自动扫描包的形式自定义别名,如下代码所示:
其中,
元素的子元素
中的name属性用于指定要被定义别名的包, MyBatis 会将所有com.lzq.po包中的 POJO类以首字母小写的非限定类名来作为它的别名,比如com.lzq.po.User的别名为user或者com.lzq. po.Custom类的别名为customer
<typeAliases>
<package name="com.lzq.po"/>
</typeAliases>
typeHandler元素
typeHandler的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType。
元素可以在配置文件中注册自定义的类型处理器,它的使用方式有两种。
的handler 属性用于指定在程序中自定义的类型处理器类<typeHandlers>
<typeHandler handler="com.itheima.type.CustomtypeHandler" />
</typeHandlers>
的name属性用于指定类型处理器所在的包名,使用此种方式后,系统会在启动时自动地扫描com.lzq.type包下所有的文件,并把它们为类型处理器<typeHandlers>
<package name="com.lzq.type" />
</typeHandlers>
objectFactory元素
MyBatis框架每次创建结果对象的新实例时,都会使用一个对象工厂( ObjectFactory )的实例来完成。MyBatis中默认的ObjectFactory的作用就是实例化目标类,它既可以通过默认构造方法实例化,也可以在参数映射存在的时候通过参数构造方法来实例化。
MyBatis中默认的ObjectFactory的作用是实例化目标类,它既可以通过默认构造方法实例化,也可以在参数映射存在的时候通过参数构造方法来实例化。通常使用默认的ObjectFactory即可。
MyBatis中的objectFactory是由org.apache.ibatis.eflection.factory.DefaultObjectFactory
来提供服务的。大部分场景下都不用配置和修改,但如果想覆盖ObjectFactory的默认行为,则可以通过自定义ObjectFactory来实现,具体方式如下:
首先自定义一个对象工厂,实现objectFactory接口,或者继承DefaultobjectFactory这一个类,在这个类当中已经实现了接口,故直接继承这个类即可:如下代码所示:
public class MyObjectFactory extends DefaultObjectFactory {
private static final long serialVersionUID = -4114845625429965832L;
public <T> T create(Class<T> type) {
return super.create(type);
}
public <T> T create(Class<T> 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);
}
}
随后在配置文件中使用元素配置自定义的ObjectFactory
<objectFactory type="com.itheima.factory.MyObjectFactory">
<property name="name" value="MyObjectFactory"/>
</objectFactory>
plugins元素
MyBatis允许在已映射语句执行过程中的某一点进行拦截调用,这种拦截调用是通过插件来实现的。元素的作用就是配置用户所开发的插件。如果用户想要进行插件开发,必须要先了解其内部运行原理,因为在试图修改或重写已有方法的行为时,很可能会破坏MyBatis原有的核心模块。
environments元素
元素用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过
元素配置多种数据源,即配置多种数据库。
在配置该元素时,及对数据库进行配置:如上文配置properties元素给出的图:
事务管理器的配置
在MyBatis中,可以配置两种类型的事务管理器,分别是JDBC和MANAGED。关于这两个事务管理器的描述如下:
其中,需要注意的是:如果项目中使用的是Spring+ MyBatis,则没有必要在MyBatis中配置事务管理器,因为实际开发中,会使用Spring自带的管理器来实现事务管理。
数据源的配置
对于数据源的配置, MyBatis 框架提供了UNPOOLED、POOLED、JNDI三种数据源类型,
属性 | 说明 |
---|---|
drivere | JDBC驱动的Java类的完全限定名(并不是JDBC驱动中可能包含的数据源类)。 |
url | 数据库的URL地址。 |
username | 登录数据库的用户名。. |
password | 登录数据库的密码 |
defaultTransactionIsolationLevel | 默认的连接事务隔离级别。 |
属性 | 说明 |
---|---|
poolMaximumActiveConnections | 在任意时间可以存在的活动 (也就是正在使用)连接数量,默认值: 10 |
poolMaximumldleConnections | 任意时间可能存在的空闲连接数 |
poolMaximumCheckoutTime | 在被强制返回之前,池中连接被检出(checkedout)时间,默认值:20000毫秒,即20秒 |
poolTimeToWait | 如果获取连接花费的时间较长,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直处于无提示的失败),默认值: 20000毫秒,即20秒 |
poolPingQuery | 发送到数据库的侦测查询,用于检验连接是否处在正常工作秩序中。默认是“NO PINGQUERY SET",这会导致多数数据库驱动失败时带有一定的错误消息 |
poolPingEnabled | 是否启用侦测查询。若开启,必须使用一个可执行的SQL语句设置poolPingQuery属性(最好是一个非常快的SQL),默认值: false |
poolPingConnectionsNotUsedFor | 配置poolPingQuery的使用频度。可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值: 0(表示所有连接每一时刻都被侦测,只有poolPingEnabled的属性值为true时适用) |
属性 | 说明 |
---|---|
initial_ context | 此属性主要用于在InitialContext中寻找上下文(即initialContext.lookup(inital context)) 。该属性为可选属性,在忽略时,data_ source 属性会直接从InitialContext中寻找,此属性表示引用数据源实例位置的上下文的路径。如果提供了initial context 配置,那么程序会 |
data_ source | 在其返回的上下文中进行查找;如果没有提供,则直接在InitialContext中查找 |
mappers元素
元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下。
<mappers>
<mapper resource="com/itheima/mapper/UserMapper.xml"/>
</mappers>
<mappers>
<mapper url="file:///D:/com/lzq/mapper/UserMapper.xml"/>
</mappers>
<mappers>
<mapper class="com.lzq.mapper.UserMapper"/>
</mappers>
<mappers>
<package name="com.lzq.mapper"/>
</mappers>