系列文章目录
高级Mybatis,一些结果映射,引入新的注解
目录
一、结果映射
1.ResultType
如果数据库中列名跟Java实体类中的属性名一模一样,则可以使用resultType 进行类型自动映射。
注意:使用resultType进行属性与字段映射,必须保证两者同名,名字不相 同,则无法完成映射
2.ResultMap
resultMap是提前定义好的一个映射规则,实现了查询列到类属性的映射。实 际开发中,我们在映射文件中,先定义出结果集映射resultMap,然后在select 语句上引用这个resultMap,最终完成结果映射。
基础应用:
<resultMap> 详解:
属性 id ,其值唯一,用来标识该resultMap
属性 type ,其值为实体类的全包名,用来指定映射对象的类型
属性 extends ,继承
子标签 <result> ,用来将查询的数据中一个指定类列的值映射到对象指 定的属性中
子标签 <id> ,和 <result> 标签功能相同,但是 <id> 用来映射的是表中 的主键
二、一对一
在MyBatis中,一对一关系映射是指两个实体之间的关系。在这种关系中,通 常有一个"主"表和一个"从"表。主表中的每一行都具有唯一标识符,并且在从 表中通过外键与主表相关联
嵌套结果和嵌套查询
嵌套结果( Nested Results ) :这种方式适用于主表和从表之间的关联字段
不是主键。
在映射文件中,先编写一个查询语句联合查询主表和从表,并使用 MyBatis
的 resultMap 指定结果集的映射关系。在 resultMap 中,使用嵌套的
<association> 标签将从表映射到主表的字段上。
嵌套查询( Nested Select ) :这种方式适用于主表和从表之间的关联字段
是主键。
在映射文件中,通过编写两个独立的 SQL 语句分别查询主表和从表的数
据,然后通过在主表查询结果上进行循环,并在循环中执行从表的查询,
将从表的数据映射到主表的对应对象中
嵌套结果
例如<association property="category" resultMap="CategoryResult"/>
嵌套查询
例: <association property="category" column="category_id" select="namespace名.findById3"/>
区别
嵌套结果映射通过多个 resultMap 组合实现每个属性值的映射 嵌套结果查询是在 SQL 中实现多表联查,且通常情况下需要执行多个 SQL 语句,并将结果拼接到一个对象中 在数据量较大的情况下,嵌套结果映射相对来说性能更高,但是查询时需 要考虑 SQL 的效率和维护成本。
三、一对多
如果查询的类别是一级分类,则其需要包含所有的子类别(二级分类)
如果查询的类别是二级分类,则其包含的子类别为null
一对多和一对一映射(含嵌套结果、嵌套查询),实现思路是类似的,,只是把association标签变为了collection标签
四、多对多
实际项目开发中,具有的多对多关系的实体,在具体业务实现时,可以简化为 一对多的关系。
多对多就是需要一张桥表,然后在此基础上转换为一对多进行处理
五、注解补充
1.一对一
MyBatis提供了**@One** 注解来使用嵌套select语句加载一对一关联查询数据。
@Result(column = "addr_id",property = "address",
one = @One(select = "com.briup.demo05.mapper.StudentMapper.findAddressById")) }
2.一对多
MyBatis提供了 @Many 注解,用来使用嵌套Select语句加载一对多关联查询。
@Result(property = "courses", column = "id",
many = @Many(select ="com.briup.demo05.mapper.TutorMapper.findCoursesByTutorId")) }
六、缓存
缓存是一种临时存储数据的技术,用于提高数据访问的速度和性能。
MyBatis提供了缓存机制来提高数据库访问的性能。它的缓存是位于应用程序和 数据库之间的一层缓存。当应用程序查询数据时,MyBatis会先检查缓存中是否 有相应的结果。如果有,就直接从缓存中返回结果,而不需要再次访问数据 库,从而提高查询性能。
MyBatis的缓存分为两级:一级缓存和二级缓存。
1.一级缓存
默认情况下,MyBatis的一级缓存是开启的,也可以通过配置文件进行关闭
一级缓存是SqlSession级别的 ,通过同一个sqlSession查询的数据会被缓 存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问。
2.缓存失效
缓存失效的情况1: 同一个sqlSession但是查询条件不同
缓存失效的情况2: 不同的sqlSession对应不同的一级缓存
缓存失效的情况3: 同一个sqlSession两次查询期间执行了任何一次增删改操 作
缓存失效的情况4: 同一个sqlSession两次查询期间手动清空了缓存,调用sqlSession.clearCache();方法等,调用commit()、close()方法也会清空一级缓存。
3.二级缓存
MyBatis的二级缓存是一种在 Mapper级别 上操作的缓存机制。它旨在跨多个会 话缓存数据,通过减少数据库查询次数来提高应用程序的性能。