mybatis配置⽂件Mybatis开发中主要的配置⽂件:⼀、核⼼配置⽂件,⼆、映射⽂件。配置⽂件有哪些节点和属性??
⼀、核⼼配置⽂件
1、核⼼配置⽂件头部约束
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-////DTD Config 3.0//EN"
"/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.ltags.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>
View Code
Ⅲ、typeAliases(类型别名)
为什么使⽤类型别名,因为Java类型的全名称都是很长便于维护,类型别名:给Java类型设置⼀个简短名字,它只与xml有关 typeAliases有两种配置⽅式:
⽅式⼀、配置具体Java类型
<typeAliases>
<typeAlias type="ity.UserInfo" alias="userInfo"/>
</typeAliases>
⽅式⼆、指定Java类型所在包,mybatis⾃动扫描包中的PO类,⾃动定义别名,别名就是类迷名(⾸字母不区分⼤⼩写)<typeAliases>
<package name="ity"/>
</typeAliases>
任何使⽤ity.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
类型
session如何设置和读取NStringTypeHandler String NVARCHAR和NCHAR类
型
NClobTypeHandler String NCLOB类型
LONGVARBINARY类型
DateTypeHandler Date(java.util)TIMESTAMP类型
TimeOnlyTypeHandler Date(java.util)TIME类型
SqlTimestampTypeHandler Timestamp(java.sql)TIMESTAMP类型
SqlDateTypeHandler Date(java.sql)DATE类型
SqlTimeTypeHandler Time(java.sql)TIME类型
串类型,作为代码存储(⽽
不是索引)。
Ⅴ、mappers(映射配置)
mappers关联映射配置⽂件,即告诉mybatis到哪⾥去映射配置⽂件。有四种基本⽅式可以关联映射配置⽂件:
⽅式⼀、通过resource加载单个映射⽂件
<mapper resource="demo/mybatis/l"/>
⽅式⼆、使⽤完全限定资源定位符URL
假设映射⽂件路径为:E:\l
则采⽤url⽅式如下:(格式为file:///url)
<mapper url="file:///E:/l"/>
⽅式三、使⽤映射器接⼝实现类的完全限定名
注意:需要将mapper接⼝类名和l映射⽂件名保持⼀致,且在⼀个⽬录中
配置映射⽂件(l)
<mapper namespace="batis.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="batis.po.User">
select * from t_user where id = #{id}
</select>
</mapper>
定义映射接⼝:
batis.mapper;
batis.po.User;
public interface UserMapper {
public User findUserById(int id);
}
配置映射
<mapper class="batis.mapper.UserMapper"/>
⽅式四、批量加载mapper(推荐使⽤)
指定映射器接⼝的包名,mybatis⾃动扫描包下所有的
<package name="batis.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 –结果映射,⽤来描述如何从数据库结果集映射到你想要的对象。
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.del.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>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论