目录
3.8 databaseIdProvider(数据库厂商标识)
3.9.2 insert、update、delete:更新语句,一般返回删除数量
3.9.4 sql:sql语句块标签,定义可复用的sql语句
一、简介
mybatis框架本身其实只有一个配置文件,及mybatis-config.xml,只是这个配置文件中有一个属性mappers(映射器),可能会包含大量的SQL映射文件,所以通常会单独扩展,形成一个个单独的xxxMapper.xml映射文件。
二、Mybatis的配置层次:
- -configuration(根标签,配置)
- -properties(属性)
- -settings(设置集)
- -setting(定义全局性设置,例如开启二级缓存)
- -typeAiases(类型别名集)
- -typeAlias(为一些类定义别名)
- -typeHandlers(类型处理器:定义Java类型与数据库中数据类型之间的转换关系)
- -objectFactory(对象工厂)
- -plugins(插件集)
- -plugin(mybatis插件或自定义插件)
- -environments(配置mybatis的环境)
- -environment(环境变量:支持多套环境变量,如开发环境,生产环境)
- -transactionManager(事务管理器,默认JDBC)
- -DataSource(数据源,一般使用连接池)
- -databaseIdProvider(数据库厂商标识)
- -mappers(指定映射文件或映射类)
三、xml核心配置
3.1 properties(属性标签)
属性标签用来提供动态的属性配置,可采用以下几种方式进行配置
1. 直接配置
例如数据源信息配置,设置好的属性值在整个配置文件中可以进行动态引用,使用${}可以引用已配置的属性值。
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/myDB"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
2. 属性文件配置
使用java中的属性配置文件,把属性配置元素具体到配置文件中,然后在properties标签中使用resource属性引入,利用配置文件中的key名称作为占位符,就可以取到实际值
<!-- 引入属性配置文件 -->
<properties resource="jdbc.properties"></properties>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
3. url引入
类似于属性文件,只是文件是使用 url 指定远程的配置文件。
注意:properties 元素允许配置 resource 属性或 url 属性,只能二选一,要么使用 resource 指定本地的配置文件,要么使用 url 指定远程的配置文件,因为 Mybatis 在加载配置时,如果发现 url 与 resource 同时存在,会抛出异常禁止
<!-- 配置url-->
<properties url="http://xxxx"></properties>
4. Java代码
在代码中构建java.util.Properties 属性对象并传递到 SqlSessionFactoryBuilder.build() 方法中
// 构建属性对象
Properties props = new Properties();
props.setProperty("driver","com.mysql.jdbc.Driver");
props.setProperty("url","jdbc:mysql://127.0.0.1:3306/myDB");
props.setProperty("username","user1");
props.setProperty("password","123456");
// 传递属性构建 SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);
5. 优先级
除了属性文件引入和url引入不可重复外,其它的方式都允许配置,优先级别如下:
- 在代码中构建java.util.Properties 属性对象
- 属性文件引入和url引入
- 直接在properties内部子标签元素property中设置的属性
3.2 settings(设置标签)
settings标签用于动态改变mybatis的运行状态,mybatis提供了大量的设备属性,总结了一下如下所示
<settings>
<!-- 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存 支持 true | false 默认 true -->
<setting name="cacheEnabled" value="true"/>
<!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。
支持 true | false 默认 false -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。
支持 true | false 默认 false (在 3.4.1 及之前的版本中默认为 true) -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 是否允许单个语句返回多结果集(需要数据库驱动支持)。 支持 true | false 默认 true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。 支持 true | false 默认 true -->
<setting name="useColumnLabel" value="true"/>
<!-- s 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,
但仍可正常工作(如 Derby)。 支持 true | false 默认 false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。
FULL 会自动映射任何复杂的结果集(无论是否嵌套)。 支持 NONE, PARTIAL, FULL 默认 PARTIAL -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 指定发现自动映射目标未知列(或未知属性类型)的行为。NONE:不做任何反应
WARNING: 输出警告日志( org.apache.ibatis.session.AutoMappingUnknownColumnBehavior 的日志等级必须设置为 WARN)
FAILING: 映射失败 (抛出 SqlSessionException) 支持 NONE, WARNING, FAILING 默认 NONE -->
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<!-- 置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement);
BATCH 执行器不仅重用语句还会执行批量更新。 支持 SIMPLE REUSE BATCH 默认 SIMPLE -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 设置超时时间,它决定数据库驱动等待数据库响应的秒数。 支持任意正整数默认未设置 (null) -->
<setting name="defaultStatementTimeout" value="25"/>
<!-- 设置结果集获取数量,此参数可以在查询设置中被覆盖。支持任意正整数默认未设置 (null) -->
<setting name="defaultFetchSize" value="100"/>
<!-- 是否允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为 false。 支持 true | false 默认 false -->
<setting name="safeRowBoundsEnabled" value="false"/>
<!-- 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 支持 true | false 默认 false -->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。
若设置值为 STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。
支持 SESSION | STATEMENT 默认 SESSION -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,
比如 NULL、VARCHAR 或 OTHER。 JdbcType 常量,常用值:NULL、VARCHAR 或 OTHER。 默认 OTHER -->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!-- 指定对象的哪些方法触发一次延迟加载。 支持 用逗号分隔的方法列表。 默认 equals,clone,hashCode,toString -->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
<!-- 指定动态 SQL 生成使用的默认脚本语言。 支持 一个类型别名或全限定类名。 默认 org.apache.ibatis.scripting.xmltags.XMLLanguageDriver -->
<setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
<!-- 指定 Enum 使用的默认 TypeHandler 。(新增于 3.4.5) 支持 一个类型别名或全限定类名。 默认 org.apache.ibatis.type.EnumTypeHandler -->
<setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
<!-- 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。
注意基本类型(int、boolean 等)是不能设置成 null 的。 支持 true | false 默认 false -->
<setting name="callSettersOnNulls" value="false"/>
<!-- 当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。
(新增于 3.4.2) 支持 true | false 默认 false -->
<setting name="returnInstanceForEmptyRow" value="false"/>
<!-- 指定 MyBatis 增加到日志名称的前缀。 支持 任何字符串 默认 未设置 -->
<setting name="logPrefix" />
<!-- 定 MyBatis 所用日志的具体实现,未指定时将自动查找。 支持 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 默认 未设置 -->
<setting name="logImpl" />
<!-- 指定 Mybatis 创建可延迟加载对象所用到的代理工具。 支持 CGLIB | JAVASSIST 默认 JAVASSIST -->
<setting name="proxyFactory" value="JAVASSIST"/>
</settings>
3.3 typeAliases(类型别名)
用于给Java类型设置一个简称,仅用于XML配置,是为了降低冗余的全限定类名书写。类型别名在mybatis中分为系统内置和用户自定义两类,在解析配置文件时会把typeAliases实例存储进configuration对象中。使用时可直接获取。
3.3.1 自定义别名
自定义别名可以直接设置,如下,在使用com.it.learn.Author的地方可以直接使用别名Author
<typeAliases>
<typeAlias alias="Author" type="com.it.learn.Author"/>
</typeAliases>
但当某个项目中特别多java类需要设置别名时,可以直接指定包名扫描,如下,每个在com.it.learn包中的Java类,都可以使用首字母小写的名称来作为别名。但如果Java类上存在@Alias注解,则使用注解value值作为别名
<typeAliases>
<package name="com.it.learn"/>
</typeAliases>
3.3.2 系统内置别名
mybatis已经针对大部分常见的java类型内建了相应的类型别名,不区分大小写,基本上都是类名首字母小写,同时也支持数组类型,只需要加上'[]'即可。但需要注意的是,Java中的基本类型和包装类不区分大小写的情况下是同名的,因此基本类型的别名前缀都有下划线'_',而包装类没有。mybatis的注册信息源码在org.apache.ibatis.type.TypeAliasRegistry#TypeAliasRegistry方法中,有兴趣的朋友可以看看。
3.4 typeHandlers(类型处理器)
mybatis在赋值预处理SQL语句(PreparedStatement)中所需要的参数或从结果集ResultSet中获取对象时,都会使用类型处理器将获取到的值转换为Java类型。也即处理Java类型和JDBC类型之间的映射关系,默认的一些类型处理器如下所示:
handler名称 | Java类型 | JDBC类型 |
BooleanTypeHandler | java.lang.Boolean, boolean | BOOLEAN |
ByteTypeHandler | java.lang.Byte, byte | BYTE |
ShortTypeHandler | java.lang.Short, short | NUMERIC 或 SMALLINT |
IntegerTypeHandler | java.lang.Integer, int | NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | NUMERIC 或 BIGINT |
FloatTypeHandler | java.lang.Float, float | NUMERIC 或 FLOAT |
DoubleTypeHandler | java.lang.Double, double | NUMERIC 或 DOUBLE |
BigDecimalTypeHandler | java.math.BigDecimal | NUMERIC 或 DECIMAL |
StringTypeHandler | java.lang.String | CHAR, VARCHAR |
ClobTypeHandler | java.lang.String | CLOB, LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR, NCHAR |
BlobTypeHandler | byte[] | BLOB, LONGVARBINARY |
DateTypeHandler | java.util.Date | TIMESTAMP |
DateOnlyTypeHandler | java.util.Date | DATE |
TimeOnlyTypeHandler | java.util.Date | TIME |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP |
SqlDateTypeHandler | java.sql.Date | Date |
SqlTimeTypeHandler | java.sql.Time | TIME |
ObjectTypeHandler | Any | OTHER 或未指定类型 |
EnumTypeHandler | Enumeration Type | VARCHAR 或任何兼容的字符串类型,用来存储枚举的名称(而不是索引序数值) |
EnumOrdinalTypeHandler | Enumeration Type | 任何兼容的 NUMERIC 或 DOUBLE 类型,用来存储枚举的序数值(而不是名称) |
YearTypeHandler | java.time.Year | INTEGER |
MonthTypeHandler | java.time.Month | INTEGER |
YearMonthTypeHandler | java.time.YearMonth | VARCHAR 或 LONGVARCHAR |
更多的类型转换器可以在mybatis的org.apache.ibatis.type.TypeHandlerRegistry#TypeHandlerRegistry() 方法中查看。
当默认的处理器无法满足业务需求时,也可以自定义类型处理器,只需要继承org.apache.ibatis.type.BaseTypeHandler 类即可,该类实现了 org.apache.ibatis.type.TypeHandler 接口,该接口主要定义了两种方法:setParameter 和 getResult,在预编译时设置参数(增删改查传入参数)与查询结果集后转换为 Java 类型时发挥作用。自定义类型处理器配置流程:
3.4.1 首先定义类MyExampleTypeHandler,利用注解与泛型设置映射类型
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyExampleTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getString(columnName);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(columnIndex);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getString(columnIndex);
}
}
3.4.2 在配置文件中设置类型处理器
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="org.mybatis.example.MyExampleTypeHandler"/>
<!-- 或者使用包扫描处理器 -->
<package name="org.mybatis.example"/>
</typeHandlers>
3.4.3 一个类型处理器就已经配置完成,但如果想要处理特殊情况,例如只希望对某个Java类中的属性生效,则可以先将@MappedJdbcTypes注解去除,直接在映射文件中编写,则自定义类型处理器,只会对 birthday 字段产生影响,其余字段均不受影响。
<resultMap id="MyResultMap" type="com.panshenlian.pojo.User">
<!-- id为int类型,但是没指定自定义类型处理器,不受影响-->
<id column="id" property="id" />
<!-- username为String类型,但是没指定自定义类型处理器,不受影响-->
<id column="username" property="username" />
<!-- password为String类型,但是没指定自定义类型处理器,不受影响-->
<id column="password" property="password" />
<!-- birthday为String类型,指定自定义类型处理器,受影响!-->
<id column="birthday" property="birthday" typeHandler="com.mybatis.typeHandler.MyStringHandler"/>
</resultMap>
3.5 objectFactory(对象工厂)
创建结果对象的新实例时使用的对象工厂,利用该工厂的实例来完成结果对象的实例化。默认的对象工厂只会实例化目标类,也即调用无参构造或者通过存在的参数映射调用有参构造,如果进行扩展,可以创建自己的对象工厂来实,只需要继承DefaultObjectFactory类即可,一般情况下不会使用到。
3.6 plugins(插件)
mybatis提供了大量的插件来供用户实现扩展功能,如数据分页、日志增强或者sql性能监控等,允许用户在映射语句执行过程中的某一点进行拦截调用。默认情况下包括以下方法:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
同时也支持自定义拦截器,只需实现Interceptor接口,并指定需要拦截的类,方法,参数即可,例如拦截Executor执行器中的update方法:
@Intercepts({
@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
private Properties properties = new Properties();
public Object intercept(Invocation invocation) throws Throwable {
// implement pre processing if need
Object returnObject = invocation.proceed();
// implement post processing if need
return returnObject;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
<!-- mybatis-config.xml -->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
3.7 environments(环境配置)
mybatis支持多套环境配置,例如数据库开发、测试及生产环境等,只需要定义多个environment标签即可,并指定id,例如:
<!-- 默认开发环境 -->
<environments default="development">
<!-- 开发环境 -->
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<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>
<!-- 生产环境 -->
<environment id="prod">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<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>
3.7.1 transactionManager事务管理器
环境配置中比较重要的就是transactionManager事务管理器的配置,在mybatis中有两种类型的事务管理器:
- JDBC:直接使用JDBC提供的提交和回滚功能,它依赖从数据源获得的连接来管理事务的作用域,一般默认使用JDBC;
- MANAGED:几乎不做任务功能,让容器来管理事务的生命周期,默认情况下用完会关闭连接,可以将closeConnection属性设置为false来不关闭连接。
3.7.2 datasource数据源
环境配置中另一个比较重要的就是datasource数据源,DataSource会使用标准的JDBC数据源接口来配置JDBC连接对象的资源。mybatis内带的一般有三种数据源类型:
- UNPOOLED:每次请求时都会打开和关闭连接,存在一定的时延适用于对数据库连接可用性不高的场景。配置也比较简单,只需要以下几种:
-
- driver:JDBC驱动的JAVA类全限定名称;
- url:数据库的JDBC url连接地址;
- username:登录数据库的用户名;
- password:登录数据库的密码;
- defaultTransactionIsolationLevel:默认的事务隔离级别;
- defaultNetworkTimeout:数据库操作完成的默认超时时间,单位为毫秒
- POOLED:池化模式,缓存了指定数量的JDBC连接对象,避免了每次请求创建新连接对象所必需的初始化和认证时间,能够快速想要,所需配置除了UNPOOLED所需的几种基础配置,还提供了更多的扩展属性:
-
- poolMaximumActiveConnections:池内最大存活正在使用的连接数,默认为10
- poolMaximumIdleConnections:池内可存在的最大连接数
- poolMaximumCheckoutTime:连接对象可空闲的最大时间,超时则销毁,默认20000ms
- poolTimeToWait:获取连接最大等待时长,超时则打印状态日志并尝试重新获取连接,默认20000ms
- poolMaximumLocalBadConnectionTolerance:坏连接容忍度,对于每个尝试从缓存池中回去连接的线程,若获取到的连接不可用,则允许该线程重新获取新连接,但重试次数不允许超过poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3
- poolPingQuery:数据库侦测查询,用于验证连接是否正常工作并准备接受请求。默认是"NO PING QUERY SET",能在数据库出错时返回恰当的错误信息
- poolPingEnabled:是否开启侦测查询,若开启,则需要设备poolPingQuery为可执行的语句,且速度要快,避免影响数据库正常运行性能,默认为false;
- poolPingConnectionsNotUsedFor:配置poolPingQuery频率。推荐设置为和数据库连接超时时间一样,避免不必要的侦测。默认值为0,当poolPingEnabled为true时,所有连接每一时刻都会被侦测;
- JNDI:适用于EJB或应用服务器等容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的数据源引用。此模式只需要两个属性:
-
- initial_context: 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))。这是个可选属性,如果忽略,那么将会直接从 InitialContext 中寻找 data_source 属性。
- data_source – 这是引用数据源实例位置的上下文路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。
3.8 databaseIdProvider(数据库厂商标识)
mybatis能够根据不同的数据库厂商执行不同的语句,这种多厂商是基于映射语句中的databaseId属性。mybatis会加载带有匹配当前数据库
3.9 mappers(映射文件)
用于指定实体与数据库之间结构映射的配置文件,同时也定义了一些列的sql语句,mybatis又被称为动态orm框架,提供了大量的标签映射器供我们使用,其中常用的有以下这些:
3.9.1 select:查询语句,返回指定结果集
关键属性:
- id:定义在当前mapper.xml文件下的名称,与java中dao接口的方法名一致,
- parameterType:定义传入的参数类型,
- resultType:定义返回结果类型,
- resultMap:对结果集映射引用,且resultType与resultMap只能使用一个
- flushCache:是否清空缓存,设置为true后,只要select语句被调用,都会清空本地缓存和二级缓存,默认为false
- useCache:是否使用缓存,设置为true后,只要select语句被调用,都会缓存该语句的执行结果,默认为true
- timeout:设置驱动程序等待数据库返回结果的时长,超时抛出异常。默认为未设置(unset)
- fetchSize:获取记录的总条数,只是建议值,尝试让驱动程序每次批量返回的结果行数等于该值,默认为未设置(unset)
- statementType:可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
- resultSetType:FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 DEFAULT (依赖数据库驱动)。
-
- FORWARD_ONLY,只允许游标向前访问;
- SCROLL_SENSITIVE,允许游标双向滚动,但不会及时更新数据,也就是说如果数据库中的数据被修改过,并不会在resultSet中及时更新出来;
- SCROLL_INSENSITIVE ,允许游标双向滚动,如果数据库中的数据被修改过,会及时更新到resultSet;
3.9.2 insert、update、delete:更新语句,一般返回删除数量
关键属性:
- useGeneratedKeys:返回数据库内部生成的主键,默认false
- keyProperty:指定主键属性字段,联合useGeneratedKeys用会保存生成的主键值
3.9.3 cache缓存
mybatis内置了事务性查询缓存机制,且可以灵活的进行配置。在默认情况下,只会启用本地的session会话缓存,也即一级缓存,只针对同一个会话中的数据进行缓存。若想开启二级缓存的话,首先需要在全局配置文件中加入:
<!--开启二级缓存-->
<settings><settingname="cacheEnabled"value="true"/></settings>
然后在mapper映射文件中开启缓存:
<!--开启二级缓存-->
<cache
eviction="LRU"
flushInterval="60000"
size="1024"
readOnly="true"
></cache>
这样就会启用二级缓存效果:
-
- 映射语句文件中的所有 select 语句的结果将会被缓存。
- 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
- 缓存清除策略(eviction):默认使用LRU( Least Recently Used)算法来清除不需要的缓存,可选项有FIFO(先进先出:按对象进入缓存的顺序来移除它们);SOFT(软引用:基于垃圾回收器状态和软引用规则移除对象);WEAK( 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象)。
- 缓存刷新间隔(flushInterval):默认不会定时进行刷新(也就是说,没有刷新间隔),可如上自己替换设置。
- 缓存引用数量(size):默认会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
- 缓存模式(readOnly):只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。
- 缓存范围:默认只作用于 cache 标签所在的映射文件中的语句。如果你混合使用 Java API 和 XML 映射文件,在共用接口中的语句将不会被默认缓存。你需要使用 @CacheNamespaceRef 注解指定缓存作用域。
- 引用缓存(cache-ref):<cache-refnamespace="com.vo.UserMapper"/>,可引用其它文件中的缓存实例
mybatis的缓存获取顺序:二级缓存 > 一级缓存 > 数据库
3.9.4 sql:sql语句块标签,定义可复用的sql语句
可定义id属性,与<include>标签联用进行sql语句复用
3.9.5 resultMap:结果集映射,可定义多个
定义数据库字段与Java类字段的类型映射,可与自定义类型处理器联合使用
3.9.6 namespace:命名空间
作为mapper映射文件的唯一标识,mapper中的每一段sql语句也会使用[命名空间+语句块id]作为唯一标识,若开启了二级缓存也会作为map缓存中的key。
四、mybatis脑图