Mybatis开发中主要的配置文件:一、核心配置文件,二、映射文件。配置文件有哪些节点和属性??
一、核心配置文件
1、核心配置文件头部约束
<?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">
2、Mybatis九大类全局配置节点
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
Ⅰ、properties(属性)
上下文提供相关的资源,properties有三种配置资源的方式:
方式一:通过properties子元素配置
<properties> <property name="username" value="root"/> <property name="password" value="root"/> </properties>
方式二:通过properise的属性配置
<properties resource="com/mybatis/resources/jdbc.properties"/>
在environments节点中引用username和password变量
<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>
方式三:通过参数传递配置
new SqlSessionFactoryBuilder().build(reader, props); //or new SqlSessionFactoryBuilder().build(reader, environment, props);
当在mybatis配置文件中同时存在三种方式时,优先级顺序如下:
首先读取properties子元素属性
其次读取properties元素的属性(resource和url)
最后读取作为方法参数传递的属性,并覆盖以读取的同名属性
三种方式,存在优先级,后面的配置覆盖排在前面同名属性的配置,建议不要混合使用。
Ⅱ、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>
Ⅲ、typeAliases(类型别名)
为什么使用类型别名,因为Java类型的全名称都是很长便于维护,类型别名:给Java类型设置一个简短名字,它只与xml有关
typeAliases有两种配置方式:
方式一、配置具体Java类型
<typeAliases> <typeAlias type="com.mybatis.entity.UserInfo" alias="userInfo"/> </typeAliases>
方式二、指定Java类型所在包,mybatis自动扫描包中的PO类,自动定义别名,别名就是类迷名(首字母不区分大小写)
<typeAliases> <package name="com.mybatis.entity"/> </typeAliases>
任何使用com.mybatis.entity.UserInfo的地方,都可用userInfo来代替
Ⅳ、typeHandlers(类型处理器)
mybatis中通过typeHandlers完成jdbc类型和java类型的转换
通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义
mybatis支持类型处理器:
类型处理器 |
Java类型 |
JDBC类型 |
BooleanTypeHandler |
Boolean,boolean |
任何兼容的布尔值 |
ByteTypeHandler |
Byte,byte |
任何兼容的数字或字节类型 |
ShortTypeHandler |
Short,short |
任何兼容的数字或短整型 |
IntegerTypeHandler |
Integer,int |
任何兼容的数字和整型 |
LongTypeHandler |
Long,long |
任何兼容的数字或长整型 |
FloatTypeHandler |
Float,float |
任何兼容的数字或单精度浮点型 |
DoubleTypeHandler |
Double,double |
任何兼容的数字或双精度浮点型 |
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 |
任意 |
其他或未指定类型 |
EnumTypeHandler |
Enumeration类型 |
VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。 |
Ⅴ、mappers(映射配置)
mappers关联映射配置文件,即告诉mybatis到哪里去找映射配置文件。有四种基本方式可以关联映射配置文件:
方式一、通过resource加载单个映射文件
<mapper resource="demo/mybatis/resources/userInfo-config.xml"/>
方式二、使用完全限定资源定位符URL
假设映射文件路径为:E:\userInfo-config.xml
则采用url方式如下:(格式为file:///url)
<mapper url="file:///E:/userInfo-config.xml"/>
方式三、使用映射器接口实现类的完全限定名
注意:需要将mapper接口类名和mapper.xml映射文件名保持一致,且在一个目录中
配置映射文件(xxxMapper.xml)
<mapper namespace="com.xxx.mybatis.mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="com.xxx.mybatis.po.User"> select * from t_user where id = #{id} </select> </mapper>
定义映射接口:
package com.xxx.mybatis.mapper; import com.xxx.mybatis.po.User; public interface UserMapper { public User findUserById(int id); }
配置映射
<mapper class="com.xxx.mybatis.mapper.UserMapper"/>
方式四、批量加载mapper(推荐使用)
指定映射器接口的包名,mybatis自动扫描包下所有的
<package name="com.xxx.mybatis.mapper"/>
二、映射配置文件
Mapper映射文件主要是用来配置SQL映射语句的
Mapper映射文件节点
mapper:只有一个属性namespace
一是用于区分不同的mapper(在不同的mapper文件里,子元素的id可以相同,mybatis通过namespace和子元素的id联合区分)
二是与接口关联(mybatis通过接口的完整名称查找对应的mapper配置,因此namespace的命名务必小心一定要某接口同名)。
select:映射查询
<select <!-- 1. id (必须配置) id是命名空间中的唯一标识符,可被用来代表这条语句。 一个命名空间(namespace) 对应一个dao接口, 这个id也应该对应dao里面的某个方法(相当于方法的实现),因此id 应该与方法名一致 --> id="findxxx" <!-- 2. parameterType (可选配置, 默认为mybatis自动选择处理) 将要传入语句的参数的完全限定类名或别名, 如果不配置,mybatis会通过ParameterHandler 根据参数类型默认选择合适的typeHandler进行处理 parameterType 主要指定参数类型,可以是int, short, long, string等类型,也可以是复杂类型(如对象) --> parameterType="int" <!-- 3. resultType (resultType 与 resultMap 二选一配置) resultType用以指定返回类型,指定的类型可以是基本类型,可以是java容器,也可以是javabean
--> resultType="hashmap" <!-- 4. resultMap (resultType 与 resultMap 二选一配置) resultMap用于引用我们通过 resultMap标签定义的映射类型,这也是mybatis组件高级复杂映射的关键 --> resultMap="personResultMap" <!-- 5. flushCache (可选配置) 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false --> flushCache="false" <!-- 6. useCache (可选配置) 将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true --> useCache="true" <!-- 7. timeout (可选配置) 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)--> timeout="10000" <!-- 8. fetchSize (可选配置) 这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)--> fetchSize="256" <!-- 9. statementType (可选配置) STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED--> statementType="PREPARED" <!-- 10. resultSetType (可选配置) FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个,默认值为 unset (依赖驱动)--> resultSetType="FORWARD_ONLY">
insert :映射插入
update:映射更新
delete:映射删除
<insert <!-- 1. id (必须配置) id是命名空间中的唯一标识符,可被用来代表这条语句。 一个命名空间(namespace) 对应一个dao接口, 这个id也应该对应dao里面的某个方法(相当于方法的实现),因此id 应该与方法名一致 --> id="insertUser" <!-- 2. parameterType (可选配置, 默认为mybatis自动选择处理) 将要传入语句的参数的完全限定类名或别名, 如果不配置,mybatis会通过ParameterHandler 根据参数类型默认选择合适的typeHandler进行处理 parameterType 主要指定参数类型,可以是int, short, long, string等类型,也可以是复杂类型(如对象) --> parameterType="com.demo.User" <!-- 3. flushCache (可选配置,默认配置为true) 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句) --> flushCache="true" <!-- 4. statementType (可选配置,默认配置为PREPARED) STATEMENT,
PREPARED
CALLABLE 。
MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 --> statementType="PREPARED" <!-- 5. keyProperty (可选配置, 默认为unset)(仅对 insert 和 update 有用)唯一标记一个属性,
MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。
如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 --> keyProperty=""
<!-- 6. keyColumn (可选配置) (仅对 insert 和 update 有用)
通过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。
如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。 --> keyColumn="" <!-- 7. useGeneratedKeys (可选配置, 默认为false)(仅对 insert 和 update 有用)
MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。 --> useGeneratedKeys="false" <!-- 8. timeout (可选配置, 默认为unset, 依赖驱动) 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 --> timeout="20">
cache:给定命名空间的缓存配置
cache-ref:其他命名空间缓存配置的引用
<!-- cache- 配置本定命名空间的缓存。 type- cache实现类,默认为PERPETUAL,可以使用自定义的cache实现类(别名或完整类名皆可) eviction- 回收算法,默认为LRU,可选的算法有: LRU– 最近最少使用的:移除最长时间不被使用的对象。 FIFO– 先进先出:按对象进入缓存的顺序来移除它们。 SOFT– 软引用:移除基于垃圾回收器状态和软引用规则的对象。 WEAK– 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。 flushInterval- 刷新间隔,默认为1个小时,单位毫秒 size- 缓存大小,默认大小1024,单位为引用数 readOnly- 只读 --> <cache type="PERPETUAL" eviction="LRU" flushInterval="60000" size="512" readOnly="true" /> <!-- cache-ref–从其他命名空间引用缓存配置。 如果你不想定义自己的cache,可以使用cache-ref引用别的cache。因为每个cache都以namespace为id,所以cache-ref只需要配置一个namespace属性就可以了。需要注意的是,如果cache-ref和cache都配置了,以cache为准。 --> <cache-ref namespace="com.someone.application.data.SomeMapper"/>
resultMap:结果集取出的数据映射到相应的Java对象
<!-- resultMap –结果映射,用来描述如何从数据库结果集映射到你想要的对象。 1.type 对应类型,可以是javabean, 也可以是其它 2.id 必须唯一, 用于标示这个resultMap的唯一性,在使用resultMap的时候,就是通过id指定 --> <resultMap type="" id=""> <!-- id, 唯一性,注意啦,这个id用于标示这个javabean对象的唯一性, 不一定会是数据库的主键(不要把它理解为数据库对应表的主键) property属性对应javabean的属性名,column对应数据库表的列名 (这样,当javabean的属性与数据库对应表的列名不一致的时候,就能通过指定这个保持正常映射了) --> <id property="" column=""/> <!-- result与id相比, 对应普通属性 --> <result property="" column=""/> <!-- constructor对应javabean中的构造方法 --> <constructor> <!-- idArg 对应构造方法中的id参数;--> <idArg column=""/> <!-- arg 对应构造方法中的普通参数;--> <arg column=""/> </constructor> <!-- 聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称; collection,对应javabean中容器类型, 是实现一对多的关键 property 为javabean中容器对应字段名 column 为体现在数据库中列名 ofType 就是指定javabean中容器指定的类型 不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载: 1\. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活; 2\. resultMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。 --> <collection property="" column="" ofType=""></collection> <!-- 联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。 association 为关联关系,是实现N对一的关键。 property 为javabean中容器对应字段名 column 为体现在数据库中列名 javaType 指定关联的类型 不同情况需要告诉MyBatis 如何加载一个联合。MyBatis可以用两种方式加载: 1\. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活; 2\. resultMap: 使用一个嵌套的结果映射来处理,通过join查询结果集,映射成Java实体类型。 --> <association property="" column="" javaType=""></association> <!-- 有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句。 定义鉴别器指定了column和javaType属性。列是MyBatis查找比较值的地方。JavaType是需要被用来保证等价测试的合适类型(尽管字符串在很多情形下都会有用)。 下面这个例子为,当classId为20000001时,才映射classId属性。 --> <discriminator column="CLASS_ID" javaType="String" jdbcType="VARCHAR"> <case value="20000001" resultType="liming.student.manager.data.model.StudentEntity" > <result property="classId" column="CLASS_ID" javaType="String" jdbcType="VARCHAR"/> </case> </discriminator> </resultMap>
sql:配置可以其他语句引用的SQL语句块
<!-- sql –可以重用的SQL块,可以被其他数据库操作语句引用。 --> <sql id="userColumns"> userid,username,password</sql> <select id="queryUsers" parameterType="UserDto" resultType="UserDto" useCache="false"> select <include refid="userColumns"/> from t_user t where t.username = #{username} </select>