MyBatis使用心得(二)--- 配置文件详解

 MyBatis的XML配置包含了影响MyBatis行为甚深的设置和属性信息。官方XML文档结构如下:

  • configuration
    • properties(属性)
    • settings(配置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境集合属性对象)
      • environment(环境子属性对象)
        • transactionManager(事务管理)
        • dataSource(数据源)
    • databaseIdProvider(数据库ID提供者)
    • mappers(映射器)


Properties
(属性)

这些是外部化的, 可替代的属性, 这些属性也可以配置在典型的 Java 属性配置文件中, 或者通过 properties 元素的子元素来传递。例如:

<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>

这个例子中的 usernamepassword 将会由 properties 元素中设置的值来替换。driver url 属性将会从包含进来的 config.properties 文件中的值来替换。这里提供很多配置的选项。
属性也可以被传递到 SqlSessionBuilder.build()方法中。例如:

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);

如果在这些地方,属性多于一个的话,MyBatis 按照如下的顺序加载它们:

  • 在 properties 元素体内指定的属性首先被读取。
  • 从类路径下资源或 properties 元素的 url 属性中加载的属性第二被读取,它会 覆盖已经存在的完全一样的属性。
  • 作为方法参数传递的属性最后被读取, 它也会覆盖任一已经存在的完全一样的 属性,这些属性可能是从 properties 元素体内和资源/url 属性中加载的。

因此, 最高优先级的属性是那些作为方法参数的, 然后是资源/url 属性, 最后是 properties 元素中指定的属性。


Settings(设置)

这些是极其重要的调整, 它们会修改 MyBatis 在运行时的行为方式。 下面这个表格描述 了设置信息,它们的含义和默认值。

设置参数

描述

    有效值

默认值

cacheEnabled

全局范围内启用或禁用缓存配置任何 映射器在此配置下。

    true | false

true

lazyLoadingEnabled

在全范围内启用或禁用延迟加载。禁用时,所有协会将热加载。

    true | false

true

aggressiveLazyLoading

启用时,有延迟加载属性的对象将被完全加载后调用懒惰的任何属性。否则,每一个属性是按需加载。

    true | false

true

multipleResultSetsEnabled

允许或不允许从一个单独的语句(需要兼容的驱动程序)要返回多个结果

    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执行器重用准备好的语句。 BATCH执行器重用语句和批处理更新。

    SIMPLE REUSE BATCH

SIMPLE

defaultStatementTimeout

设置驱动程序等待一个数据库响应的秒数。

    Any positive integer

Not Set (null)

safeRowBoundsEnabled

允许使用嵌套的语句RowBounds

    true | false

false

mapUnderscoreToCamelCase

从经典的数据库列名A_COLUMN启用自动映射到骆驼标识的经典的Java属性名aColumn

    true | false

false

localCacheScope

MyBatis的使用本地缓存,以防止循环引用,并加快反复嵌套查询。默认情况下(SESSION)会话期间执行的所有查询缓存。如果localCacheScope=STATMENT本地会话将被用于语句的执行,只是没有将数据共享之间的两个不同的调用相同的SqlSession

    SESSION | STATEMENT

SESSION

jdbcTypeForNull

指定为空值时,没有特定的JDBC类型的参数的JDBC类型。有些驱动需要指定列的JDBC类型,但其他像NULLVARCHAROTHER的工作与通用值。

    JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER

OTHER

lazyLoadTriggerMethods

指定触发延迟加载的对象的方法

    A method name list separated by commas

equals,clone,hashCode,toString

defaultScriptingLanguage

指定所使用的语言默认为动态SQL生成。

    A type alias or fully qualified class name.

org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver

callSettersOnNulls

指定如果setter方法或地图的put方法时,将调用检索到的值是null。它是有用的,当你依靠Map.keySet()或null初始化。注意原语(如整型,布尔等)不会被设置为null

    true | false

false

logPrefix

指定的前缀字串,MyBatis将会增加记录器的名称。

    Any String

Not set

logImpl

指定MyBatis的日志实现使用。如果此设置是不存在的记录的实施将自动查找。

    SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

 Not set

proxyFactory

指定代理工具,MyBatis将会使用创建懒加载能力的对象。

    CGLIB | JAVASSIST

CGLIB


下面是一个完整的setting元素的设置示例:

<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="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <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 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>

使用这个配置,"Blog"可以任意用来替代"domain.blog.Blog"所使用的地方。您也可以指定包MyBatis将会搜索bean。例如:

<typeAliases>
  <package name="domain.blog"/>
</typeAliases>

每个bean都可以在domain.blog被发现,如果没有找到注解,将注册使用小写开头的非限定类的bean的名称作为别名。临屋区将为domain.blog.Author被登记author。 如果@Alias注解的类,它的值将被用作别名。请看下面的例子:

@Alias("author")
public class Author {
    ...
}

对于普通的 Java 类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载 的名字,要注意原生类型的特殊处理。

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_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


typeHandlers (类型处理器)

无论是 MyBatis 在预处理语句中设置一个参数, 还是从结果集中取出一个值时, 类型处 理器被用来将获取的值以合适的方式转换成 Java 类型。下面这个表格描述了默认的类型处 理器。

类型处理器

Java类型

    JDBC类型

BooleanTypeHandler

java.lang.Booleanboolean

    任何兼容的布尔值

ByteTypeHandler

java.lang.Byte, byte

    任何兼容的数字或字节类型

ShortTypeHandler

java.lang.Shortshort

    任何兼容的数字或短整型

IntegerTypeHandler

java.lang.Integerint

    任何兼容的数字和整型

LongTypeHandler

java.lang.Longlong

    任何兼容的数字或长整型

FloatTypeHandler

java.lang.Float, float

    任何兼容的数字或单精度浮点型

DoubleTypeHandler

java.lang.Doubledouble

    任何兼容的数字或双精度浮点型

BigDecimalTypeHandler

java.math.BigDecimal

    任何兼容的数字或十进制小数类型

StringTypeHandler

java.lang.String

    CHAR 和 VARCHAR 类型

ClobTypeHandler

java.lang.String

    CLOB 和 LONGVARCHAR 类型

NStringTypeHandler

java.lang.String

    NVARCHAR 和 NCHAR 类型

NClobTypeHandler

java.lang.String

    NCLOB 类型

ByteArrayTypeHandler

byte[]

    任何兼容的字节流类型

BlobTypeHandler

byte[]

    BLOB 和 LONGVARBINARY 类型

DateTypeHandler

java.util.Date

    TIMESTAMP 类型

DateOnlyTypeHandler

java.util.Date

    DATE 类型

TimeOnlyTypeHandler

java.util.Date

    TIME 类型

SqlTimestampTypeHandler

java.sql.Timestamp

    TIMESTAMP 类型

SqlDateTypeHandler

java.sql.Date

    DATE 类型

SqlTimeTypeHandler

java.sql.Time

    TIME 类型

ObjectTypeHandler

Any

    其他或未指定类型

EnumTypeHandler

Enumeration Type

    VARCHAR-任何兼容的字符串类型, 作为代码存储(而不是索引)

EnumOrdinalTypeHandler

Enumeration Type

    Any compatible NUMERIC or DOUBLE, as the position is stored (not the code itself).


你可以重写类型处理器或创建您自己处理不支持的或非标准的类型。要做到这一点,只需继承org.apache.ibatis.type.BaseTypeHandler类和选择性映射新的类型处理器类的JDBC类型。例如:

// ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter);
  }

  @Override
  public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return rs.getString(columnName);
  }

  @Override
  public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return rs.getString(columnIndex);
  }

  @Override
  public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return cs.getString(columnIndex);
  }
}
<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
使用这样的类型处理器将会覆盖已经存在的Java的String类型属性和VARCHAR参数及结果的类型处理器。注意MyBatis不会审视数据库元数据的类型来确定的,所以你必须指定,这是一个VARCHAR字段的参数和结果映射到正确的类型处理。由于这样事实是MyBatis直到执行该语句,它不知道的数据类型。
MyBatis会知道你要处理这个类型处理器通过内省其泛型类型的Java类型,但你可以重写此行为由两个手段:

(1)添加javaType属性类型处理器的元素(例如:javaType=“String”)
(2)添加注释类型处理器类指定Java类型的列表,将它与一个@ MappedTypes。此注释将被忽略,如果javaType属性也被指定。

通过下列两种方式可以指定相关联的JDBC类型:

(1)添加jdbcType属性到类型处理器的元素(例如:jdbcType为VARCHAR)。
(2)添加注释联想到指定的JDBC类型列表类型处理器类的一个@MappedJdbcTypes。此注释将被忽略,而jdbcType属性将被指定。

最后你可以让MyBatis搜索你的类型处理器

<!-- mybatis-config.xml -->
<typeHandlers>
  <package name="org.mybatis.example"/>
</typeHandlers>
注意当使用JDBC类型自动发现功能时只能被指定的注解。
您可以
创建一个能够处理超过一个类通用的的类型处理器 为了这个目的,MyBatis将会作为参数,并通过实际的类构造类型处理器时,接收类添加一个构造。
//GenericTypeHandler.java
public class GenericTypeHandler<E extends MyObject> extends BaseTypeHandler<E> {

  private Class<E> type;

  public GenericTypeHandler(Class<E> type) {
    if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
    this.type = type;
  }
  ...


Handling Enums(处理枚举)

如果你想使用枚举映射,你会需要使用EnumTypeHandler或EnumOrdinalTypeHandler。
例如,让我们说,我们需要存储的舍入模式,应该用一些数字,如果它需要四舍五入。默认情况下,MyBatis使用EnumTypeHandler的的枚举值转换成自己的名字。
注意:EnumTypeHandler是在这个意义特殊,它不像其他的处理程序,它并不只是处理一个特定的类,而是任何扩展Enum的类。

然而,我们可能不希望存储姓名。我们的DBA可能整数代码,而不是坚持。这是一样容易:添加EnumOrdinalTypeHandler到你的配置文件的类型处理器,现在每个与RoundingMode将被映射到一个整数,使用其序数值。

<typeHandlers>  
  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>  
</typeHandlers>
但是如果你想相同的枚举映射到一个字符串在一个地方和另一个整数?自动映射器会自动使用EnumOrdinalTypeHandler的,所以如果我们想回去使用简单陈旧的普通EnumTypeHandler的,我们必须告诉它,明确设置类型处理程序使用这些SQL语句。(映射文件没有涉及到下一节,因此,如果这是你第一次通过阅读文档,你可能现在想跳过这些但以后会回来了解它的。
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.apache.ibatis.submitted.rounding.Mapper">
	<resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap">
		<id column="id" property="id"/>
		<result column="name" property="name"/>
		<result column="funkyNumber" property="funkyNumber"/>
		<result column="roundingMode" property="roundingMode"/>
	</resultMap>

	<select id="getUser" resultMap="usermap">
		select * from users
	</select>
	<insert id="insert">
	    insert into users (id, name, funkyNumber, roundingMode) values (
	    	#{id}, #{name}, #{funkyNumber}, #{roundingMode}
	    )
	</insert>
	
	<resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2">
		<id column="id" property="id"/>
		<result column="name" property="name"/>
		<result column="funkyNumber" property="funkyNumber"/>
		<result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
	</resultMap>
	<select id="getUser2" resultMap="usermap2">
		select * from users2
	</select>
	<insert id="insert2">
	    insert into users2 (id, name, funkyNumber, roundingMode) values (
	    	#{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=org.apache.ibatis.type.EnumTypeHandler}
	    )
	</insert>

</mapper>
请注意,这迫使我们使用一个resultMap代替resultType在select语句中。


objectFactory(对象工厂)


MyBatis 每次创建结果对象新的实例时, 它使用一个 ObjectFactory 实例来完成。 如果参数映射存在,默认的 ObjectFactory 不比使用默认构造方法或带参数的构造方法实例化目标 类做的工作多。如果你想重写默认的 ObjectFactory,你可以创建你自己的。比如:

// 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>

ObjectFactory接口非常简单。它包含两个创建方法,处理默认构造函数和其他处理带参数构造。最后,setProperties方法可以被用来配置ObjectFactory的。body内的objectFactory元素中定义的属性将被传递给setProperties方法的ObjectFactory实例在初始化之后。


plugins(插件)

MyBatis 允许你在某一点拦截已映射语句执行的调用。默认情况下,MyBatis 允许使用 插件来拦截方法调用:

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setParameters) ResultSetHandler (handleResultSets, handleOutputParameters) StatementHandler (prepare, parameterize, batch, update, query)
这些类中方法的详细看签名,每一个完整的方法,可用每个MyBatis的释放与源代码来被发现。你应该理解你覆盖方法的行为,假设你正在做的事情不仅仅是监控呼叫。如果您尝试修改或覆盖一个给定的方法的行为,你很可能会打破MyBatis的核心。这是低层次的类和方法,所以使用插件持谨慎态度。

使用插件是非常简单的,通过他们所提供的力量。简单实现拦截器接口,确保你想拦截的指定签名。

// 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>
该插件在上面会拦截所有叫做“update”的方法在Executor实例,这是一个内部负责低层次映射语句的执行对象。
注意重写配置类: 除了修改MyBatis核心的行为插件,你也可以完全覆盖配置类。简单扩展并覆盖任何方法里面,并把它传递到的sqlSessionFactoryBuilder.build(myConfig)方法的调用。再次提醒,虽然这可能会严重影响MyBatis的行为,所以谨慎使用。


environments(环境集合属性对象)

MyBatis的可以配置多个environment。这是有助于您应用到多个数据库的SQL映射为任意数量的原因。例如:你可能会为您的开发,测试和生产环境中有不同的配置。或者,你可能有多个生产数据库,共享相同的架构,你想使用相同的SQL映射。有许多用例。

一个重要的事情要记住,虽然:虽然您可以配置多种environment,但你只能选择一个SqlSessionFactory对应的实例

所以,如果你想连接两个数据库,你需要SqlSessionFactory的创建两个实例。三个数据库,你需要三个实例,并依此类推。这真的很容易,要记住:

1. 每个数据库对应一个SqlSessionFactory

要指定创建哪种环境,你只需把它传递到SqlSessionFactoryBuilder作为一个可选的参数。接受环境中的两个签名是:

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
如果环境被忽略,那么默认环境将会被加载,如下进行:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);

environment元素定义了如何配置环境:

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <dataSource type="POOLED">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>
请注意这里的关键部分:
(1)默认的环境ID(例如,default=“development”)。
(2)的环境ID为每个定义的环境(例如:ID=“development”)。
(3)事务管理器的配置(如type=“JDBC”)
(4)数据源配置(例如type=“POOLED”)

2. 
事务管理(transactionManager)

TransactionManager的有两种类型(即类型=“[JDBC|MANAGED]”)中所包含的MyBatis:

JDBC - 这个配置直接简单使用了JDBC的提交和回滚。它依赖于从数据源的连接来管理事务范围。

MANAGED - 这个配置几乎没做什么。它从来不提交或回滚一个连接。相反,它让容器管理的整个生命周期的交易(如JEE应用服务器的上下文)。默认情况下,它会关闭连接。然而一些容器并没有想到这一点,因此如果你需要阻止它关闭连接,设置“形象尤其”属性设置为false。例如:
<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>
注意:如果你打算使用MyBatis与Spring是无需配置任何的TransactionManager,因为Spring模块将覆盖任何先前设置的配置设置自己的。

TransactionManager的类型都不需要任何属性。但是,它们都是类型别名,所以换句话说,你可以把你自己的完全合格的类名或类型别名,是指你自己的实施的TransacFactory接口,而不是使用它们。

public interface TransactionFactory {
  void setProperties(Properties props);  
  Transaction newTransaction(Connection conn);
  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);  
}
任何在XML中配置的属性将被传递给setProperties()方法实例化后。您的实现还需要创建一个交易执行,这也是一个非常简单的接口:
public interface Transaction {
  Connection getConnection() throws SQLException;
  void commit() throws SQLException;
  void rollback() throws SQLException;
  void close() throws SQLException;
}
使用这两个接口,你可以完全自定义MyBatis对事务的处理。

3. 数据源(datasource

dataSource 元素使用基本的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

许多MyBatis的应用程序配置数据源的例子中。然而,它不是必需的。虽然实现,为了方便使用延迟加载,这个数据源是必需的。

有三种内建的数据源类型(即type=“?”):

(1) UNPOLLED

    这个数据源的实现简单地打开和关闭连接每次请求。虽然它慢一点,这是一个不错的选择,简单的应用程序,不需要及时的可用连接的性能。在此表演区,不同的数据库也不同,所以对一些人来说可能是不太重要的游泳池,这个配置将是理想的。 UNPOOLED的DataSource配置只有五个属性:
  • driver – 这是 JDBC 驱动的 Java 类的完全限定名(如果你的驱动包含,它也不是 数据源类)。
  • url – 这是数据库的 JDBC URL 地址。
  • username – 登录数据库的用户名。
  • password – 登录数据库的密码。
  • defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
或者,您可以通过数据库驱动程序的属性。要做到这一点,与驱动程序前缀的属性,例如:
  • driver.encoding=UTF8
这将传递属性编码,UTF8的价值,数据库驱动程序通过的DriverManager.getConnection(URL,driverProperties)方法。

(2) POOLED

    此实现数据源连接池的JDBC连接对象,以避免初始连接和认证所需的时间来创建一个新的连接实例。这是一个流行的做法,并发Web应用程序,以实现最快的响应。除了向(UNPOOLED)上述物业,也有许多其他属性,可用于配置POOLED的数据源:
  • poolMaximumActiveConnections – 在任意时间存在的活动(也就是正在使用)连 接的数量。默认值:10
  • poolMaximumIdleConnections – 任意时间存在的空闲连接数。
  • poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检查的时间。默认 值:20000 毫秒(也就是 20 秒)
  • poolTimeToWait – 这是给连接池一个打印日志状态机会的低层次设置,还有重新 尝试获得连接, 这些情况下往往需要很长时间 为了避免连接池没有配置时静默失 败)。默认值:20000 毫秒(也就是 20 秒)
  • poolPingQuery – 发送到数据的侦测查询,用来验证连接是否正常工作,并且准备 接受请求。默认是“NO PING QUERY SET” ,这会引起许多数据库驱动连接由一 个错误信息而导致失败。
  • poolPingEnabled – 这是开启或禁用侦测查询。如果开启,你必须用一个合法的 SQL 语句(最好是很快速的)设置 poolPingQuery 属性。默认值:false。
  • poolPingConnectionsNotUsedFor – 这是用来配置 poolPingQuery 多次时间被用一次。 这可以被设置匹配标准的数据库连接超时时间, 来避免不必要的侦测。 默认值: 0(也就是所有连接每一时刻都被侦测-但仅仅当 poolPingEnabled 为 true 时适用)

(3) JNDI

    这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器, 容器可以集 中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这个数据源配置只需要两个属 性:
  • initial_context – 这 个 属 性 用 来 从 初 始 上 下 文 中 寻 找 环 境 ( 也 就 是 initialContext.lookup(initial——context) 。这是个可选属性,如果被忽略,那么 data_source 属性将会直接以 initialContext 为背景再次寻找。
  • data_source – 这是引用数据源实例位置的上下文的路径。它会以由 initial_context 查询返回的环境为背景来查找,如果 initial_context 没有返回结果时,直接以初始 上下文为环境来查找。
和其他数据源配置相似, 它也可以通过名为 “env.” 的前缀直接向初始上下文发送属性。 比如:
  • env.encoding=UTF8
在初始化之后,这就会以值“UTF8”向初始上下文的构造方法传递名为“encoding” 的属性。


databaseIdProvider(数据库ID提供者)


     MyBatis的是能够执行不同的语句,这取决于您的数据库供应商。多数据库厂商的支持的基础上的映射语句的databaseID的属性。 MyBatis将会加载与没有databaseId属性相匹配的当前用的databaseID的所有陈述。如果情况,如果发现相同的语句与和的databaseID无后者将被丢弃。为了使多厂商支持的MyBatis-config.xml文件中添加databaseIdProvider如下:
<databaseIdProvider type="DB_VENDOR" />
DB_VENDOR实施databaseIdProvider套作为databaseId由DatabaseMetaData:#getDatabaseProductName()返回的字符串。通常字符串太长,不同版本的同一产品也返回不同的值,所以你可能想将它翻译成一个较短的添加属性,比如如下:
<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>        
  <property name="Oracle" value="oracle" />
</databaseIdProvider>
当属性类型为DB_VENDOR databaseIdProvider搜索发现在返回的数据库产品名称或“空”的第一个关键,如果没有匹配的属性对应的属性值。在这种情况下,如果getDatabaseProductName()返回“甲骨文公司(DataDirect产品)”的的databaseID将被设置为“oracle”。
您可以建立您的自己的DatabaseIdProvider,实现接口org.apache.ibatis.mapping.DatabaseIdProvider的MyBatis-config.xml中注册:
public interface DatabaseIdProvider {
  void setProperties(Properties p);
  String getDatabaseId(DataSource dataSource) throws SQLException;
}


mappers(映射器)

现在MyBatis的行为是配置上面的配置元素,我们已经准备好来定义映射的SQL语句。但首先,我们需要告诉MyBatis在哪里可以找到它们的。 Java不提供一个很好的手段自动发现,在这方面,所以做到这一点的最好办法是简单地告诉MyBatis在哪里可以找到映射文件。您可以使用相对于类路径的资源引用,或文字,完全合格的URL引用(包括file:/ / /URL)。例如:
<!-- Using classpath relative resources -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- Using url fully qualified paths -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- Using mapper interface classes -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- Register all interfaces in a package as mappers -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>
这些语句简单告诉了 MyBatis 去哪里找映射文件。其余的细节就是在每个 SQL 映射文 件中了,下面的部分我们来讨论 SQL 映射文件。



转载于:https://my.oschina.net/liangbo/blog/269242

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值