自动映射
-
1、全局setting设置
-
- autoMappingBehavior默认是PARTIAL,开启自动映射的功能。唯一的要求是列名和javaBean属性名一致
-
- 如果autoMappingBehavior设置为null则会取消自动映射
-
- 数据库字段命名规范,POJO属性符合驼峰命名法,
如A_COLUMN->aColumn
,我们可以开启自动驼峰命名规则映射功能,mapUnderscoreToCamelCase=true
。
- 数据库字段命名规范,POJO属性符合驼峰命名法,
- 2、自定义resultMap,实现高级结果集映射。
查询进阶(resultMap)
-
constructor-类在实例化时, 用来注入结果到构造方法中
–idArg-ID 参数; 标记结果作为ID 可以帮助提高整体效能
–arg-注入到构造方法的一个普通结果 -
id–一个ID 结果; 标记结果作为ID 可以帮助提高整体效能
-
result–注入到字段或JavaBean 属性的普通结果
-
association
–一个复杂的类型关联;许多结果将包成这种类型
–嵌入结果映射–结果映射自身的关联,或者参考一个 -
collection
–复杂类型的集
–嵌入结果映射–结果映射自身的集,或者参考一个 -
discriminator–使用结果值来决定使用哪个结果映射
- case–基于某些值的结果映射
- 嵌入结果映射–这种情形结果也映射它本身,因此可以包含很多相同的元素,或者它可以参照一个外部的结果映射。
- case–基于某些值的结果映射
id & result
- id 和result 映射一个单独列的值到
简单数据类型
(字符串,整型,双精度浮点数,日期等)的属性或字段。
column
:指定哪一列
property
:指定对应的 javaBean属性
association
- 复杂对象映射
- POJO中的属性可能会是一个对象
- 我们可以使用联合查询,并以级联属性的方式封装对象。
association-分段查询
select
: 调用目标的方法查询当前属性的值
column
:将指定列的值传入目标方法
流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性
association-分段查询&延迟加载
开启延迟加载和属性按需加载
- 旧版本的MyBatis需要额外的支持包
–asm-3.3.1.jar
–cglib-2.2.2.jar
Collection-集合类型&嵌套结果集
Collection-分步查询&延迟加载
@Test
public void test06() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
DepartmentMapper mapper = openSession.getMapper(DepartmentMapper.class);
/*Department department = mapper.getDeptByIdPlus(1);
System.out.println(department);
System.out.println(department.getEmps());*/
Department deptByIdStep = mapper.getDeptByIdStep(1);
System.out.println(deptByIdStep.getDepartmentName());
System.out.println(deptByIdStep.getEmps());
}finally{
openSession.close();
}
}
扩展-多列值封装map传递
•分步查询的时候通过column指定,将对应的列的数据传递过去,我们有时需要传递多列数据。
•使用{key1=column1,key2=column2…}的形式
•association或者collection标签的fetchType=eager/lazy
可以覆盖全局的延迟加载策略,指定立即加载(eager)
或者延迟加载(lazy)
discriminator(鉴别器)
<mapper>
<!-- =======================鉴别器============================ -->
<!-- <discriminator javaType=""></discriminator>
鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为
封装Employee:
如果查出的是女生:就把部门信息查询出来,否则不查询;
如果是男生,把last_name这一列的值赋值给email;
-->
<resultMap type=