mybatis_user_guide(3)XML配置
- configuration 配置- properties 属性- settings 设置- typeAliases 类型命名- typeHandlers 类型处理器- objectFactory 对象工厂- plugins 插件- environments 环境- environment 环境变量- transactionManager 事务管理器- dataSource 数据源- databaseIdProvider 数据库厂商标识- mappers 映射器
【1】properties 属性
<properties resource="jdbc.properties"><property name="username" value="error_root"/></properties>
method3)通过 方法传递设置
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 属性中指定的属性。
<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="autoMappingUnknownColumnBehavior" value="WARNING"/><setting name="defaultExecutorType" value="SIMPLE"/><setting name="defaultStatementTimeout" value="25"/><setting name="defaultFetchSize" value="100"/><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><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
的地方。
<typeAliases><package name="domain.blog"/>
</typeAliases>
domain.blog
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author
的别名为 author
;若有注解,则别名为其注解值。看下面的例子:
org.apache.ibatis.type.TypeHandler
接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler
, 然后可以选择性地将它映射到一个 JDBC 类型。比如:
// ExampleTypeHandler.java @MappedJdbcTypes(JdbcType.VARCHAR) public class ExampleTypeHandler extends BaseTypeHandler<String> {@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 中 引用该类型处理器--> <typeHandlers><typeHandler handler="org.mybatis.example.ExampleTypeHandler"/> </typeHandlers>
3) 最后,可以让 MyBatis 为你查找类型处理器:
<!-- mybatis-config.xml --> <typeHandlers><package name="org.mybatis.example"/> </typeHandlers>
Attention) 注意在使用自动检索(autodiscovery)功能的时候,只能通过注解方式来指定 JDBC 的类型。
2.1)默认情况下:MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。2.2)不过,我们可能不想存储名字,相反我们的 DBA 会坚持使用整形值代码: 在配置文件中把 EnumOrdinalTypeHandler 加到 typeHandlers 中即可, 这样每个 RoundingMode 将通过他们的序数值来映射成对应的整形;
<!-- mybatis-config.xml --> <typeHandlers><typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/> </typeHandlers>
2)problem+solution:
2.1)problem:但是怎样能将同样的 Enum 既映射成字符串又映射成整形呢?2.2)solution:自动映射器(auto-mapper)会自动地选用 EnumOrdinalTypeHandler 来处理, 所以如果我们想用普通的 EnumTypeHandler,就非要为那些 SQL 语句显式地设置要用到的类型处理器不可。
// 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="setProperties" value="100"/> </objectFactory>
对以上代码的分析(Analysis): ObjectFactory 接口很简单,它包含两个创建用的方法,一个是处理默认构造方法的,另外一个是处理带参数的构造方法的。 最后,setProperties 方法可以被用来配置 ObjectFactory,在初始化你的 ObjectFactory 实例后, objectFactory 元素体中定义的属性会被传递给 setProperties 方法。
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)- ParameterHandler (getParameterObject, setParameters)- ResultSetHandler (handleResultSets, handleOutputParameters)- StatementHandler (prepare, parameterize, batch, update, query)
// 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="setProperties" value="100"/></plugin> </plugins>
对以上代码的分析(Analysis): 上面的插件将会拦截在 Executor 实例中所有的 “update” 方法调用, 这里的 Executor 是负责执行低层映射语句的内部对象。
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 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>
注意这里的关键点:
默认的环境 ID(比如:default=”development”)。
每个 environment 元素定义的环境 ID(比如:id=”development”)。
事务管理器的配置(比如:type=”JDBC”)。
数据源的配置(比如:type=”POOLED”)。
保证默认环境要匹配其中一个环境ID。(干货——即是说,必要要配置默认环境==development)
【7.1】transactionManager 事务管理器
type1)JDBC : 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务范围。(干货——可以直接使用回滚和提交的设置)type2)MANAGED: 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
<transactionManager type="MANAGED"><property name="closeConnection" value="false"/> </transactionManager>
Attention) 如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
public interface TransactionFactory {void setProperties(Properties props); Transaction newTransaction(Connection conn);Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit); }
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 对事务的处理,即设置回滚和是否自动提交)
property1)driver: 这是 JDBC 驱动的 Java 类的完全限定名(并不是JDBC驱动中可能包含的数据源类)。property2)url:这是数据库的 JDBC URL 地址。property3)username:登录数据库的用户名。property4)password:登录数据库的密码。property5)defaultTransactionIsolationLevel:默认的连接事务隔离级别。
Supplement)作为可选项,你也可以传递属性给数据库驱动。要这样做,属性的前缀为“driver.”,例如:driver.encoding=UTF8;这将通过DriverManager.getConnection(url,driverProperties)方法传递值为 UTF8 的 encoding 属性给数据库驱动。
- 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类型的数据源:
- initial_context – 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么 data_source 属性将会直接从 InitialContext 中寻找。- data_source – 这是引用数据源实例位置的上下文的路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 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 type="org.myproject.C3P0DataSourceFactory"><property name="driver" value="org.postgresql.Driver"/><property name="url" value="jdbc:postgresql:mydb"/><property name="username" value="postgres"/><property name="password" value="root"/> </dataSource>
<databaseIdProvider type="DB_VENDOR" />
3)这里的 DB_VENDOR 会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。 由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短,如下:
<databaseIdProvider type="DB_VENDOR"><property name="SQL Server" value="sqlserver"/><property name="DB2" value="db2"/> <property name="Oracle" value="oracle" /> </databaseIdProvider>
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>
Attention)这些配置会告诉了 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了,也就是接下来我们要讨论的。
mybatis_user_guide(3)XML配置相关推荐
- MyBatis——XML配置解析
目录 1. 环境配置(environments) 2. 属性(properties) 3. 类型别名(typeAliases) 方式一:通过typeAlias起别名 方式二:通过package起别名 ...
- requirednew基于xml配置日志不回滚_Elasticsearch配置IK分词器的远程词库
在生活中很多很多地方都涉及到了全文检索,最常见的就好比日常使用到的百度搜索等搜索引擎,也都是基于全文检索来实现的:全文检索种类较多,就好比Elasticsearch.Sorl等. 为Ealsticse ...
- Spring装配Bean---使用xml配置
声明Bean Spring配置文件的根元素是<beans>. 在<beans>元素内,你可以放所有的Spring配置信息,包括<bean>元素的声明. 除了Bean ...
- Struts2+spring+jdbc 以xml配置形式整合
今天做作业,练习一下Struts2+spring+jdbc 以xml配置形式整合 整合步骤: 工程结构图: 重要配置文件 web.xml <?xml version="1.0" ...
- tomcat8 启动项目pom.xml配置
tomcat8 启动项目pom.xml配置 <build><finalName>WebTest</finalName><plugins><plug ...
- mybatis 同名方法_MyBatis(四):xml配置详解
目录 1.我们将 数据库的配置语句写在 db.properties 文件中 2.在 mybatis-configuration.xml 中加载db.properties文件并读取 通过源码我们可以分析 ...
- @ImportResource-SpringBoot使用xml配置Bean
#前言 SpringBoot推荐使用注解的方式去声明bean,但还是提供了xml的方式去加载bean #一.创建要声明为bean的实体类 WzqEntity.java package com;/** ...
- @ImportResource SpringBoot使用xml配置Bean
前言 SpringBoot推荐使用注解的方式去声明bean,但还是提供了xml的方式去加载bean 一.创建要声明为bean的实体类 WzqEntity.java package com;/** * ...
- java generatorconfig_generatorConfig.xml配置信息详细
mybatis-generator有三种用法:命令行.eclipse插件.maven插件.我的以为maven插件最方便,能够在eclipse/intellij idea等ide上能够通用.html 下 ...
最新文章
- “秒杀”谷歌!这个生物科研工具,可爬取全网中外文献
- SweetAlert插件 弹框插件
- 前端那些年--npm
- 阿加莎·克莉丝蒂与我们
- ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL
- 潜藏在人体体内的12种毒素
- ffmpeg实战教程(二)用SDL播放YUV,并结合ffmpeg实现简易播放器
- 支付宝核心工程师谈如何成为一名优秀的程序员?
- org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state wo
- Sequence I
- 最近好多K2PB1B2博通的官改版本被强制升级,下面是刷机办法。
- ENVI5.3.1使用Landsat 8影像进行辐射定标和大气校正实例操作
- postman实现接口请求
- ionic代码压缩与代码混淆
- 互联网运营起步 |《从零开始做运营》读书笔记
- 吃透MIPI接口,你必须了解它这三种PHY规范的区别
- php 模态框效果,评论:超酷的模态框效果 - Nifty
- httpc:request post 请求
- gpgpu_GPGPU Java编程
- Deep Stable Learning for Out-Of-Distribution Generalization
热门文章
- Deltix Round, Spring 2021 D. Love-Hate 随机化 + sos dp(高维前缀和)
- 【CTSC2010】珠宝商【后缀自动机】【点分治】【根号分治】
- LG P4899 [IOI2018] werewolf 狼人(kruskal重构树,二维数点)
- Buy and Resell 2018中国大学生程序设计竞赛 - 网络选拔赛
- 专题突破之反悔贪心——建筑抢修,Cow Coupons G, Voting (Hard Version),Cardboard Box
- 剪纸游戏(博弈论)(SG函数)
- YbtOJ-选点构形【欧拉函数】
- AT2376-[AGC014D]Black and White Tree【结论,博弈论】
- P5470-[NOI2019]序列【模拟费用流】
- P2714-四元组统计【数论,容斥】