学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
文章目录
前言
一、resultMap处理字段和属性的映射关系
二、多对一映射处理
1、级联方式处理映射关系
2、使用association处理映射关系
3、分步查询
- 查询员工信息
- 查询部门信息
三、一对多映射处理
1、collection
2、分步查询 - 查询部门信息
- 根据部门id查询部门中的所有员工
四、延迟加载
一、resultMap处理字段和属性的映射关系
- resultMap:设置自定义映射
- 属性:
- id:表示自定义映射的唯一标识,不能重复
- type:查询的数据要映射的实体类的类型
- 子标签:
- id:设置主键的映射关系
- result:设置普通字段的映射关系
- 子标签属性:
- property:设置映射关系中实体类中的属性名
- column:设置映射关系中表中的字段名
- 若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射,即使字段名和属性名一致的属性也要映射,也就是全部属性都要列出来
<resultMapid="empResultMap"type="Emp"><idproperty="eid"column="eid"></id><resultproperty="empName"column="emp_name"></result><resultproperty="age"column="age"></result><resultproperty="sex"column="sex"></result><resultproperty="email"column="email"></result></resultMap><!--List<Emp>getAllEmp();--><selectid="getAllEmp"resultMap="empResultMap">select*fromt_emp</select>
- 若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性名符合Java的规则(使用驼峰)。此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系
- 可以通过为字段起别名的方式,保证和实体类中的属性名保持一致
<!--List<Emp>getAllEmp();--><selectid="getAllEmp"resultType="Emp">selecteid,emp_nameempName,age,sex,emailfromt_emp</select>
- 可以在MyBatis的核心配置文件中的
setting
标签中,设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将_类型的字段名转换为驼峰,例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为userName。
核心配置文件详解
<settings><settingname="mapUnderscoreToCamelCase"value="true"/></settings>
二、多对一映射处理
查询员工信息以及员工所对应的部门信息
publicclassEmp { privateIntegereid; privateStringempName; privateIntegerage; privateStringsex; privateStringemail; privateDeptdept; //...构造器、get、set方法等}
1、级联方式处理映射关系
<resultMapid="empAndDeptResultMapOne"type="Emp"><idproperty="eid"column="eid"></id><resultproperty="empName"column="emp_name"></result><resultproperty="age"column="age"></result><resultproperty="sex"column="sex"></result><resultproperty="email"column="email"></result><resultproperty="dept.did"column="did"></result><resultproperty="dept.deptName"column="dept_name"></result></resultMap><!--EmpgetEmpAndDept( ("eid")Integereid);--><selectid="getEmpAndDept"resultMap="empAndDeptResultMapOne">select*fromt_empleftjoint_deptont_emp.eid=t_dept.didwheret_emp.eid=#{eid} </select>
2、使用association处理映射关系
- association:处理多对一的映射关系
- property:需要处理多对的映射关系的属性名
- javaType:该属性的类型
<resultMapid="empAndDeptResultMapTwo"type="Emp"><idproperty="eid"column="eid"></id><resultproperty="empName"column="emp_name"></result><resultproperty="age"column="age"></result><resultproperty="sex"column="sex"></result><resultproperty="email"column="email"></result><associationproperty="dept"javaType="Dept"><idproperty="did"column="did"></id><resultproperty="deptName"column="dept_name"></result></association></resultMap><!--EmpgetEmpAndDept( ("eid")Integereid);--><selectid="getEmpAndDept"resultMap="empAndDeptResultMapTwo">select*fromt_empleftjoint_deptont_emp.eid=t_dept.didwheret_emp.eid=#{eid} </select>
3、分步查询
1. 查询员工信息
- select:设置分布查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名.方法名)
- column:设置分步查询的条件
//EmpMapper里的方法/*** 通过分步查询,员工及所对应的部门信息* 分步查询第一步:查询员工信息* @param * @return com.atguigu.mybatis.pojo.Emp* @date 2022/2/27 20:17*/EmpgetEmpAndDeptByStepOne( ("eid") Integereid);
<resultMapid="empAndDeptByStepResultMap"type="Emp"><idproperty="eid"column="eid"></id><resultproperty="empName"column="emp_name"></result><resultproperty="age"column="age"></result><resultproperty="sex"column="sex"></result><resultproperty="email"column="email"></result><associationproperty="dept"select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"column="did"></association></resultMap><!--EmpgetEmpAndDeptByStepOne( ("eid") Integereid);--><selectid="getEmpAndDeptByStepOne"resultMap="empAndDeptByStepResultMap">select*fromt_empwhereeid=#{eid} </select>
2. 查询部门信息
//DeptMapper里的方法/*** 通过分步查询,员工及所对应的部门信息* 分步查询第二步:通过did查询员工对应的部门信息* @param* @return com.atguigu.mybatis.pojo.Emp* @date 2022/2/27 20:23*/DeptgetEmpAndDeptByStepTwo( ("did") Integerdid);
<!--此处的resultMap仅是处理字段和属性的映射关系--><resultMapid="EmpAndDeptByStepTwoResultMap"type="Dept"><idproperty="did"column="did"></id><resultproperty="deptName"column="dept_name"></result></resultMap><!--DeptgetEmpAndDeptByStepTwo( ("did") Integerdid);--><selectid="getEmpAndDeptByStepTwo"resultMap="EmpAndDeptByStepTwoResultMap">select*fromt_deptwheredid=#{did} </select>
三、一对多映射处理
publicclassDept { privateIntegerdid; privateStringdeptName; privateList<Emp>emps; //...构造器、get、set方法等}
1、collection
- collection:用来处理一对多的映射关系
- ofType:表示该属性对饮的集合中存储的数据的类型
<resultMapid="DeptAndEmpResultMap"type="Dept"><idproperty="did"column="did"></id><resultproperty="deptName"column="dept_name"></result><collectionproperty="emps"ofType="Emp"><idproperty="eid"column="eid"></id><resultproperty="empName"column="emp_name"></result><resultproperty="age"column="age"></result><resultproperty="sex"column="sex"></result><resultproperty="email"column="email"></result></collection></resultMap><!--DeptgetDeptAndEmp( ("did") Integerdid);--><selectid="getDeptAndEmp"resultMap="DeptAndEmpResultMap">select*fromt_deptleftjoint_empont_dept.did=t_emp.didwheret_dept.did=#{did} </select>
2、分步查询
1. 查询部门信息
/*** 通过分步查询,查询部门及对应的所有员工信息* 分步查询第一步:查询部门信息* @param did * @return com.atguigu.mybatis.pojo.Dept* @date 2022/2/27 22:04*/DeptgetDeptAndEmpByStepOne( ("did") Integerdid);
<resultMapid="DeptAndEmpByStepOneResultMap"type="Dept"><idproperty="did"column="did"></id><resultproperty="deptName"column="dept_name"></result><collectionproperty="emps"select="com.atguigu.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"column="did"></collection></resultMap><!--DeptgetDeptAndEmpByStepOne( ("did") Integerdid);--><selectid="getDeptAndEmpByStepOne"resultMap="DeptAndEmpByStepOneResultMap">select*fromt_deptwheredid=#{did} </select>
2. 根据部门id查询部门中的所有员工
/*** 通过分步查询,查询部门及对应的所有员工信息* 分步查询第二步:根据部门id查询部门中的所有员工* @param did* @return java.util.List<com.atguigu.mybatis.pojo.Emp>* @date 2022/2/27 22:10*/List<Emp>getDeptAndEmpByStepTwo( ("did") Integerdid);
<!--List<Emp>getDeptAndEmpByStepTwo( ("did") Integerdid);--><selectid="getDeptAndEmpByStepTwo"resultType="Emp">select*fromt_empwheredid=#{did} </select>
四、延迟加载
- 分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息:
- lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
- aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载
- 此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=“lazy(延迟加载)|eager(立即加载)”
<settings><!--开启延迟加载--><settingname="lazyLoadingEnabled"value="true"/></settings>
publicvoidgetEmpAndDeptByStepOne() { SqlSessionsqlSession=SqlSessionUtils.getSqlSession(); EmpMappermapper=sqlSession.getMapper(EmpMapper.class); Empemp=mapper.getEmpAndDeptByStepOne(1); System.out.println(emp.getEmpName()); }
- 关闭延迟加载,两条SQL语句都运行了
- 开启延迟加载,只运行获取emp的SQL语句
publicvoidgetEmpAndDeptByStepOne() { SqlSessionsqlSession=SqlSessionUtils.getSqlSession(); EmpMappermapper=sqlSession.getMapper(EmpMapper.class); Empemp=mapper.getEmpAndDeptByStepOne(1); System.out.println(emp.getEmpName()); System.out.println("----------------"); System.out.println(emp.getDept()); }
- 开启后,需要用到查询dept的时候才会调用相应的SQL语句
- fetchType:当开启了全局的延迟加载之后,可以通过该属性手动控制延迟加载的效果,fetchType=“lazy(延迟加载)|eager(立即加载)”
<resultMapid="empAndDeptByStepResultMap"type="Emp"><idproperty="eid"column="eid"></id><resultproperty="empName"column="emp_name"></result><resultproperty="age"column="age"></result><resultproperty="sex"column="sex"></result><resultproperty="email"column="email"></result><associationproperty="dept"select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"column="did"fetchType="lazy"></association></resultMap>
总结
以上就是Mybatis之自定义映射resultMap的相关知识点,希望对你有所帮助。
积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!