初次学习mybatis的时候,配置文件的节点挺多的,都不知道什么意思,能不能换其他的属性值,他们的优点在哪儿?他们在什么情况下使用?它们各自的区别?带着这些个问题于是我就写了这篇博客。有什么不对或错误的地方,请大家不遗余力的指正,谢谢。
1.事务管理机制
1.在ibatis的配置文件中dataSource节点有这么个配置<datasource type=”SIMPlE”></datasource>,根据原文下的解释知道其中type有SIMPLE、DBCP、JNDI三种。我想问下这三种类型的区别在于哪里,在什么情况下用到,常用的是哪个,及它们各自的优点。
看情况,simple用于测试,dbcp是采用dbcp做数据源,jndi是使用app server提供的数据源。一般来说,在实际应用中jndi用的比较多,simple用于测试。不过,多说一句,datasource一般都是在spring中集成或管理,所以和spring集成时,很少使用ibatis的dataSource节点。
2.<transactionManager type=”JDBC”></transactionManager>这个配置中type也有JDBC、JTA、EXTERNAL。我想问下基于JDBC,及JTA的事务可以应用到哪种程度,而对EXTERNAL在什么情况下会用到?
JDBC:使用数据库自己的事务(局部事务),connect.beginTranstion(),connect.commit()等
JTA:使用jta事务管理器管理事务(全局事务),使用userTranstion对象。
External:自己(Ibatis)不控制事务,事物都是spring托管的,如果不是,那就用JDBC,如果在app server中,你又不想使用容器托管事务,那就用JTA。
3.在开发指南中提到”ibatis”的缓存机制使用必须特别谨慎,我想问下,ibatis中cache用到的地方大不大,如果不用会出现那些不好的情况,因为我知道hibernate中的缓存机制是他的一个亮点,那ibatis中又是怎么样呢?
基本上用处不大(可能会有很多人和我的观点不同)
Ibatis是sql拼装器,强调的是直接与数据库打交道,sql的质量决定了最好的效率,再说数据库本身提供的cache。类型many to one,many to many,one to one的hibernate的产物,可以直接做成视图,在使用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>
这些都是外部化的,可替代的属性。其中的属性就可以再整个配置文件中使用,使用可替换的属性来实现动态配置,如下
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>
如果这些地方属性多余一个,没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>
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>
别名是为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>
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>
插件可以改变某些类的执行, 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)
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>
详解结束,mybatis中配置的节点其实就是挺多的,不是很麻烦,就是多。