Mybatis学习笔记(二):XML配置
1、核心配置
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
Mybatis九大类全局配置节点按照如下顺序排序,位置不能颠倒。
properties=>settings=>typeAliases=>typeHandlers=>objectFactory=>plugins=>environment=>databaseIdProvider=>mappers
2、环境配置(environments)
mybatis可以配置成适应多个环境,但每个SqlSessionFactory实例只能选择一种环境。
<?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核心配置文件--> <configuration> <!-- 引入外部配置文件 --> <properties resource="db.properties" /> <!--可以给实体类起别名--> <typeAliases> <typeAlias type="com.example.pojo.User" alias="User" /> <!--也可以使用包路径 <package name=""/>--> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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> <!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!--> <mappers> <mapper resource="com/example/dao/UserMapper.xml"/> </mappers> </configuration>
2.1事务管理器(transactionManager)
mybatis中有两种类型的事务管理器,type=[JDBC|MANAGED],默认JDBC
(1)使用JDBC的事务管理机制。
这种机制就是利用java.sql.Connection对象完成对事务的提交
(2)使用MANAGED的事务管理机制。
这种机制mybatis自身不会去实现事务管理,而是让程序的Web容器或者Spring容器来实现对事务的管理。
2.2数据源(dataSource)
dataSource元素使用标准的JDBC数据源接口来配置JDBC连接对象的资源,有三种内建的数据源类型:
- UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接
- POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式
- JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用
3、属性(properties)
properties为属性配置文件,它为上下文提供相关的资源,properties有三种配置资源的方式:
方式一:通过properties子元素配置
<properties> <property name="username" value="root"/> <property name="password" value="root"/> </properties>
方式二:通过properise的属性配置
<!-- 引入外部配置文件 --> <properties resource="db.properties" />
方式三:通过属性参数传递配置
即把属性传递到SqlSessionFactoryBuilder.build()中
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props); // ... or ... SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
Tip:当在mybatis配置文件中同时存在三种方式时,优先级顺序如下:
(1)首先读取properties子元素属性
(2)其次读取properties元素的属性(resource和url)(外部配置文件)
(3)最后读取作为方法参数传递的属性,并覆盖以读取的同名属性
三种方式,存在优先级,且排在后面的配置覆盖排在前面同名属性的配置,鉴于此,建议在配置时,不要使用混合方式。
4、设置(settings)
settings决定mybatis运行时行为,均有很多可配置的行为,如下为一个较完整的settings配置
<settings> <!--全局全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为true--> <setting name="cacheEnabled" value="true"/> <!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType属性来覆盖该项的开关状态。默认值为false --> <setting name="lazyLoadingEnabled" value="false"/> <!--当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载,默认值false--> <setting name="aggressiveLazyLoading" value="false"/> <!--是否允许单一语句返回多结果集,默认值为true --> <setting name="multipleResultSetsEnabled" value="true"/> <!--使用列标签代替列名,默认值为true --> <setting name="useColumnLabel" value="true"/> <!--允许 JDBC 支持自动生成主键,需要驱动兼容,默认值为false --> <setting name="useGeneratedKeys" value="false"/> <!--指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集 (无论是否嵌套),默认值为PARTIAL--> <setting name="autoMappingBehavior" value="PARTIAL"/> <!--指定发现自动映射目标未知列(或者未知属性类型)的行为。NONE: 不做任何反应; ARNING: 输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN);FAILING: 映射失败 (抛出 SqlSessionException),默认值为NONE --> <setting name="autoMappingUnknownColumnBehavior" value="NONE"/> <!--配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。默认值为SIMPLE --> <setting name="defaultExecutorType" value="SIMPLE"/> <!--设置超时时间,它决定驱动等待数据库响应的秒数。参数为任意正整数,未设置默认值--> <setting name="defaultStatementTimeout" value="25"/> <!--为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。参数为任意正整数, 未设置默认值 --> <setting name="defaultFetchSize" value="100"/> <!--允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false,默认值未false --> <setting name="safeRowBoundsEnabled" value="false"/> <!--允许在嵌套语句中使用分页(ResultHandler)。如果允许使用则设置为false。默认值为true --> <setting name="safeResultHandlerEnabled" value="true"/> <!--是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射,默认值为false --> <setting name="mapUnderscoreToCamelCase" value="false"/> <!--MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语 句执行上,对相同 SqlSession 的不同调用将不会共享数据。--> <setting name="localCacheScope" value="SESSION"/> <!--当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情 况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。默认值为OTHER --> <setting name="jdbcTypeForNull" value="OTHER"/> <!--指定哪个对象的方法触发一次延迟加载。 --> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <!--指定动态 SQL 生成的默认语言。--> <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/> <!--指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。--> <setting name="callSettersOnNulls" value="false"/> <!--当返回行的所有列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的 结果集 (i.e. collectioin and association)。(从3.4.2开始--> <setting name="returnInstanceForEmptyRow" value="false"/> <!--指定 MyBatis 增加到日志名称的前缀--> <setting name="logPrefix" value="log"/> <!--指定 MyBatis 所用日志的具体实现,未指定时将自动查找 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING。 --> <setting name="logImpl" value="LOG4J"/> <!--指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。CGLIB | JAVASSIST--> <setting name="proxyFactory" value="JAVASSIST"/> <!--指定VFS的实现--> <setting name="vfsImpl" value="vfs"/> <!--允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。 (从3.4.1开始)--> <setting name="useActualParamName" value="true"/> <!--指定一个提供Configuration实例的类。 这个被返回的Configuration实例用来加载被反序列化对象的懒加载属性值。 这个类必须包含一个签名方法static Configuration getConfiguration(). (从 3.2.3 版本开始)--> <setting name="configurationFactory" value="configClass"/> </settings>
5、类型别名(typeAliases)
类型别名为Java类型设置一个简短名字,它只与xml有关,用来减少类完全限定名的冗余
<typeAliases> <typeAlias type="demo.mybatis.entity.UserInfo" alias="UserInfo"/> </typeAliases>
这样配置后,任何使用demo.mybatis.entity.UserInfo的地方,都可用UserInfo来代替
除此之外,还可以指定一个包名,mybatis会在包名下搜索需要的Java Bean,比如:
<typeAliases> <package name="demo.mybatis.entity"/> </typeAliases>
在没注解的情况下,每个在demo.mybatis.entity中的Java Bean,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如demo.mybatis.entity.UserInfo的别名为userInfo.
若存在注解,则别名为注解名。
POJO设置别名
@Alias("Users") public class User{ }
Mapper.xml
<select id="getUserInfoById" resultType="Users"> SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id} </select>
6、其他配置
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- mybatis-generator-core
- mybatis-plus
- 通用mapper
7、映射文件(mappers)
mappers关联映射配置文件,即告诉mybatis到哪里去找映射配置文件。有四种基本方式可以关联映射配置文件:
方式一:使用相对于类路径的资源引用(推荐使用)
<!--类路径方式--> <mapper resource="demo/mybatis/resources/userInfo-config.xml"/>
方式二:使用class文件绑定注册
<mapper class="demo.mybatis.service.UserInfoAnnotation"/>
注意:
- 接口和mapper配置文件必须同名。
- 接口和mapper配置文件必须在同一个包下。
方式三:使用扫描包进行绑定注册
<package name="demo.mybatis.service"/>
注意:
- 接口和mapper配置文件必须同名。
- 接口和mapper配置文件必须在同一个包下。