mybatis配置文件详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis配置文件详解相关的知识,希望对你有一定的参考价值。

初次学习mybatis的时候,配置文件的节点挺多的,都不知道什么意思,能不能换其他的属性值,他们的优点在哪儿?他们在什么情况下使用?它们各自的区别?带着这些个问题于是我就写了这篇博客。有什么不对或错误的地方,请大家不遗余力的指正,谢谢。

1.事务管理机制

1.ibatis的配置文件中dataSource节点有这么个配置<datasource type=”SIMPlE”></datasource>,根据原文下的解释知道其中typeSIMPLEDBCPJNDI三种。我想问下这三种类型的区别在于哪里,在什么情况下用到,常用的是哪个,及它们各自的优点。

 

看情况,simple用于测试dbcp是采用dbcp做数据源jndi是使用app server提供的数据源。一般来说,在实际应用中jndi用的比较多simple用于测试。不过,多说一句,datasource一般都是在spring集成或管理,所以和spring集成时,很少使用ibatisdataSource节点

 

2.<transactionManager type=”JDBC”></transactionManager>这个配置中type也有JDBCJTAEXTERNAL。我想问下基于JDBC,及JTA的事务可以应用到哪种程度,而对EXTERNAL在什么情况下会用到?

 

JDBC:使用数据库自己的事务(局部事务)connect.beginTranstion()connect.commit()

JTA:使用jta事务管理器管理事务(全局事务),使用userTranstion对象

External:自己(Ibatis)不控制事务,事物都是spring托管的,如果不是,那就用JDBC,如果在app server中,你又不想使用容器托管事务,那就用JTA

 

3.在开发指南中提到”ibatis”的缓存机制使用必须特别谨慎,我想问下,ibatiscache用到的地方大不大,如果不用会出现那些不好的情况,因为我知道hibernate中的缓存机制是他的一个亮点,那ibatis中又是怎么样呢?

 

基本上用处不大(可能会有很多人和我的观点不同)

Ibatissql拼装器强调的是直接与数据库打交道sql的质量决定了最好的效率,再说数据库本身提供的cache类型many to onemany to manyone to onehibernate的产物,可以直接做成视图,在使用ibatis去查询,这样可以充分的使用db自己的cache

 

 

</ dataSource >

    </ transactionManager >

    < sqlMap  resource ="com/wyq/map/userMap.xml" />

 </ sqlMapConfig >

 

JNDI配置大部分都在应用服务器中进行,所以在ibatis中的配置相对简单

(1)JDBC事务控制JNDI配置

< transctionManager  type ="JDBC" >

          < dataSource  type ="JNDI" >

              < property  name ="DataSource"  value ="java:comp/env/jdbc/myDataSource" />

          </ dataSource >

      </ transctionManager >

 

(2)JTA事务控制JNDI配置

< transctionManager  type ="JTA" >

          < property  name ="UserTransaction"  value ="java:/ctx/con/UserTransaction" />

          < dataSource  type ="JNDI" >

              < property  name ="DataSource"  value ="java:comp/env/jdbc/myDataSource" />

          </ dataSource >

      </ transctionManager >

 

2.dataSource 元素使用基本的 JDBC 数据源接口来配置 JDBC 连接对象的资源。三种数据源类型  type=???

 

*许多MyBatis的应用程序将会按示列中的例子来配置数据源。然而它并不是必须的。要知道为了方便使用延迟加载,数据源才是必须的。

 

2.1UNPOOLED-这个数据源的实现是每次被请求简单打开关闭连接。它有一点慢,这是对简单应用程序的一个很好的选择,因为他不需要及时可用连接。不同的数据库对这个的表现也是不一样的,所以对某些数据库来上配置数据源并不重要,这个配置也是闲置的。UNPOOLED类型的数据源仅仅用来配置一下五种属性

 

2.1.1*driver-这是JDBC驱动的java类的完全限定名(如果你的驱动包包含,他也不是数据源类)

 

2.1.2*url-这是数据库的JDBC URL地址

 

2.1.3*username-登录数据库的用户名

 

2.1.4*password-登录数据库的密码

 

2.1.5*defaultTransactionIsolationLevel-默认的连接事务隔离级别

 

*作为可选项,你可以传递数据库驱动的属性。要这样做,属性的前缀是以”driver.”开头的,列如:

 *driver.encoding=UTF-8

这样就会传递以值”UTF-8”来传递属性”encoding”,它是通过DriverManager.getConnection(url,driverProperties)方法传递给数据库驱动。

 

 

2.2POOLED-这是JDBC连接对象数据源连接池实现,用来避免创建新的连接实例时必要的初始连接认证时间。这是一种当前web应用程序用来快速响应请求流行的方法。

除了上述(UNPOOLED)的属性之外,还有很多属性可以用来配置POOLED数据源

 

2.2.1*poolMaximumActiveConnections-在任意时间存在的活动(也就是正在使用)连接的数量。默认值:10

2.2.2*poolMaximumIdleConnections-任意时间存在的空闲连接数

2.2.3*poolMaximumCheckoutTime-在被强制返回之前,池中连接被检查的时间。默认值:20000毫秒(也就是20秒)

2.2.4*poolTimeToWait-这是给连接池一个打印日志状态机会的低层次设置,还有重新尝试获得连接,这些情况下往往需要很长时间。(为了避免连接池没有配置时静默失败)。默认值:20000毫秒(也就是20秒)

2.2.5*poolPingQuery-发送到数据的侦测查询,用来验证连接是否正常工作,并且准备接收请求。默认是”NO PING NO QUERY SET”,这会引发许多数据库驱动连接有一个错误信息而导致失败。

2.2.6*poolPingEnabled-这是开启或禁止侦测查询。如果开启,你必须用一个合法的SQL语句(最好是很快速的)设置poolPingQuery属性。默认值:false。

2.2.7*poolPingConnectionsNotUsedFor-这是用来配置poolPingQuery多次时间被用一次。这可以被设置匹配标准的数据库连接超时时间,来避免不必要的侦测。默认值:0(也就是所有连接每一时刻都被侦测-但仅仅当poolPingEnabled为true时适用)。

 

2.3JNDI-这个数据源的实现是为了使用如Spring这类的容器容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。这个数据源配置只需要两个属性:

 

2.3.1*initial_context-这个属性用来从初始上下文中寻找环境(也就是initial Context.lookup(initial--context)。这是个可选属性,如果被忽略,那么data_source属性将会直接以initialCotext为背景再次寻找)。

2.3.2*data_source-这是引用数据源实例位置的上下文的路径。它会以由initial_context查询返回的环境为背景来查找,如果initial_Context没有返回结果时,直接初始上下文环境来查找。

和其他数据源配置相似,他也可以通过名为”env.”的前缀直接向上下文发送属性。比如:

 

*env.encoding=UTF-8

在初始化之后,这就会以值”UTF-8”向初始上下文的构造方法传递名”encoding”的属性。

 

3.configuration配置详解

 3.1configuration有什么作用?

configuration管理MyBatis的配置MyBatis所有配置信息都存放的在configuration中。

 

下面我们看看configuration可配置的属性有哪些:

3.1.1*properties属性

实例:

 

技术分享
1   <properties resource="org/mybatis/example/config.properties">   
2 <property name="username" value="dev_user"/>   
3 <property name="password" value="F2Fa3!33TYyg"/>   
4 </properties>
View Code

 

这些都是外部化的,可替代的属性。其中的属性就可以再整个配置文件中使用,使用可替换的属性来实现动态配置,如下

技术分享
1 <dataSource type="POOLED">   
2 <property name="driver" value="${driver}"/>   
3 <property name="url" value="${url}"/>   
4 <property name="username" value="${username}"/>   
5 <property name="password" value="${password}"/>   
6 </dataSource>   
View Code

 

如果这些地方属性多余一个,没MyBatis按照下面的顺序加载: 

properties元素体内指定的属性首先被读取。

从类路径下资源或者properties元素的eurl属性中加载的属性第二被读取,它会覆盖已经存在的完全一样的属性。

作为方法参数船传递的属性最后被读取,他会覆盖任一已存在的完全一样的属性。

 

3.1.2 *setings

这些是非常重要的属性,他会修改MyBatis运行时的行为方式。如果不熟悉配置建议使用默认配置

实例:

技术分享
 1 <settings>   
 2 <setting name="cacheEnabled" value="true"/>   
 3 <setting name="lazyLoadingEnabled" value="true"/>   
 4 <setting name="multipleResultSetsEnabled" value="true"/>   
 5 <setting name="useColumnLabel" value="true"/>   
 6 <setting name="useGeneratedKeys" value="false"/>   
 7 <setting name="enhancementEnabled" value="false"/>   
 8 <setting name="defaultExecutorType" value="SIMPLE"/>   
 9 <setting name="defaultStatementTimeout" value="25000"/>   
10 </settings> 
11  
12 <settings>
13 <setting name="cacheEnabled" value="true"/>
14 <setting name="lazyLoadingEnabled" value="true"/>
15 <setting name="multipleResultSetsEnabled" value="true"/>
16 <setting name="useColumnLabel" value="true"/>
17 <setting name="useGeneratedKeys" value="false"/>
18 <setting name="enhancementEnabled" value="false"/>
19 <setting name="defaultExecutorType" value="SIMPLE"/>
20 <setting name="defaultStatementTimeout" value="25000"/>
21 </settings>
View Code

 

 

3.1.2.1参数表格: 

设置参数

描述

有效值

默认值

cacheEnabled

这个配置使全局的映射器启用或禁用缓存。

 

True| false

True

lazyLoadingEnabled

 

全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。

 

True| false

True

aggressiveLazyLoading

 

当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。

True| false

True

multipleResultSetsEnabled

 

允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)。

 

True|false

True

useColumnLabel

使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动。

True|false

True

useGeneratedKeys

允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby)。

True|false

True

autoMappingBehavior

指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况)

NONE,

PARTIAL,

FULL

 

PARTIAL

 

 

这些都是外部化的,可替代的属性。其中的属性就可以再整个配置文件中使用,使用可替换的属性来实现动态配置,如下

3.1.3typeAliases类型命名

实例:

技术分享
1   <typeAliases>   
2 <typeAlias alias="Author" type="domain.blog.Author"/>   
3 <typeAlias alias="Blog" type="domain.blog.Blog"/>   
4 <typeAlias alias="Comment" type="domain.blog.Comment"/>   
5 <typeAlias alias="Post" type="domain.blog.Post"/>   
6 <typeAlias alias="Section" type="domain.blog.Section"/>   
7 <typeAlias alias="Tag" type="domain.blog.Tag"/>   
8 </typeAliases> 
View Code

 

别名是为Java类型命名一个短的名字。它只用在XML配置文件里,用来减少类完全限定名的多余部分。例如在配置文件里需要使用domain.blog.Author的地方可以简单的使用Author替换。

对于普通的java类型,有很多的内建的别名。(大小写不敏感),如下

 

别名

映射类型

_byte

Byte

_long

Long

_int

Int

_integer

Integer

_double

Double

_float

Float

_boolean

Boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigDecimal

BigDecimal

object

Object

map

Map

hashmap

HashMap

list

List

arraylist

ArrayList

collection

Collection

iterator

Iterator

 

 

3.1.4typeHandlers类型处理器

实例:

技术分享
1 <typeHandlers>   
2 <typeHandler javaType="String" jdbcType="VARCHAR" handler="org.mybatis.example.ExampleTypeHandler"/>   
3 </typeHandlers>  
View Code

 

 

3.1.5plugins插件

实例:

技术分享
 1 <plugins>   
 2 <plugin interceptor="org.mybatis.example.ExamplePlugin">   
 3 <property name="someProperty" value="100"/>   
 4 </plugin>   
 5 </plugins>  
 6 <plugins>
 7 <plugin interceptor="org.mybatis.example.ExamplePlugin">
 8 <property name="someProperty" value="100"/>
 9 </plugin>
10 </plugins>
View Code

 

插件可以改变某些类的执行, MyBatis允许被插件来拦截的类有: 

技术分享
1 Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)   
2 ParameterHandler (getParameterObject, setParameters)   
3 ResultSetHandler (handleResultSets, handleOutputParameters)   
4 StatementHandler (prepare, parameterize, batch, update, query)  
5 Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
6 ParameterHandler (getParameterObject, setParameters)
7 ResultSetHandler (handleResultSets, handleOutputParameters)
8 StatementHandler (prepare, parameterize, batch, update, query)
View Code

 

 

3.1.6environments环境

environments里可以配置多个environment,每个environment对应一个数据库环境。一个完整的定义如下:

技术分享
 1 <environments default="development">   
 2 <environment id="development">   
 3 <transactionManager type="JDBC">   
 4 </transactionManager>   
 5 <dataSource type="POOLED">   
 6 <property name="driver" value="${driver}"/>   
 7 <property name="url" value="${url}"/>   
 8 <property name="username" value="${username}"/>   
 9 <property name="password" value="${password}"/>   
10 </dataSource>   
11 </environment>   
12 </environments>  
View Code

详解结束,mybatis中配置的节点其实就是挺多的,不是很麻烦,就是多。

以上是关于mybatis配置文件详解的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis配置文件详解

MyBatis Generator配置文件详解示例

mybatis各阶段的详解

MyBatis之Mapper XML 文件详解-sql和入参

MyBatis—02—代替Dao层的mapper映射文件;MyBatis配置文件详解

mybatis 代码生成器(IDEA, Maven)及配置详解(部分配置你应该不知道)