简单地梳理下MyBatis相关的知识点,主要想让自己重新捡起以前学的框架,如果能给广大程序猿朋友有所帮助那就更好了。有疏漏的地方也欢迎大家评论指出。闲言少叙,进入正题。。。。。。。
MyBatis知识梳理
简介(百度,随便看看)
- MyBatis最早源自Apache基金会的一个开源项目iBatis,2010年这个项目有Apache software foundation迁移到了google code,并且改名为MyBatis。
- MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
- MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
- MyBatis使用简单地XML或注解做配置和定义映射关系,将Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。
MyBatis体系结构中的几个关键部分
- 加载配置 —— 可以是XML配置文件方式,也可以是Java代码的注释。MyBatis将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置,执行的SQL语句、结果映射配置) ,并将其存储在内存中
- SQL解析 —— 当API接口层接收到调用请求时,会收到传入SQL的ID和传入对象(Map、JavaBean或者基本数据类型),MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
- SQL执行 —— 将得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
- 结果映射 —— 将结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
MyBatis的配置文件
- SqlMapConfig.xml(1个):主配置文件,用于指定数据库连接参数和框架参数
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 7 <configuration> 8 <!-- 全局别名,之后映射文件引用可以使用PersonEntity代替com.maven.mybatis.entity.PersonEntity--> 9 <typeAliases> 10 <typeAlias type="com.maven.mybatis.entity.PersonEntity" alias="PersonEntity"/> 11 </typeAliases> 12 13 <environments default="development"> 14 <environment id="development"> 15 <transactionManager type="JDBC"/> 16 <dataSource type="POOLED"> 17 <property name="driver" value="com.mysql.jdbc.Driver"/> 18 <property name="url" value="jdbc:mysql://localhost:3306/test"/> 19 <property name="username" value="root"/> 20 <property name="password" value=""/> 21 </dataSource> 22 </environment> 23 </environments> 24 <!-- 指定映射定义文件 --> 25 <mappers> 26 <mapper resource="com/maven/mybatis/mapper/PersonEntityMapper.xml"/> 27 </mappers> 28 29 </configuration>
- SqlMap.xml(n个):映射定义文件,用于定义SQL语句和映射信息
!!注:namespace有重要作用,不要重复,调用此文件定义增删改查操作是需要指定namespace;
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 6 <mapper namespace="com.maven.mybatis.mapper.PersonEntityMapper"> 7 <select id="queryAll" resultType="PersonEntity"> 8 select * from t_person 9 </select> 10 11 <insert id="insert" parameterType="PersonEntity"> 12 insert into t_person(id, name) values(#{id}, #{name}) 13 </insert> 14 15 </mapper>
MyBatis框架主要API简介
- SqlSessionFactoryBuilder:该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例
- SqlSessionFactory:每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。
- SqlSession:该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句。
MyBatis基本应用
- 搭建MyBatis技术环境
- 为工程添加MyBatis开发包和数据库驱动包
-
- 在src下添加MyBatis配置文件SqlMapConfig.xml
- 修改SqlMapConfig.xml,指定数据库连接参数
- 利用MyBatis API编程,获取SqlSession实例
- 获取SqlSession对象
String conf = "SqlMapConfig.xml"; InputStream in = Resources.getResourceAsStream(resource); //创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder(); //通过SessionFactoryBuilder对象获取SqlSessionFactory SqlSessionFactory sf = sfb.build(in); //创建Session SqlSession session = sf.openSession();
- 实现CRUD操作
- 添加操作
SqlMap.xml定义<!--parameterType因为前面定义过Alias所以不需要写包名,否则要写全包名加类名--> <insert id="insert" parameterType="PersonEntity"> insert into t_person(id, name) values(#{id}, #{name}) </insert>
id属性:用于表示映射文件的sql,可以理解为MappedStatement的id
#{}:标识一个占位符
parameterType:指定输入参数的类型
#{name}:其中name表示输入的参数,参数名为name;如果输入参数为简单类型,#{}中参数可以任意。
Java代码//NAMESPACE为SqlMapper.xml文件根标签的namespace属性 SqlSession session = sf.openSession();
//第一个参数:指映射文件的id值:namespace.id
//第二个参数:指映射文件中匹配parameterType类型的实参 session.insert(NAMESPACE + ".insert", person); session.commit(); session.close(); - 添加后返回主键
- mysql自增主键返回,mysql每次在调用完一个INSERT语句时会自动生成一个自增主键,可以通过函数LAST_INSERT_ID()获取到插入记录的自增主键。
<insert id="insert" parameterType="PersonEntity"> <!--查询后将自增主键返回到实体对象-->
<selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO t_person(name) VALUES(#{name}) </insert>keyProperty属性:配置返回user对象的属性名
order属性:配置相对于insert语句执行前或执行后
resultType:指定结果类型 - 非自增主键返回,使用UUID()函数。在INSERT语句之前执行UUID函数,再将结果插入到INSERT语句中作为主键(主键必须是字符串类型,长度至少是35位)
<insert id="insert" parameterType="PersonEntity"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT REPLACE(UUID(),'-','') </selectKey> INSERT INTO t_person(id, name) VALUES(#{id},#{name}) </insert>
- Oracle中自增主键返回
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT 序列名.nextVal() </selectKey>
- mysql自增主键返回,mysql每次在调用完一个INSERT语句时会自动生成一个自增主键,可以通过函数LAST_INSERT_ID()获取到插入记录的自增主键。
- 更新操作
SqlMap.xml定义
<update id="update" parameterType="PersonEntity"> update t_person set name=#{name} where id=#{id} </update >
Java代码
SqlSession session = sf.openSession(); session.update(NAMESPACE + ".update", person); session.commit(); session.close();
-
删除操作
SqlMap.xml定义
<delete id="delete" parameterType="int"> delete from t_person where id=#{id} </select>
Java代码
SqlSession session = sf.openSession(); session.delete(NAMESPACE + ".delete", 100); session.commit(); session.close();
- 查询操作
SqlMap.xml定义
<!--查询单行记录--> <select id="queryById" parameterType="int" resultType="PersonEntity"> select * from t_person </select> <!--查询多行记录--> <select id="queryAll" resultType="PersonEntity"> select * from t_person </select> <!--查询返回Map类型查询结果--> <select id="queryPerson" parameterType="int" resultType="java.util.HashMap"> select id, name from t_person where id=#{id} </select>
${}:表示拼接sql字符串,如select * from t_person where name like '%${value}%'
${value}:接受输入参数的内容;如果传入的类型是简单类型,只能使用value
Java代码
SqlSession session = sf.openSession(); /* //查询单行记录 PersonEntity person = (PersonEntity)session.selectOne(NAMESPACE + ".queryById", 100); //返回Map查询结果 Map map = (Map)session.selectOne("queryPerson", 100); */ //查询多行记录 List<PersonEntity> personList = session.selectList(NAMESPACE + ".queryAll"); session.commit(); session.close();
- 添加操作
- MyBatis实现分页查询 —— 在使用SqlSession的selectList()方法时,指定一个RowBounds分页器参数,即可查询指定范围的记录。提示:MyBatis分页是基于内存分页,原理是查询出所有记录,然后基于jdbc的absolute()和next()方法定位获取部分记录,因此在遇到大量数据情况下,不推荐使用MyBatis自带分页功能。需要开发者指定分页查询的SQL语句或对MyBatis进行扩展使用。
- RowBounds(offset, limit)
- offset指定抓取记录的起始行,从0开始
- limit指定抓取记录的数量 - 使用方法:sqlSession.selectList(SQL的ID, 参数, RowBounds对象);
- RowBounds(offset, limit)
- Mapper映射器:是开发者创造绑定映射语句的接口,映射器接口的实例可以从SqlSession中获得。
SqlSession session = sqlSessionFactory.openSession(); PersonMapper mapper = session.getMapper(PersonEntity.class); session.close();
PersonMapper接口定义:
public interface PersonMapper{ public List<PersonEntity> queryAll(); public PersonEntity queryById(int id); public void insert(Person person); public void update(Person person); public void delete(int id); //!提示:Mapper接口中的方法名要和SqlMap.xml中的SQL的id保持一致 }
遵循如下规范,MyBatis会自动给我们创建实现该接口的代理对象
- 在mapper.xml的namespace属性值必须是mapper接口的全路径
- mapper接口中的方法名必须和mapper.xml文件中的id值相同
- mapper接口中的输入参数类型必须和mapper.xml中statement中的parameterType类型相同
- mapper接口中的方法的返回值类型和mapper.xml中statement中的resultType的类型相同 - ResultMap映射定义
在SqlMap.xml定义<select>操作时,如果查询结果字段名和Java POJO属于不一致时,需要使用<resultMap>元素显示指定映射关系,例如
<select id="queryAll1" resultMap="personMap"> select id, name from t_person </select> <resultMap id="personMap" type="PersonEntity"> <result property="no" column="id" /> <result property="username" column="name" /> </resultMap>
- SqlMapConfig.xml核心配置文件介绍
- properties属性
- 这个属性标签可以用来引用外部的properties的文件
- MyBatis会按一定顺序来加载属性:1)优先读取properties标签体内定义的属性。2)然后读取properties标签中的resource或url属性,并且会覆盖已读取的同名属性。3)最后读取parameterType传递的属性,它会覆盖已读取的同名属性。
<!-- 引用外部propertes文件替代硬编码的jdbc配置 --> <properties resource="db.properties"></properties> <!-- 因为将来要和spring进行整合,这部分用不上了 --> <environments default="development"> <environment id="development"> <!-- 使用jdbc的事务,由mybatis管理 --> <transactionManager type="JDBC"/> <!-- 数据库连接池配置,由mybatis管理 --> <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>
- settings(全局配置参数):在myBatis框架在运行时可以调整一些运行参数
- properties属性
设置参数 | 描述 | 有效值 | 默认值 |
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 |
autoMappingUnknownColumnBehavior | Specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target. NONE: Do nothing WARNING: Output warning log (The log level of 'org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' must be set to WARN) FAILING: Fail mapping (Throw SqlSessionException) | NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数。 | Any positive integer | Not Set (null) |
defaultFetchSize | Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting. | Any positive integer | Not Set (null) |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBounds)。 If allow, set the false. | true | false | False |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。 If allow, set the false. | true | false | True |
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 |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载。 | A method name list separated by commas | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定动态 SQL 生成的默认语言。 | A type alias or fully qualified class name. | org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
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 |
proxyFactory | 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 | CGLIB | JAVASSIST | JAVASSIST (MyBatis 3.3 or above) |
vfsImpl | Specifies VFS implementations | Fully qualified class names of custom VFS implementation separated by commas. | Not set |
useActualParamName | Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) |
|
-
- typeAliases(类型别名)
- 在映射文件中,会定义很多的statement,需要parameterType指定大量的类型,这些类型的全路径太长,这个时候为了开发方便,可以为这些类型取一个别名(单个修改)
<!-- 指定类的别名 --> <typeAliases> <typeAlias alias="User" type="cn.konrad.mapper.User"/> </typeAliases> ------------------------------------------------------------------- <select id="findUserById" parameterType="int" resultType="User"> SELECT * FROM t_user WHERE id=#{id} </select>
- 批量修改(给一个包取名,定义之后,映射文件中大小写均可,它会自动地到该包下找类)
<!-- 指定包的别名 --> <typeAliases> <package name="cn.konrad.mapper"/> </typeAliases> ---------------------------------------------------- <select id="findUserById" parameterType="int" resultType="User"> SELECT * FROM t_user WHERE uid=#{uid} </select>
- 对于普通的 Java 类型,有许多内建的类型别名。它们都是大小写不敏感的,由于重载 的名字,要注意原生类型的特殊处理。
别名
映射的类型
_byte
byte
_long
long
_short
short
_int
int
_integer
int
_double
double
_float
float
_boolean
boolean
string
String
byte
Byte
long
Long
short
Short
int
Integer
integer
Integer
double
Double
float
Float
boolean
Boolean
date
Date
decimal
BigDecimal
bigdecimal
BigDecimal
object
Object
map
Map
hashmap
HashMap
list
List
arraylist
ArrayList
collection
Collection
iterator
Iterator
- typeAliases(类型别名)
-
- typeHandler(类型处理器):在mybatis通过类型处理器来完成jdbc类型对Java类型的装换
类型处理器 | Java 类型 | JDBC 类型 |
BooleanTypeHandler | java.lang.Boolean, boolean | 数据库兼容的 BOOLEAN |
ByteTypeHandler | java.lang.Byte, byte | 数据库兼容的 NUMERIC 或 BYTE |
ShortTypeHandler | java.lang.Short, short | 数据库兼容的 NUMERIC 或 SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer, int | 数据库兼容的 NUMERIC 或 INTEGER |
LongTypeHandler | java.lang.Long, long | 数据库兼容的 NUMERIC 或 LONG INTEGER |
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 |
ClobReaderTypeHandler | java.io.Reader | - |
ClobTypeHandler | java.lang.String | CLOB, LONGVARCHAR |
NStringTypeHandler | java.lang.String | NVARCHAR, NCHAR |
NClobTypeHandler | java.lang.String | NCLOB |
BlobInputStreamTypeHandler | java.io.InputStream | - |
ByteArrayTypeHandler | byte[] | 数据库兼容的字节流类型 |
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 类型,存储枚举的索引(而不是名称)。 |
-
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象)
- environment(环境子属性对象)
- transactionManager(事务管理器)
- dataSource(数据源)
- mappers(映射器)
- <mapper resource="" /> 相对于类路径,如<mapper resource="cn/konrad/mybatis/UserMapper.xml"/>
- <mapper url="" /> 使用绝对路径(完全限定路径),如<mapper url="file:///
D:\workSpace\mybatis\bin\cn\konrad\mapper\UserMapper.xml"/>
- <mapper class="" /> 使用mapper接口路径,此方法要求mapper接口与映射文件名称相同且存放在完全相同的目录下,如<mapper class="cn.konrad.mapper.UserMapper"/>
- MyBatis动态SQL:对SQL进行判断、拼接、组装
- if判断
<!-- if判断 --> <select id="findUsersByCriteria" parameterType="User" resultType="User"> SELECT * FROM t_user <!-- 这个where标签会自动的删除第一个AND --> <where> <if test="name!=null and name!=''"> AND name like '%${name}%' </if> <if test="age!=null and age!=''"> AND age=#{age} </if> </where> </select>
- Sql片段:当我们通过条件查询用户所有信息,和通过条件查询所有用户的数量
<!-- 定义sql片段 id属性:表示sql片段的唯一标识 一定要基于单标操作定义sql片段,这样这个sql片段的可重用性才高 在sql片段中不要包括where条件 --> <sql id="query_user_where"> <if test="name!=null and name!=''"> AND name like '%${name}%' </if> <if test="age!=null and age!=''"> AND age=#{age} </if> </sql> <!--引用sql片段--> <where> <!-- refid用来引用sql片段的id值,如果该sql片段不在本配置文件中需要加namespace的值 --> <include refid="query_user_where"></include> </where>
- foreach:向sql传递数组或list时,用foreach构建SQL
<delete id="deleteBatch"> delete from user where id in <foreach collection="array" item="id" index="index" open="(" close=")" separator=","> #{id} </foreach> </delete>
- collection :collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合,我在上面传的参数为数组,所以值为array
- item:表示在迭代过程中每次迭代到的位置(下标)- index:
- open:前缀
- close:后缀
- separator:分隔符,表示迭代时每个元素之间以什么分隔
- if判断
- 一对一映射
- resultType实现较为简单,对于多表映射中只要增加其他勒种属性即可完成映射。但是会新增一个子类,如果对查询结果没有要求可以用它。
- resultMap实现较为复杂,需要自定义resultMap。但是不需要新增子类,用我们传统的对象模型即可完成映射,并且支持延迟加载的功能,而resultType不支持。
<resultMap type="cn.chinasofti.entity.Orders" id="resultMapOrder"> <!-- 配置Order主类信息 --> <id column="id" property="id"/> <result column="note" property="note"/> <result column="createdate" property="createdate"/> <association property="user" javaType="User"> <id column="uid" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <result column="birthday" property="birthday"/> </association> </resultMap> <select id="findOrderUserWithResultMap" resultMap="resultMapOrder"> SELECT 语句 </select>
- association属性:配置关联的表
- javaType属性:代表映射表中的实体对象的真实类型
- 一对多映射
<resultMap type="User" id="resultMapUser"> <!-- 配置User信息 --> <id column="_uid" property="id"/> <result column="username" property="username"/> <result column="birthday" property="birthday"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <!-- 配置Orders集合信息 --> <collection property="orders" ofType="Orders"> <id column="_oid" property="id"/> <result column="createdate" property="createdate"/> <result column="note" property="note"/> </collection> </resultMap> <select id="findUserOrders" resultMap="resultMapUser"> SELECT 语句 </select>
- ofType属性:申明的是集合中元素的类型
!注意:当两个表的主键列名相同时,在配置的时候一定要为其配置一个别名,否者该类查询出的集合中只有一条数据 - 多对多映射(与一对多类似,在映射的两个映射文件中添加collection集合配置)
- 延迟加载:默认是没有开启延迟加载的,需要在核心配置文件中配置
<!-- 开启延迟加载 --> <settings> <setting name="lazyLoadingEnabled" value="true" /> <setting name="aggressiveLazyLoading" value="false"></setting> </settings>
- 一级缓存:默认开启,是基于SqlSession范围的缓存
- 二级缓存:默认不支持二级缓存,是基于Mapper范围的缓存
暂时就先写到这,后续有补充的继续修正。欢迎各位猴子(猿)们指正补充!