MyBatis全局配置属性

本文详细介绍了MyBatis的全局配置,包括properties属性配置、settings运行状态设置、typeAliases类对象别名、typeHandlers类型处理器、objectFactory对象工厂、plugins插件、environments环境配置、transactionManager数据事务、dataSource数据库配置、databaseIdProvider数据库厂商标识和mappers映射文件关联。还讲解了如何自定义别名、类型处理器和对象工厂,以及插件的使用和数据库环境配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  

目录

properties(属性配置) 

settings(设置ibatis运行状态)

typeAliases(设置类对象的别名)

typeHandlers(类型处理器)

objectFactory(对象工厂配置)

plugins(插件配置)

environments(环境配置集)

environment(数据源配置)

transactionManager(数据事务配置)

dataSource(数据库配置)

databaseIdProvider(数据库厂商标识)

mappers(映射文件关联)

完整配置属性列表


properties(属性配置) 

<properties resource="" url="">    
	<property name="" value=""/>   
	...                            
</properties>                      

ibatis中加载属性配置的方式有三种.

方式描述
a直接使用字面量的形式,在内标签property中配置;
b加载properties配置文件的数据,有两种途径可供选择.
resource:从classpath路径中加载文件;
url:从网络路径或者物理磁盘路径中加载文件;
c使用java.util.Properties的类实例进行配置,借用的是
org.apache.ibatis.session.SqlSessionFactoryBuilder.build()
的重写的方法.
优先级c>b>a .

属性占位符的功能(最低版本3.4.2).

${key:defalut-value};表示指定的key若无法取值的话,就使用符号`:`指定的默认值.

注意:属性占位符的功能默认是关闭的,需要手动开启.

<property                                                                
	name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" 
	value="true" />                                                      

也可以使用ONGL表达式中的三元运算符,来使用属性占位符.

但也需要额外修改ibatis的默认配置.

<property                                                                  
	name="org.apache.ibatis.parsing.PropertyParser.enable-default-value"   
	value="true" />                                                        
<property                                                                  
	name="org.apache.ibatis.parsing.PropertyParser.default-value-separator"
	value="?:" />                                                          

settings(设置ibatis运行状态)

这是ibatis中最复杂的配置,修改默认设置,会变更ibatis的运行状态.

如无特别需求,不建议设置.

<settings>                      
	<setting name="" value="" />
	...                         
</settings>                     

可设置的属性列表

属性/name描述说明合法值(类型)默认值
cacheEnabled映射器的配置缓存/cache,是否全局开启布尔值true
lazyLoadingEnabled延迟加载,是否全局开启.
若开启,所有的关联对象都会延迟加载.
有特殊需求,可通过设置fetchType属性来覆盖.
布尔值false
aggressiveLazyLoading任何方法调用都加载该类的所有属性,是否全局开启.
否则按需加载,可参考属性lazyLoadTriggerMethods
布尔值false
3.4.2之前,是true.
multipleResultSetsEnabled是否允许单一结果返回多结果集.(需要兼容驱动)布尔值true
useColumnLabel是否,使用列标签替代列名.(需要兼容驱动)布尔值true
useGeneratedKeys是否,允许JDBC支持自动主键生成.(需要兼容驱动)布尔值false
autoMappingBehavior

设置ibatis自动映射列,到字段或属性的行为.

NONE:取消自动映射;

PARTIAL:映射没有定义嵌套结果集映射的结果集.
FULL:自动映射任意复杂的结果集.

NONE|PARTIAL|

FULL

PARTIAL

autoMappingUnknown

ColumnBehavior

自动映射中,发现未知列或属性的处理行为.
NONE:不作任何处理;

WARNING:输出警告日志;
FAILING:映射失败.

NONE|WARNING|

FAILING

NONE
defaultExecutorType

指定默认的执行器.
SIMPLE:普通的执行器.
REUSE:此执行器,会重用预处理语句.
BATCH:此执行器,会重用预处理语句, 且执行批量更新.

SIMPLE|REUSE|

BATCH

SIMPLE
defaultStatementTimeout设置超时时间任意正整数\
defaultFetchSize给结果集获取的数量,设置一个提示值.任意正整数\
safeRowBoundsEnabled

是否,不允许在嵌套语句中使用分页.

RowBounds

布尔值false
safeResultHandlerEnabled

是否,不允许在嵌套语句中使用分页.

ResultHandler

布尔值true
mapUnderscoreToCamelCase自动映射中,是否启用驼峰命名法.布尔值false
localCacheScope

ibatis本地缓存机制的作用域.

SESSION:缓存一个会话中执行的所有查询.
STATEMENT:仅作用在单独语句执行的级别.

SESSION|

STATEMENT

SESSION
jdbcTypeForNullnull指定jdbcType.

NULL|VARCHAR

|OTHER|...

OTHER
lazyLoadTriggerMethods指定哪个对象,触发一次延迟加载.

合法的方法名,

多个用逗号分隔

equals,clone,

hashCode,toString

defaultScriptingLanguage指定动态生成sql的默认语言.

合法的类对象的

完全限定名

org.apache.ibatis.

scripting.xmltags.

XMLLanguageDriver

defaultEnumTypeHandler默认的枚举类型处理器

合法的枚举类型处理器,

合法的完全限定名.

org.apache.ibatis.

type.EnumTypeHandler

callSettersOnNulls

是否,当结果集的值为null时,

自动调用映射类对象的

setter方法(map实例的put).

布尔值false
returnInstanceForEmptyRow当结果集的所有列为空时,ibatis默认返回NULL.若开启,则返回一个空实例.布尔值false
logPrefix指定日志名称的前缀字符串\
logImpl

ibatis使用日志组件的实现,若未指定则自动查找.

SLF4J | LOG4J |

LOG4J2 |

JDK_LOGGING | COMMONS_

LOGGING |

STDOUT_LOGGING | NO_LOGGING

\
proxyFactory指定ibatis创建延迟加载对象,所用到的代理工具.CGLIB | JAVASSISTJAVASSIST
vfsImpl指定VFS的实现合法的完全限定名\
useActualParamName

是否,允许方法签名名称作为语句

参数名称.要求:Java 8编译器设置

-parameters参数.

布尔值true
configurationFactory手动提供Configuration的实例类合法的完全限定名\

typeAliases(设置类对象的别名)

<typeAliases>                     
	<package name="" />           
	...                           
	<typeAlias type="" alias="" />
	...                           
</typeAliases>                    

在ibatis中,别名是不区分大小写的

设置别名的方式

  • 直接在配置文件中,使用内置标签typeAlias进行设置.
    若没有指定属性name的值,则默认采用驼峰命名法注册别名.
    <typeAlias type="xxx.xxx.TypeName" alias="typeAlias" />
  • 若配置别名任务量大,则可使用内置的package标签,进行设置.
    typeAlias标签的特性类似.若不结合使用注解@Alias,则默认采用驼峰命名法注册别名.
    前提是,注册的不同的包中,不存在相同标识符的类对象.
    <package name="xxx.xxx.packageName" />

ibatis中内建了基本常用的注解.

可参考类对象:org.apache.ibatis.type.TypeAliasRegistry .

Java的基本类型注册时,别名都前缀符号`_`.

public TypeAliasRegistry() {
  registerAlias("string", String.class);

  registerAlias("byte", Byte.class);
  registerAlias("long", Long.class);
  registerAlias("short", Short.class);
  registerAlias("int", Integer.class);
  registerAlias("integer", Integer.class);
  registerAlias("double", Double.class);
  registerAlias("float", Float.class);
  registerAlias("boolean", Boolean.class);

  ...

typeHandlers(类型处理器)

<typeHandlers>                                         
	<package name="" />                                
	...                                                
	<typeHandler handler="" javaType="" jdbcType="" /> 
	...                                                
</typeHandlers>                                        

ibatis内置的类型处理器

内置处理器typeHandler,主要的效用,就是为了解决在自动映射中,javaTypejdbcType之间的类型转换.

从 3.4.5 开始,MyBatis 默认支持 JSR-310.

若需要自定义类型处理器,只需要实现TypeHandler或者BaseTypeHandler,实现具体行为和属性即可.

可参考的内置类是: org.apache.ibatis.type.TypeHandlerRegistry .

public TypeHandlerRegistry() {
  register(Boolean.class, new BooleanTypeHandler());
  register(boolean.class, new BooleanTypeHandler());
  register(JdbcType.BOOLEAN, new BooleanTypeHandler());
  register(JdbcType.BIT, new BooleanTypeHandler());

  register(Byte.class, new ByteTypeHandler());
  register(byte.class, new ByteTypeHandler());
  register(JdbcType.TINYINT, new ByteTypeHandler());

  register(Short.class, new ShortTypeHandler());
  register(short.class, new ShortTypeHandler());
  register(JdbcType.SMALLINT, new ShortTypeHandler());

  register(Integer.class, new IntegerTypeHandler());
  register(int.class, new IntegerTypeHandler());
  register(JdbcType.INTEGER, new IntegerTypeHandler());

  ...

内置的枚举类型处理器

ibatis中内置了两种枚举类型处理器.

org.apache.ibatis.type.EnumTypeHandler<E> , 以枚举字符串名称作为参数传递, toString() .

org.apache.ibatis.type.EnumOrdinalTypeHandler<E> , 以整数下标作为参数传递, ordinal() .

EnumTypeHandler是默认枚举类型处理器.但是自动映射器(auto-mapper)会自动地选用 EnumOrdinalTypeHandler 来处理.

使用指定枚举类型处理器的步骤:

  1. 指定枚举类型处理器的完全限定名,并指定需要转换映射的javaTypejdbcType.
    这一操作,可在配置标签typeHandler中一步设定,也可分开设置.
    即在子定义实现的枚举类型处理器的类级别上使用注解@MappedType(EnumTypeName.class)
    @MappedJdbcTypes(value ={}, includeNullJdbcType = true)
    但是从3.4.0开始,处理枚举类型是,不需要对未知的枚举jdbc类型进行null设置了.
    <typeHandler                                         
    	handler="org.apache.ibatis.type.EnumTypeHandler" 
    	javaType="xxx.xxx.enum.EnumName" />              
    或者不设置javaType属性,在自定义的枚举类型处理器中,使用注解@MappedTypes@MappedJdbcTypes .
    @MappedTypes(MyEnum.class) 
    @MappedJdbcTypes(value ={}, includeNullJdbcType = true)
    public class MyEnumTypeHandler extends BaseTypeHandler<String>
    {
  2. 在映射文件中,显示为sql语句指定类型处理器.
    <resultMap type="xxx" id="xxx">                                
    	<result property="prop" column="colu"                      
    		typeHandler="org.apache.ibatis.type.EnumTypeHandler" />
    </resultMap>                                                   
    <select id="xxx" resultMap="xxx">                              
    	SELECT * FROM tbl_name                                     
    </select>                                                      
                                                                   
    <insert id="xxx">                                              
    	INSERT INTO tbl_name(colu) VALUE(#{prop,                   
    	typeHandler=org.apache.ibatis.type.EnumTypeHandler})       
    </insert>                                                      

     

  3. 获取mapper的实例,就可遍历的 含有枚举类型的表了.

objectFactory(对象工厂配置)

ibatis创建一个结果对象的实例时,需要使用ObjectFactory对象实例.

默认情况下,ibatis使用的对象工厂类对象是: org.apache.ibatis.reflection.factory.DefaultObjectFactory .

若需要自定义的话,只需要实现DefaultObjectFactory,新增所需的行为和属性即可.

ibatis的对象工厂可满足大多数需求,若无特殊需求,无需设置.

<objectFactory type="">           
	<property name="" value="" /> 
	...                           
</objectFactory>                  

plugins(插件配置)

<plugins>                            
	<plugin interceptor="" >         
		<property name="" value=""/> 
		...                          
	</plugin>                        
	...                              
</plugins>                           

ibatis中的插件主要效用是,拦截sql执行语句的执行过程.

以下是ibatis允许拦截的方法.

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)

environments(环境配置集)

<environments default="">                
	<environment id="">                  
		<transactionManager type="">     
			<property name="" value=""/> 
			...                          
		</transactionManager>            
		<dataSource type="">             
			<property name="" value=""/> 
			...                          
		</dataSource>                    
	</environment>                       
	...                                  
</environments>	                         

environments解析

environments可以配置多个数据源/environment,一个数据源包含一个数据库配置/datasource

和一个数据事务配置/transactionManager.

其属性defalut表示,在缺省的情况下,将启用哪个数据源配置.

environment(数据源配置)

标签environment的属性id,表示的是全局唯一标识符.

transactionManager(数据事务配置)

配置方式

JBDC:使用JDBC来管理事务.

MANAGE:让容器来管理事务,什么也不做.

自定义:自定义数据库事务管理的方式.

dataSource(数据库配置)

ibatis提供了三种内建的数据源类型.

type=”[UNPOOLED|POOLED|JNDI]”

补充:也可使用其他数据源配置,通常使用POOLED.

UNPOOLED(非连接池数据库)

driver驱动的完全限定名
url数据库的url地址
username\
password\
defaultTransactionIsolationLevel连接事务的隔离级别

作为可选项,可以传递属性给数据库驱动. driver.encoding=UTF8 

相当于DriverManager.getConnection(url,properties)的效用.

可参考jdk中DriverManager内置的源码

@CallerSensitive
public static Connection getConnection(String url,
    java.util.Properties info) throws SQLException {

    return (getConnection(url, info, Reflection.getCallerClass()));
}

POOLED(连接池数据库)

driver驱动的完全限定名
url数据库的url地址
username\
password\
defaultTransactionIsolationLevel连接事务的隔离级别
poolMaximumActiveConnections可活动的连接数,默认值10
poolMaximumIdleConnections可存在的空闲连接数
poolMaximumCheckoutTime被强制返回之前,池中连接被check out的时间,默认值20000毫秒.
poolTimeToWait获取连接花费较长时间,连接池打印状态日志,并尝试重新连接;默认值20000毫秒,20.
poolMaximumLocalBadConnectionTolerance从连接池中,若获取的是坏连接,允许重新获取新连接的次数,默认值3.设置的次数不应当超过poolMaximumIdleConnections poolMaximumLocalBadConnectionTolerance之和.
poolPingQuery发送数据库的侦测查询,校验连接是否正常工作,且等待接收请求.默认值”NO PING QUERY SET”.
poolPingEnabled是否开启侦测查询.若开启,应当设置poolPingQuery的属性为一个可执行且速度快的sql语句,默认值false.
poolPingConnectionsNotUsedFor设置poolPingQuery的频率,建议设置时间同连接超时时间.默认值0,表示所有连接每刻都被侦测,仅当poolPingEnabledtrue时生效.

JNDI(JNDI数据源)

为了能够在例如EJB,或应用服务器中的容器使用数据源.

容器可以集中,或在外部配置数据源,然后放置一个JNDI上下文引用.

initial_context(可选属性,表示在InitialContext 中寻找上下文.如果未设置,

data_source将直接从InitialContext 中寻找.)

data_source(表示引用数据源实例位置的上下文路径,若提供了initial_context配置,

则会在其返回的上下文中寻找;没有提供则直接在InitialContext中寻找.)

前缀`env`可将配置属性传递给初始上下文.

env.encoding=UTF8

databaseIdProvider(数据库厂商标识)

ibatis根据不同数据库厂商的标识,执行不同的sql语句.

可参考java.sql.DatabaseMetaData.getDatabaseProductName()

<databaseIdProvider type="">     
	<property name="" value=""/> 
	...                          
</databaseIdProvider>            

mappers(映射文件关联)

效用主要是引用映射器.

<mappers>                                  
	<mapper class="" resource="" url="" /> 
	...                                    
	<package name="" />                    
	...                                    
</mappers>                                 

完整配置属性列表

<configuration>
	<properties />
	<settings />
	<typeAliases />
	<typeHandlers />
	<objectFactory />
	<plugins />
	<environments>
		<environment>
			<transactionManager />
			<dataSource />
		</environment>
	</environments>
	<databaseIdProvider />
	<mappers />
</configuration>

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值