MyBatis学习笔记(二)全局配置文件 mybatis-config.xml详解

MyBatis学习笔记(二)全局配置文件 mybatis-config.xml详解

标签书写顺序

  • properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,
    objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)
  • 鼠标放在<configuration> 上即可看到以上信息

标签详解

properties

  • mybatis 可以使用properties来引入外部properties配置文件内

    • resource: 引入类路径下的资源
    • url:引入网络路径或者磁盘路径下的资源
  • <properties resource="dbconfig.properties"></properties>
    
  • 因为和 spring 整合的时候,连接数据源用spring配置,所以这个标签不常用

settings

  • settiongs :MyBatis运行时行为设置,包含很多的设置项

    • setting:用来设置每一个设置项
      • name: 设置项名
      • value:设置项取值
  • 示例

    <settings>
        <!-- mapUnderscoreToCamelCase: 是否开启自动驼峰命名规则 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
  • 以下是MyBatis其他参数和值

setting的参数名

设置参数 描述 有效值 默认值
cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关。 true | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 true | false false
aggressiveLazyLoading 当启用时,带有延迟加载属性的对象的加载与否完全取决于对任意延迟属性的调用;反之,每种属性将会按需加载。 true | false true
multipleResultSetsEnabled 是否允许单一语句返回多结果集(需要兼容驱动)。 true | false true
useColumnLabel 使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 true | false true
useGeneratedKeys 允许 JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如Derby)。 true | false False
autoMappingBehavior 指定 MyBatis 是否以及如何自动映射指定的列到字段或属性。NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。FULL 会自动映射任意复杂的结果集(包括嵌套和其他情况)。 NONE, PARTIAL, FULL PARTIAL
defaultExecutorType 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新。 SIMPLE REUSE BATCH SIMPLE
defaultStatementTimeout 设置超时时间,它决定驱动等待数据库响应的秒数。 Any positive integer Not Set (null)
safeRowBoundsEnabled 允许在嵌套语句中使用行分界(RowBounds)。 true | false False
mapUnderscoreToCamelCase 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名A_COLUMN 到经典 Java属性名 aColumn 的类似映射。 true | false False
localCacheScope MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。默认值为SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 SESSION | STATEMENT SESSION
jdbcTypeForNull 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER OTHER
lazyLoadTrigger Methods 指定哪个对象的方法触发一次延迟加载。 A method name list separated by commas equals,clone, hashCode, toString
defaultScripting Language 指定动态 SQL 生成的默认语言。 A type alias or fully qualified class name. org.apache.ibatis. scripting.xmltags. XMLDynamic LanguageDriver
callSettersOnNulls 指定当结果集中值为 null的时候是否调用映射对象的 setter(map 对象时为put)方法,这对于有Map.keySet() 依赖或 null值初始化的时候是有用的。注意原始类型(int、boolean等)是不能设置成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

typeAilases

  • 别名处理器,可以为java类型起别名

  • typeAilas:为某个java类型起别名

    • type:指定要起别名的类型的全类名;默认别名就是类名小写
    • alias:指定新的别名
  • package: 为某个包下的所有类批量起别名,默认还是类名小写

    • name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
    • 批量起别名的情况下,可以使用 @Alias 注解为某个类型指定新的别名, 注解写在实体类类名上一行
  • 示例

    <!--typeAliases:别名处理器:可以为java类型起别名 
      -->
    <typeAliases>
        <!-- 
           typeAilas:为某个java类型起别名
            type:指定要起别名的类型的全类名;默认别名就是类名小写
            alias:指定新的别名
           -->
        <typeAlias type="com.fu.bean.Employee" />
        <!-- 
           package: 为某个包下的所有类批量起别名,默认还是类名小写
            name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
       -->
        <!-- <package name="com.fu.bean"/> -->
        <!-- 批量起别名的情况下,可以使用 @Alias 注解为某个类型指定新的别名, 注解写在实体类类名上一行 -->
    </typeAliases>
    
    实体类注解写法
    @Alias("emp")
    public class Employee {
    	。。。
    }
    
  • 注意:

    • 别名不区分大小写
    • MyBatis 已经 为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的 ,我们在起别名的时候千万不要占用已有的别名。
    • 不推荐使用此属性

typeHandlers

  • 类型处理器
    • 日期类型的处理
      • 日期和时间的处理,JDK1.8以前一直是个头疼的
        问题。我们通常使用JSR310规范领导者Stephen
        Colebourne创建的Joda-Time来操作。1.8已经实
        现全部的JSR310规范了。
      • 日期时间处理上,我们可以使用MyBatis基于
        JSR310(Date and Time API)编写的各种日期
        时间类型处理器。
      • MyBatis3.4以前的版本需要我们手动注册这些处
        理器,以后的版本都是自动注册的
    • 自定义类型 处理器
      • 我们可以重写类型处理器或创建自己的类型处理
        器来处理不支持的或非标准的类型。
      • 步骤:
        1. 实现org.apache.ibatis.type.TypeHandler接口或
          者继承org.apache.ibatis.type.BaseTypeHandler
        2. 指定其映射某个JDBC类型(可选操作)
        3. 在mybatis全局配置文件中注册
  • 详情参见

plugins插件

  • 插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。
  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
    • Executor 是 MyBatis 对外提供的一个操作接口类,其中包含了 query 查询、update 修改、commit 提交、rollback 回滚等核心方法。
  • ParameterHandler (getParameterObject, setParameters)
    • 处理参数
  • ResultSetHandler (handleResultSets, handleOutputParameters)
    • 结果集
  • StatementHandler (prepare, parameterize, batch, update, query)
    • 预编译状态

environments

  • environments: 运行环境,可以配置多种环境

    • default 属性
      • 指定默认使用哪种环境, 值为 子标签中environment-id的值
      • 通过更改default代表environment-id的值,可以达到快速切换环境的效果
  • environment:配置一个具体的环境信息;必须要有2个子标签

    • id: 代表当前环境的唯一标识
    • transactionManager 和 dataSource
  • transactionManager:事务管理器

    • type:事务管理器类型;取值为:JDBC|MANAGED|自定义,这两个都是别名
      • JDBC:
        • 使用了 JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。
        • JdbcTransactionFactory
      • MANAGED:
        • 不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)
        • ManagedTransactionFactory
      • 自定义事务管理器:
        • 实现TransactionFactory接口,书写实现类
        • type指定为全类名
  • dataSource:数据源

    • type: 数据源类型;取值为UNPOOLED | POOLED | JNDI | 自定义;
      • UNPOOLED:
        • 不使用连接池
        • UnpooledDataSourceFactory
      • POOLED:
        • 使用连接池
        • PooledDataSourceFactory
      • JNDI:
        • 在EJB 或应用服务器这类容器中查找指定的数据源
        • JndiDataSourceFactory
      • 自定义:
        • 实现DataSourceFactory接口,定义数据源的获取方式。
        • type指定为全类名
  • 示例

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    
  • 实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置

databaseIdProvider

  • databaseIdProvider 数据库环境

  • MyBatis可以根据不同的数据库厂商执行不同的语句。

  • 演示

    <!-- mybatis-config.xml文件 -->
    <databaseIdProvider type="DB_VENDOR">
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
        <property name="SQL Server" value="sqlserver"/>
    </databaseIdProvider>
    <!-- EmployeeMapper.xml文件 -->
    <select id="getEmpById" resultType="emp">
        select * from tbl_employee where id = #{id}
    </select>
    <select id="getEmpById" resultType="emp" databaseId="mysql">
        select * from tbl_employee where id = #{id}
    </select>
    <!-- 在不同的数据库环境下的不同的查询方式
    	<select id="getEmpById" resultType="com.fu.bean.Employee" databaseId="oracle">
    		select EMPLOYEE_ID id,LAST_NAME lastName,EMAIL email form employees where EMPLOYEE_ID = #{id}
    	</select>
     -->
    
  • databaseIdProvider 数据库环境,根据不同的数据库厂商执行不同的语句。

    • type=“DB_VENDOR”
      • VendorDatabaseIdProvider
      • 作用是就是得到数据库厂商的标识(连接数据库的驱动自带的,通过getDatabaseProductName()方法获取)
        • mybatis就能根据数据库厂商标识来执行不同的sql
      • 数据库厂商标识:MySQL, Oracle, SQL Server, xxxx
    • property: 为不同的数据库厂商起别名
      • name: 数据库厂商标识
      • value: 为标识起一个别名,方便SQL语句使用databaseId属性引用
  • EmployeeMapper.xml文件中 databaseId

    • 如果不指定该属性,则默认为主配置文件中 environments-default 所代表的配置环境的值
    • databaseId = “mysql” , 表示该 select 标签是在 mysql 环境下才发送的SQL语句
      • 不指定数据库环境的select不会被执行

mappers

  • mappers:将sql映射注册到全局配置中;

    • 两个子标签 : mapper 、package(推荐)
  • mapper:

    • 注册一个sql映射;两种方式
    • 一、注册配置文件方式
      • resource: 引用类路径下的sql映射文件
        • mybatis/mapper/EmployeeMapper.xml
      • url:引用网络路径或者磁盘路径下的SQL映射文件
        • file:///mapper/EmployeeMapper.xml
    • 二、注册接口方式
      • class:引用(注册)接口; 写接口的全类名
        1. 有sql映射文件;映射文件必须与接口同名,并且放在与接口同一目录下。
        2. 没有sql映射文件;所有的sql都是利用注解写在接口中
    • 推荐:
      • 比较重要的、复杂的Dao接口,用SQL映射文件
      • 不重要的、简单的Dao接口,为了开发快速,可以使用注解的方式
  • package:批量注册

    • 这种方式要求
      • 如果使用映射文件,则SQL映射文件名必须和接口名相同并且在同一目录下
      • 使用注解的方式,则没有要求
    • 优点:
      • 直接写一个包名即可,mybatis会自动扫描该包下的文件
      • 不需要每个接口都写一个mapper映射
  • 示例

    <mappers>
        <!-- <mapper resource="EmployeeMapper.xml" /> -->
        <!-- <mapper class="com.fu.dao.EmployeeMapper"/>-->
        <!-- <mapper class="com.fu.dao.EmployeeMapperAnnotation"/> -->
        <package name="com.fu.dao"/>
    </mappers>
    
  • 为了使工程看起来整洁,可以创建一个 config 根目录专门放置配置文件

    • 创建一个包名和接口的包名一致,然后配置文件放到config下,仍然可以达到接口和配置文件必须在同一包下的条件
    • 在这里插入图片描述

一个参考的mybatis-config.xml模板

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 引入外部properties配置文件内容 -->
	<properties resource="dbconfig.properties"></properties>
	
	<settings>
		<!-- mapUnderscoreToCamelCase: 是否开启自动驼峰命名规则 -->
		<setting name="mapUnderscoreToCamelCase" value="true"/>
		<!-- jdbcTypeForNull: 指定值为null时,jdbc的类型 -->
		<setting name="jdbcTypeForNull" value="NULL"></setting>
		<!-- 懒加载策略
			显式指定每个需要配置的值,即使使默认的。防止版本更新带来的问题
		 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
		<!-- 开启全局二级缓存配置 -->
		<setting name="cacheEnabled" value="true"/>
	</settings>
	
	<!--typeAliases:别名处理器:可以为java类型起别名  -->
	<typeAliases>
		<package name="com.fu.bean"/>
	</typeAliases>
	
	<!-- environments: 环境集合,可以配置多种环境 -->
	<environments default="dev_mysql">
		<environment id="dev_mysql">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- databaseIdProvider 数据库环境 -->
	<databaseIdProvider type="DB_VENDOR">
		<property name="MySQL" value="mysql"/>
		<property name="Oracle" value="oracle"/>
		<property name="SQL Server" value="sqlserver"/>
	</databaseIdProvider>
	
	<!-- mappers:将sql映射注册到全局配置中 -->
	<mappers>
		<!-- package: 批量注册 -->
		<package name="com.fu.dao"/>
	</mappers>
</configuration>

发布了21 篇原创文章 · 获赞 5 · 访问量 2067

猜你喜欢

转载自blog.csdn.net/fan521dan/article/details/97904068