一个复杂的映射都是从最基层的映射配置开始的,要学会循序渐进,不要一上来就想着最简配置。
一对一映射
1.使用自动映射处理一对一关系
通过别名让mybatis自动将值匹配到对应的字段 或者 复杂的属性映射,可多层嵌套
2.使用resultMap配置一对一映射
3.使用resultMap的association标签来配置一对一映射
<!--extends:继承的是mbg生成的resultMap-->
<resultMap id="userRoleMap" extends="userMap" type="com.bdqn.simple.pojo.SysUser">
<!--resultMap:指向命名空间为com.bdqn.simple.mapper.RoleMapper的xml里的id为roleMap的resultMap-->
<association property="role" columnPrefix="role_" resultMap="com.bdqn.simple.mapper.RoleMapper.roleMap"/>
</resultMap>
上述三种都是关联的嵌套结果映射,通过一次sql查询,根据表或映射的属性映射到不同的对象。
4.association标签的嵌套查询
通过简单sql多次查询转换为我们需要的结果
修改sql,然后
<resultMap id="userRoleMapSelect" extends="userMap" type="com.bdqn.simple.pojo.SysUser"> <association property="role" <!--延迟加载,避免n+1问题--> fetchType="lazy" <!--命名空间为com.bdqn.simple.mapper.RoleMapper的selectRoleById方法--> select="com.bdqn.simple.mapper.RoleMapper.selectRoleById" column="{id=role_id}"/> </resultMap>
<settings> <!--默认为true,对具有延迟属性的调用都会导致该对象完整加载--> <setting name="aggressiveLazyLoading" value=""false/> </settings>
一对多映射
javaBean内部嵌套一个复杂的数据类型(集合)属性
两种配置方式:collection集合的嵌套结果映射
collection集合的嵌套结果查询
collection支持的属性和作用和association的一样,能存储一对多的数据结构肯定也能存储一对一关系。
缓存配置
一级缓存:是和SqlSession绑定的,存在sqlSession的生命周期。
在同一个sqlSession内查询,mybatis会把查询的方法和参数通过算法生成缓存的键值,将其和查询结果放入一个Map对象中.在次查询,方法名和参数相同,mybatis会取出缓存中的对象。
insert update delete 都会清空一级缓存
二级缓存:.在配置文件通过cacheEnabled默认全局启用状态
是和映射文件的命名空间绑定的,需要<cache/>开启二级缓存..
适合查询为主的的应用,绝大数都是以单表查询
一般都在业务层使用可控制的缓存来替换二级缓存