MyBatis——mybatis-config.xml配置详细介绍

转自https://www.cnblogs.com/domi22/p/8047885.html

在定义sqlSessionFactory时需要指定MyBatis主配置文件

在spring的核心配置文件——applicationContext.xml中配置

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
	   
      <property name="configLocation" value="classpath:mybatis-config.xml" />  
	   
      <property name="dataSource" ref="dataSource" />  
bean>  

MyBatis配置文件中大标签configuration下子标签包括:

configuration

|— properties

|— settings

|— typeAliases

|— typeHandlers

|— objectFactory

|— plugins

|— environments

|— |— environment

|— |— |— transactionManager

|— |— |__ dataSource

|__ mappers

properties属性

properties和java的.properties的配置文件有关。配置properties的resource指定.properties的路径,然后再在properties标签下配置property的name和value,则可以替换.properties文件中相应属性值。

<properties resource="mysql.properties">  
    <property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>  
    <property name="jdbc.url" value="jdbc:mysql://localhost:3306/student_manager"/>  
    <property name="username" value="root"/>  
    <property name="password" value="limingnihao"/>  
properties>  

settings设置

这是MyBatis 修改操作运行过程细节的重要的步骤

<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="enhancementEfnabled" value="false" />  
	
	<setting name="autoMappingBehavior" value="SIMPLE" />  
	
	<setting name="aggressiveLazyLoading" value="true" />  
	
	<setting name="defaultExecutorType" value="SIMPLE"/>
	
 	<setting name="defaultStatementTimeout" value="25"/>
settings>  

typeAliases类型别名

类型别名是Java 类型的简称。它仅仅只是关联到XML 配置,简写冗长的JAVA 类名。例如:

<typeAliases>  
	
	<typeAlias alias="UserEntity" type="com.manager.data.model.UserEntity" />  
	<typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity" />  
	<typeAlias alias="ClassEntity" type="com.manager.data.model.ClassEntity" />  
typeAliases>  

使用这个配置,“UserEntity”可以在任何地方代替“com.manager.data.model.UserEntity”被使用。

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

映射的类型 别名
byte _byte
long _long
short _short
int _int
int _integer
double _double
float _float
boolean _boolean
String string
Byte byte
Long long
Short short
Integer int 、integer
Double double
Float float
Boolean boolean
Date date
BigDecimal decimal 、bigdecimal
Object object
Map map
HashMap hashmap
List list
ArrayList arraylist
Collection collection
Iterator iterator

typeHandlers类型句柄

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

类型处理器 Java类型 JDBC类型
BooleanTypeHandler Boolean,boolean 任何兼容的布尔值
ByteTypeHandler Byte,byte 任何兼容的数字或字节类型
ShortTypeHandler Short,short 任何兼容的数字或短整型
IntegerTypeHandler Integer,int 任何兼容的数字和整型
LongTypeHandler Long,long 任何兼容的数字或长整型
BigDecimalTypeHandler BigDecimal 任何兼容的数字或十进制小数类型
StringTypeHandler String CHAR和VARCHAR类型
ClobTypeHandler String CLOB和LONGVARCHAR类型
NStringTypeHandler String NVARCHAR和NCHAR类型
NClobTypeHandler String NCLOB类型
ByteArrayTypeHandler byte[] 任何兼容的字节流类型
BlobTypeHandler byte[] BLOB和LONGVARBINARY类型
DateTypeHandler Date(java.util) TIMESTAMP类型
DateOnlyTypeHandler Date(java.util) DATE类型
TimeOnlyTypeHandler Date(java.util) TIME类型
SqlTimestampTypeHandler Timestamp(java.sql) TIMESTAMP类型
SqlDateTypeHandler Date(java.sql) DATE类型
SqlTimeTypeHandler Time(java.sql) TIME类型
ObjectTypeHandler Any 其他或未指定类型
EnumTypeHandler Enumeration类型 VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。

你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要这样做的话,简单实现TypeHandler接口(org.mybatis.type),然后映射新的类型处理器类到Java类型,还有可选的一个JDBC类型。然后再typeHandlers中添加这个类型处理器。
新定义的类型处理器将会覆盖已经存在的处理Java的String类型属性和VARCHAR参数及结果的类型处理器。要注意MyBatis不会审视数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指定那是VARCHAR类型的字段,来绑定到正确的类型处理器上。这是因为MyBatis直到语句被执行都不知道数据类型的这个现实导致的。

public class LimingStringTypeHandler implements TypeHandler {  
  
     @Override  
    public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {  
          System.out.println("setParameter - parameter: " + ((String) parameter) + ", jdbcType: " + jdbcType.TYPE_CODE);  
          ps.setString(i, ((String) parameter));  
   } 
     @Override  
	public Object getResult(ResultSet rs, String columnName) throws SQLException {  
		System.out.println("getResult - columnName: " + columnName);  
		return rs.getString(columnName);  
	}  
	 @Override  
	public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {  
		System.out.println("getResult - columnIndex: " + columnIndex);  
		return cs.getString(columnIndex);  
	}  
}  

在配置文件的typeHandlers中添加typeHandler标签。

 <typeHandlers>  
	<typeHandler javaType="String" jdbcType="VARCHAR" handler="liming.student.manager.type.LimingStringTypeHandler"/>  
typeHandlers>  

ObjectFactory对象工厂

每次MyBatis 为结果对象创建一个新实例,都会用到ObjectFactory。默认的ObjectFactory 与使用目标类的构造函数创建一个实例毫无区别,如果有已经映射的参数,那也可能使用带参数的构造函数。

如果你重写ObjectFactory 的默认操作,你可以通过继承org.apache.ibatis.reflection.factory.DefaultObjectFactory创建一下你自己的。

ObjectFactory接口很简单。它包含两个创建用的方法,一个是处理默认构造方法的,另外一个是处理带参数构造方法的。最终,setProperties方法可以被用来配置ObjectFactory。在初始化你的ObjectFactory实例后,objectFactory元素体中定义的属性会被传递给setProperties方法。

public class LimingObjectFactory extends DefaultObjectFactory {  
    private static final long serialVersionUID = -399284318168302833L;  
 
     @Override  
     public Object create(Class type) {  
        	return super.create(type);  
      }  


    @Override  
    public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {  
      System.out.println("create - type: " + type.toString());  
      return super.create(type, constructorArgTypes, constructorArgs);  
    }  



  @Override  
  public void setProperties(Properties properties) {  

	System.out.println("setProperties - properties: " + properties.toString() + ", someProperty: " + properties.getProperty("someProperty"));  

		super.setProperties(properties);  

 	}  
}  

配置文件中添加objectFactory标签

 <objectFactory type="liming.student.manager.configuration.LimingObjectFactory">  
<property name="someProperty" value="100"/>  
objectFactory>  

environments环境

MyBatis 可以配置多个环境,这可以帮助你SQL 映射对应多种数据库等。

因为有这些场景:

1)为了开发设置不同的数据库配置

2)测试和生产环境数据库不同

3)有多个数据库却共享相同的模式,即对不同的数据库使用相同的SQL映射
我们可以配置几个数据库配置,我们可以这样:

	
    <environments default="oracle_jdbc">  
        <environment id="oracle_jdbc"> 
             
            <transactionManager type="JDBC" />  
            
            <dataSource type="POOLED">  
                <property name="driver" value="${jdbc.oracle.driverClassName}" />  
                <property name="url" value="${jdbc.oracle.url}" />  
                <property name="username" value="${jdbc.oracle.username}" />  
                <property name="password" value="${jdbc.oracle.password}" />   
            dataSource>  
        environment>  
        
        <environment id="mysql_jdbc">  
			  <property name="closeConnection" value="false"/>
			transactionManager>
-->
            <transactionManager type="JDBC" />  
            
            <dataSource type="POOLED">  
                <property name="driver" value="${jdbc.mysql.driverClassName}" />  
                <property name="url" value="${jdbc.mysql.url}" />  
                <property name="username" value="${jdbc.mysql.username}" />  
                <property name="password" value="${jdbc.mysql.password}" />   
            dataSource>  
        environment> 
    environments>

mappers映射器

告诉MyBatis 去哪寻找映射SQL 的语句。可以使用类路径中的资源引用,或者使用字符,输入确切的URL 引用。

<mappers>  
	<mapper resource="com/manager/data/maps/UserMapper.xml" />  
	<mapper resource="com/manager/data/maps/StudentMapper.xml" />  
	<mapper resource="com/manager/data/maps/ClassMapper.xml" />  
mappers>  

我们每个数据库,对应一个SqlSessionFactory,可以明确的获取哪一个数据库的SqlSessionFactory。

根据数据库环境,获取SqlSessionFactory:

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

我们的每个数据库信息都定义在environment中,我们看下这下面的配置:

1.transactionManager

<transactionManager type="JDBC" />

type取值范围:

JDBC:简单的使用JDBC的提交和回滚设置,一览与从数据员得到的链接来管理事务范围

MANAGED:这个配置几乎什么都没做,它从来不提交或回滚一个链接,而它让容器来管理事务的整个生命周期(比如spring、jee应用服务器的上下文)

在默认情况下,MANAGED会关闭连接,如果有时候不希望这样时,可以从连接中停止它,将claseConnection属性设置为false:

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
transactionManager>

2.dataSource
用来配置基本的JDBC数据源连接信息

<dataSource type="POOLED">  
   <property name="driver" value="${jdbc.mysql.driverClassName}" />  
   <property name="url" value="${jdbc.mysql.url}" />  
   <property name="username" value="${jdbc.mysql.username}" />  
   <property name="password" value="${jdbc.mysql.password}" />   
dataSource>

type取值范围:
UNPOOLED:这个数据源的实现是每次被请求时打开和关闭连接。速度会有一些慢,适用于简单的应用程序。
这种类型的数据源只需要配置下面的6种属性(最后一项为可选):

属性名 含义
driver JDBC驱动名
url JDBC URL地址
username 数据库用户名
password 数据库密码
defaultTransactionIsolationLevel 默认的链接事务隔离级别
driver.encoding utf-8(可选项)

POOLED:这是JDBC链接对象的数据源连接池的实现,用来避免创建新的链接实例时必要的连接和认证时间。适用于当前Web应用程序用来快速响应请求

这种类型的数据源除了需要配置UNPOOLED中的基础配置外,还可以配置下面的内容:

属性名 含义
poolMaximumActiveConnections 在任意时间正在使用连接的最大数量
poolMaximumIdleConnections 任意时间存在的最大空闲连接数,经验值建议设置在与poolMaximumActiveConnections相同即可
poolMaximumCheckoutTime 获取链接时如果没有idleConnection同时activeConnection达到最大值,则从activeConnections列表第一个链接开始,检查活动时间是否超过该设置的时间,如果超过,则被强制失效,返回链接。默认值为20000毫秒,建议设置在预期最大的SQL执行时间。

你可能感兴趣的:(xml,java,spring)