MyBatis知识点梳理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MyBatis知识点梳理
简单地梳理下MyBatis相关的知识点,主要想让⾃⼰重新捡起以前学的框架,如果能给⼴⼤程序猿朋友有所帮助那就更好了。
有疏漏的地⽅也欢迎⼤家评论指出。
闲⾔少叙,进⼊正题。
MyBatis知识梳理
简介(百度,随便看看)
1. MyBatis最早源⾃Apache基⾦会的⼀个开源项⽬iBatis,2010年这个项⽬有Apache software foundation迁移到了google code,并且改名为MyBatis。
2. MyBatis是⽀持普通SQL查询,存储过程和⾼级映射的优秀持久层框架。
3. MyBatis封装了⼏乎所有的JDBC代码和参数的⼿⼯设置以及结果集的检索。
4. MyBatis使⽤简单地XML或注解做配置和定义映射关系,将Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。
MyBatis体系结构中的⼏个关键部分
1. 加载配置 —— 可以是XML配置⽂件⽅式,也可以是Java代码的注释。
MyBatis将SQL的配置信息加载成为⼀个个的MappedStatement对象(包括了传⼊参数映射配置,执
⾏的SQL语句、结果映射配置) ,并将其存储在内存中
2. SQL解析 —— 当API接⼝层接收到调⽤请求时,会收到传⼊SQL的ID和传⼊对象(Map、JavaBean或者基本数据类型),MyBatis会根据SQL的ID找到对应的
MappedStatement,然后根据传⼊参数对象对MappedStatement进⾏解析,解析后可以得到最终要执⾏的SQL语句和参数。
3. SQL执⾏ —— 将得到的SQL和参数拿到数据库进⾏执⾏,得到操作数据库的结果。
4. 结果映射 —— 将结果按照映射的配置进⾏转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
MyBatis的配置⽂件
1. SqlMapConfig.xml(1个):主配置⽂件,⽤于指定数据库连接参数和框架参数
1<?xml version="1.0" encoding="UTF-8" ?>
2<!DOCTYPE configuration
3 PUBLIC "-////DTD Config 3.0//EN"
4 "/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>
2. SqlMap.xml(n个):映射定义⽂件,⽤于定义SQL语句和映射信息
!!注:namespace有重要作⽤,不要重复,调⽤此⽂件定义增删改查操作是需要指定namespace;
1<?xml version="1.0" encoding="UTF-8" ?>
2<!DOCTYPE mapper
3 PUBLIC "-////DTD Mapper 3.0//EN"
4 "/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);
mit();
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="ng.String">
SELECT REPLACE(UUID(),'-','')
</selectKey>
INSERT INTO t_person(id, name) VALUES(#{id},#{name})
</insert>
Oracle中⾃增主键返回
<selectKey keyProperty="id" order="BEFORE" resultType="ng.String">
SELECT 序列名.nextVal()
</selectKey>
更新操作
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);
mit();
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);
mit();
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>
resultType:指定sql输出结果映射的java对象类型,select指定resultType表⽰单条记录映射程度额Java对象。
${}:表⽰拼接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");
mit();
session.close();
MyBatis实现分页查询 —— 在使⽤SqlSession的selectList()⽅法时,指定⼀个RowBounds分页器参数,即可查询指定范围的记录。
提⽰:MyBatis分页是基于内存分页,原理是查询出所有记录,然后基于jdbc的absolute()和next()⽅法定位获取部分记录,因此在遇到⼤量数据情况下,不推荐使⽤MyBatis⾃带分页功能。
需要开发者指定分页查询的SQL语句或对MyBatis进⾏扩展使⽤。
RowBounds(offset, limit)
- offset指定抓取记录的起始⾏,从0开始
- limit指定抓取记录的数量
使⽤⽅法:sqlSession.selectList(SQL的ID, 参数, RowBounds对象);
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="${ername}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
settings(全局配置参数):在myBatis框架在运⾏时可以调整⼀些运⾏参数
设置参数描述有效值默认值
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
MyBatis 利⽤本地缓存机制(Local Cache)防⽌循环引⽤(circular
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="er"/>
</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
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator
typeHandler(类型处理器):在mybatis通过类型处理器来完成jdbc类型对Java类型的装换类型处理器Java 类型JDBC 类型
BooleanTypeHandler ng.Boolean,
boolean数据库兼容的 BOOLEAN
ByteTypeHandler ng.Byte, byte数据库兼容的 NUMERIC 或 BYTE ShortTypeHandler ng.Short, short数据库兼容的 NUMERIC 或 SHORT INTEGER IntegerTypeHandler ng.Integer, int数据库兼容的 NUMERIC 或 INTEGER LongTypeHandler ng.Long, long数据库兼容的 NUMERIC 或 LONG INTEGER FloatTypeHandler ng.Float, float数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandler ng.Double,
double数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandler java.math.BigDecimal数据库兼容的 NUMERIC 或 DECIMAL StringTypeHandler ng.String CHAR, VARCHAR ClobReaderTypeHandler java.io.Reader-
ClobTypeHandler ng.String CLOB, LONGVARCHAR NStringTypeHandler ng.String NVARCHAR, NCHAR NClobTypeHandler ng.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="erMapper"/>
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:分隔符,表⽰迭代时每个元素之间以什么分隔
⼀对⼀映射
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范围的缓存
暂时就先写到这,后续有补充的继续修正。
欢迎各位猴⼦(猿)们指正补充!。