怎么做自己的淘宝网站,大连森秀网络推广,商业网站排名,河北高阳做网站的【-1】README1#xff09;本文全文总结于 http://www.mybatis.org/mybatis-3/zh/configuration.html#environments【0】MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置#xff08;settings#xff09;和属性#xff08;properties#xff09;信息。文档的顶层结构如…【-1】README1本文全文总结于 http://www.mybatis.org/mybatis-3/zh/configuration.html#environments【0】MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置settings和属性properties信息。文档的顶层结构如下- configuration 配置- properties 属性- settings 设置- typeAliases 类型命名- typeHandlers 类型处理器- objectFactory 对象工厂- plugins 插件- environments 环境- environment 环境变量- transactionManager 事务管理器- dataSource 数据源- databaseIdProvider 数据库厂商标识- mappers 映射器【1】properties 属性 method1通过属性文件引入属性配置method2通过 properties 子元素 property 动态配置properties resourcejdbc.propertiesproperty nameusername valueerror_root//propertiesmethod3通过 方法传递设置SqlSessionFactory factory sqlSessionFactoryBuilder.build(reader, props);
// ... or ...
SqlSessionFactory factory sqlSessionFactoryBuilder.build(reader, environment, props);1如果属性在不只一个地方进行了配置那么 MyBatis 将按照下面的顺序来加载干货——属性设置的优先级 1.1在 properties 元素体内指定的属性首先被读取。 1.2然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件并覆盖已读取的同名属性。 1.3最后读取作为方法参数传递的属性并覆盖已读取的同名属性。 因此通过方法参数传递的属性具有最高优先级resource/url 属性中指定的配置文件次之最低优先级的是 properties 属性中指定的属性。 【2】setting1intro 这是 MyBatis 中极为重要的调整设置它们会改变 MyBatis 的运行时行为。2下表描述了设置中各项的意图、默认值等3一个配置完整的 settings 元素的示例如下settingssetting namecacheEnabled valuetrue/setting namelazyLoadingEnabled valuetrue/setting namemultipleResultSetsEnabled valuetrue/setting nameuseColumnLabel valuetrue/setting nameuseGeneratedKeys valuefalse/setting nameautoMappingBehavior valuePARTIAL/setting nameautoMappingUnknownColumnBehavior valueWARNING/setting namedefaultExecutorType valueSIMPLE/setting namedefaultStatementTimeout value25/setting namedefaultFetchSize value100/setting namesafeRowBoundsEnabled valuefalse/setting namemapUnderscoreToCamelCase valuefalse/setting namelocalCacheScope valueSESSION/setting namejdbcTypeForNull valueOTHER/setting namelazyLoadTriggerMethods valueequals,clone,hashCode,toString/
/settings 【3】typeAliases1intro类型别名是为 Java 类型设置一个短的名就是取个别名2取别名typeAliasestypeAlias aliasAuthor typedomain.blog.Author/typeAlias aliasBlog typedomain.blog.Blog/typeAlias aliasComment typedomain.blog.Comment/typeAlias aliasPost typedomain.blog.Post/typeAlias aliasSection typedomain.blog.Section/typeAlias aliasTag typedomain.blog.Tag/
/typeAliases 当这样配置时Blog可以用在任何使用domain.blog.Blog的地方。 3也可以指定一个包名MyBatis 会在包名下面搜索需要的 Java BeantypeAliasespackage namedomain.blog/
/typeAliases supplement每一个在包 domain.blog 中的 Java Bean在没有注解的情况下会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author若有注解则别名为其注解值。看下面的例子 4已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的需要注意的是由基本类型名称重复导致的特殊处理。【4】类型处理器1intro无论是 MyBatis 在预处理语句PreparedStatement中设置一个参数时还是从结果集中取出一个值时 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。2你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为实现 org.apache.ibatis.type.TypeHandler 接口 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler 然后可以选择性地将它映射到一个 JDBC 类型。比如// ExampleTypeHandler.java
MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandlerString {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter);}Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return rs.getString(columnName);}Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return rs.getString(columnIndex);}Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return cs.getString(columnIndex);}
} !-- mybatis-config.xml 在 mybatis的配置文件 xml 中 引用该类型处理器--
typeHandlerstypeHandler handlerorg.mybatis.example.ExampleTypeHandler/
/typeHandlers 3 最后可以让 MyBatis 为你查找类型处理器 !-- mybatis-config.xml --
typeHandlerspackage nameorg.mybatis.example/
/typeHandlers Attention
注意在使用自动检索autodiscovery功能的时候只能通过注解方式来指定 JDBC 的类型。 【5】处理枚举类型EnumTypeHandler 和 EnumOrdinalTypeHandler1intro若想映射枚举类型 Enum则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用。Attention注意 EnumTypeHandler 在某种意义上来说是比较特别的其他的处理器只针对某个特定的类而它不同它会处理任意继承了 Enum 的类。2看个荔枝比如说我们想存储取近似值时用到的舍入模式。2.1默认情况下MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。 2.2不过我们可能不想存储名字相反我们的 DBA 会坚持使用整形值代码 在配置文件中把 EnumOrdinalTypeHandler 加到 typeHandlers 中即可 这样每个 RoundingMode 将通过他们的序数值来映射成对应的整形 !-- mybatis-config.xml --
typeHandlerstypeHandler handlerorg.apache.ibatis.type.EnumOrdinalTypeHandler javaTypejava.math.RoundingMode/
/typeHandlers 2problemsolution 2.1problem但是怎样能将同样的 Enum 既映射成字符串又映射成整形呢 2.2solution自动映射器auto-mapper会自动地选用 EnumOrdinalTypeHandler 来处理 所以如果我们想用普通的 EnumTypeHandler就非要为那些 SQL 语句显式地设置要用到的类型处理器不可。 【6】objectFactory 对象工厂 1introMyBatis 每次创建结果对象的新实例时它都会使用一个对象工厂ObjectFactory实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类要么通过默认构造方法要么在参数映射存在的时候通过参数构造方法来实例化。 2自定义对象工厂 如果想覆盖对象工厂的默认行为则可以通过创建自己的对象工厂来实现。比如 // ExampleObjectFactory.java
public class ExampleObjectFactory extends DefaultObjectFactory {public Object create(Class type) {return super.create(type);}public Object create(Class type, ListClass constructorArgTypes, ListObject constructorArgs) {return super.create(type, constructorArgTypes, constructorArgs);}public void setProperties(Properties properties) {super.setProperties(properties);}public T boolean isCollection(ClassT type) {return Collection.class.isAssignableFrom(type);}} !-- mybatis-config.xml --
objectFactory typeorg.mybatis.example.ExampleObjectFactoryproperty namesetProperties value100/
/objectFactory 对以上代码的分析Analysis ObjectFactory 接口很简单它包含两个创建用的方法一个是处理默认构造方法的另外一个是处理带参数的构造方法的。 最后setProperties 方法可以被用来配置 ObjectFactory在初始化你的 ObjectFactory 实例后 objectFactory 元素体中定义的属性会被传递给 setProperties 方法。 【7】 plugins 插件 1intro MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。 2默认情况下MyBatis 允许使用插件来拦截的方法调用包括 - Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)- ParameterHandler (getParameterObject, setParameters)- ResultSetHandler (handleResultSets, handleOutputParameters)- StatementHandler (prepare, parameterize, batch, update, query) Attention 因为如果在试图修改或重写已有方法的行为的时候你很可能在破坏 MyBatis 的核心模块。 这些都是更低层的类和方法所以使用插件的时候要特别当心。干货——使用插件的时候要特别当心2如何使用插件只需实现 Interceptor 接口并指定了想要拦截的方法签名即可。// 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 --
pluginsplugin interceptororg.mybatis.example.ExamplePluginproperty namesetProperties value100//plugin
/plugins 对以上代码的分析Analysis 上面的插件将会拦截在 Executor 实例中所有的 “update” 方法调用 这里的 Executor 是负责执行低层映射语句的内部对象。Attention除了用插件来修改 MyBatis 核心行为之外还可以通过完全覆盖配置类来达到目的。只需继承后覆盖其中的每个方法再把它传递到 sqlSessionFactoryBuilder.build(myConfig) 方法即可。再次重申这可能会严重影响 MyBatis 的行为务请慎之又慎。干货——再次重申这可能会严重影响 MyBatis 的行为务请慎之又慎【7】environments 环境1可以配置多个环境每个 SqlSessionFactory 实例只能选择其一。 所以如果你想连接两个数据库就需要创建两个 SqlSessionFactory 实例每个数据库对应一个。而如果是三个数据库就需要三个实例依此类推记起来很简单2每个数据库对应一个 SqlSessionFactory 实例 为了指定创建哪种环境只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。可以接受环境配置的两个方法签名是SqlSessionFactory factory sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory sqlSessionFactoryBuilder.build(reader, environment,properties); 2.1 如果忽略了环境参数那么默认环境将会被加载如下所示SqlSessionFactory factory sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory sqlSessionFactoryBuilder.build(reader,properties); 2.2环境元素定义了如何配置环境。environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBCproperty name... value...//transactionManagerdataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment
/environments 注意这里的关键点: 默认的环境 ID比如:default”development”。
每个 environment 元素定义的环境 ID比如:id”development”。
事务管理器的配置比如:type”JDBC”。
数据源的配置比如:type”POOLED”。
保证默认环境要匹配其中一个环境ID。干货——即是说必要要配置默认环境development【7.1】transactionManager 事务管理器1intro 在 MyBatis 中有两种类型的事务管理器也就是 type”[JDBC|MANAGED]”type1JDBC 这个配置就是直接使用了 JDBC 的提交和回滚设置它依赖于从数据源得到的连接来管理事务范围。干货——可以直接使用回滚和提交的设置 type2MANAGED 这个配置几乎没做什么。它从来不提交或回滚一个连接而是让容器来管理事务的整个生命周期比如 JEE 应用服务器的上下文。 默认情况下它会关闭连接然而一些容器并不希望这样因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如 transactionManager typeMANAGEDproperty namecloseConnection valuefalse/
/transactionManager Attention 如果你正在使用 Spring MyBatis则没有必要配置事务管理器 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。2这两种事务管理器类型都不需要任何属性。它们不过是类型别名换句话说你可以使用 TransactionFactory 接口的实现类的完全限定名或类型别名代替它们。 public interface TransactionFactory {void setProperties(Properties props); Transaction newTransaction(Connection conn);Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
} 3任何在 XML 中配置的属性在实例化之后将会被传递给 setProperties() 方法。你也需要创建一个 Transaction 接口的实现类这个接口也很简单public interface Transaction {Connection getConnection() throws SQLException;void commit() throws SQLException;void rollback() throws SQLException;void close() throws SQLException;Integer getTimeout() throws SQLException;
} Attention使用这两个接口你可以完全自定义 MyBatis 对事务的处理。干货——通过实现 TransactionFactory 和 Transaction 接口 可以自定义 MyBatis 对事务的处理即设置回滚和是否自动提交 【7.2】dataSource 数据源 1intro 有三种内建的数据源类型也就是 type”[UNPOOLED|POOLED|JNDI]”【7.2.1】UNPOOL 类型的数据源1intro 这个数据源的实现只是每次被请求时打开和关闭连接2UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性property1driver 这是 JDBC 驱动的 Java 类的完全限定名并不是JDBC驱动中可能包含的数据源类。 property2url这是数据库的 JDBC URL 地址。 property3username登录数据库的用户名。 property4password登录数据库的密码。 property5defaultTransactionIsolationLevel默认的连接事务隔离级别。 Supplement作为可选项你也可以传递属性给数据库驱动。要这样做属性的前缀为“driver.”例如driver.encodingUTF8这将通过DriverManager.getConnection(url,driverProperties)方法传递值为 UTF8 的 encoding 属性给数据库驱动。 【7.2.2】POOLED类型的数据源1intro 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。 2除了上述提到 UNPOOLED 下的属性外会有更多属性用来配置 POOLED 的数据源- poolMaximumActiveConnections – 在任意时间可以存在的活动也就是正在使用连接数量默认值10- poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。- poolMaximumCheckoutTime – 在被强制返回之前池中连接被检出checked out时间默认值20000 毫秒即 20 秒- poolTimeToWait – 这是一个底层设置如果获取连接花费的相当长的时间它会给连接池打印状态日志并重新尝试获取一个连接避免在误配置的情况下一直安静的失败默认值20000 毫秒即 20 秒。- poolPingQuery – 发送到数据库的侦测查询用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”这会导致多数数据库驱动失败时带有一个恰当的错误消息。- poolPingEnabled – 是否启用侦测查询。若开启也必须使用一个可执行的 SQL 语句设置 poolPingQuery 属性最好是一个非常快的 SQL默认值false。- poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的使用频度。这可以被设置成匹配具体的数据库连接超时时间来避免不必要的侦测默认值0即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用。 【7.2.3】JNDI类型的数据源 1intro 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用容器可以集中或在外部配置数据源然后放置一个 JNDI 上下文的引用2这种数据源配置只需要两个属性 - initial_context – 这个属性用来在 InitialContext 中寻找上下文即initialContext.lookup(initial_context)。这是个可选属性如果忽略那么 data_source 属性将会直接从 InitialContext 中寻找。- data_source – 这是引用数据源实例位置的上下文的路径。提供了 initial_context 配置时会在其返回的上下文中进行查找没有提供时则直接在 InitialContext 中查找。 3和其他数据源配置类似可以通过添加前缀“env.”直接把属性传递给初始上下文。比如 env.encodingUTF8 这就会在初始上下文InitialContext实例化时往它的构造方法传递值为 UTF8 的 encoding 属性4通过需要实现接口 org.apache.ibatis.datasource.DataSourceFactory 也可使用任何第三方数据源 public interface DataSourceFactory {void setProperties(Properties props);DataSource getDataSource();
} 5 org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory 可被用作父类来构建新的数据源适配器比如下面这段插入 C3P0 数据源所必需的代码 import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {public C3P0DataSourceFactory() {this.dataSource new ComboPooledDataSource();}
} 6 为了令其工作为每个需要 MyBatis 调用的 setter 方法中增加一个属性。下面是一个可以连接至 PostgreSQL 数据库的例子 dataSource typeorg.myproject.C3P0DataSourceFactoryproperty namedriver valueorg.postgresql.Driver/property nameurl valuejdbc:postgresql:mydb/property nameusername valuepostgres/property namepassword valueroot/
/dataSource 【8】 databaseIdProvider 数据库厂商标识1intro MyBatis 可以根据不同的数据库厂商执行不同的语句这种多厂商的支持是基于映射语句中的 databaseId 属性。 MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句则后者会被舍弃。 2为支持多厂商特性只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可 databaseIdProvider typeDB_VENDOR / 3这里的 DB_VENDOR 会通过 DatabaseMetaData#getDatabaseProductName()返回的字符串进行设置。 由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值所以最好通过设置属性别名来使其变短如下 databaseIdProvider typeDB_VENDORproperty nameSQL Server valuesqlserver/property nameDB2 valuedb2/ property nameOracle valueoracle /
/databaseIdProvider 【9】 mappers 映射器1intro 既然 MyBatis 的行为已经由上述元素配置完了我们现在就要定义 SQL 映射语句了。 你可以使用相对于类路径的资源引用 或完全限定资源定位符包括 file:/// 的 URL或类名和包名等。例如!-- Using classpath relative resources --
mappersmapper resourceorg/mybatis/builder/AuthorMapper.xml/mapper resourceorg/mybatis/builder/BlogMapper.xml/mapper resourceorg/mybatis/builder/PostMapper.xml/
/mappers !-- Using url fully qualified paths --
mappersmapper urlfile:///var/mappers/AuthorMapper.xml/mapper urlfile:///var/mappers/BlogMapper.xml/mapper urlfile:///var/mappers/PostMapper.xml/
/mappers !-- Using mapper interface classes --
mappersmapper classorg.mybatis.builder.AuthorMapper/mapper classorg.mybatis.builder.BlogMapper/mapper classorg.mybatis.builder.PostMapper/
/mappers !-- Register all interfaces in a package as mappers --
mapperspackage nameorg.mybatis.builder/
/mappers Attention这些配置会告诉了 MyBatis 去哪里找映射文件剩下的细节就应该是每个 SQL 映射文件了也就是接下来我们要讨论的。