CSDN话题挑战赛第2期
参赛话题:学习笔记
目录
1.使用全局配置处理字段名和属性名不一致的情况
2.resultMap处理字段和属性的映射关系
1.处理一对一映射
2.多对一映射处理
级联方式处理映射关系
使用association处理映射关系
分步查询
3.一对多映射处理
1.collection
2.分步查询
建立 t_emp 表,并添加数据:
建立 t_dept 表,并添加数据:
实体类:Emp
package com.atguigu.mybatis.pojo;
public class Emp {
private Integer empId;
private String empName;
private Integer age;
private String gender;
private Dept dept;
public Emp() {
}
public Emp(Integer empId, String empName, Integer age, String gender, Dept dept) {
this.empId = empId;
this.empName = empName;
this.age = age;
this.gender = gender;
this.dept = dept;
}
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp{" +
"empId=" + empId +
", empName='" + empName + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", dept=" + dept +
'}';
}
}
实体类:Dept
package com.atguigu.mybatis.pojo;
public class Dept {
private Integer deptId;
private String deptName;
public Dept() {
}
public Dept(Integer deptId, String deptName) {
this.deptId = deptId;
this.deptName = deptName;
}
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
@Override
public String toString() {
return "Dept{" +
"deptId=" + deptId +
", deptName='" + deptName + '\'' +
'}';
}
}
接口:
public interface EmpMapper {
Emp getEmpById(@Param("empId") Integer empId);
}
SQL:
select * from t_emp where emp_id = #{empId};
测试:
public void test(){
SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
SqlSession sqlSession = sqlSessionUtils.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp empById = mapper.getEmpById(1);
System.out.println(empById.toString());
}
运行结果:
原因:JAVA中属性名 与 数据库中字段名不一致
接口:
Emp getEmpAndDeptById(@Param("empId") Integer empId);
测试:
public void test2(){
SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
SqlSession sqlSession = sqlSessionUtils.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp empAndDeptById = mapper.getEmpAndDeptById(1);
System.out.println(empAndDeptById);
}
①查询员工信息
Emp getEmpAndDeptByStep(@Param("empId") Integer empId);
select:设置分步查询,查询某个属性的值的sql的标识(namespace.sqlid)column:将sql以及查询结果中的某个字段设置为分步查询的条件
Dept getDeptByStep(@Param("deptId") Integer deptId);
测试:
public void test3(){
SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
SqlSession sqlSession = sqlSessionUtils.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp empAndDeptByStep = mapper.getEmpAndDeptByStep(1);
System.out.println(empAndDeptByStep);
}
分步查询的优点:可以实现延迟加载但是必须在核心配置文件中设置全局配置信息:
- lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
- aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的 sql 。此时可通 association和 collection 中的 fetchType 属性设置当前的分步查询是否使用延迟加载, fetchType="lazy(延迟加载) | eager(立即加载)"
测试:
public void test3(){
SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
SqlSession sqlSession = sqlSessionUtils.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp empAndDeptByStep = mapper.getEmpAndDeptByStep(1);
System.out.println(empAndDeptByStep.getEmpName());
}
未开启延迟加载(执行了2次SQL):
开启延迟加载:
执行了1次SQL:
接口:
Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);
实体类中,添加 emps集合:
DeptMapper.xml:
collection :设置一对多的映射关系ofType :设置 collection 标签所处理的集合属性中存储数据的类型
测试:
public void test4(){
SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
SqlSession sqlSession = sqlSessionUtils.getSqlSession();
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
Dept deptAndEmpByDeptId = mapper.getDeptAndEmpByDeptId(1);
System.out.println(deptAndEmpByDeptId);
}
运行结果:
Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);
List getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);
测试:
public void test5(){
SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
SqlSession sqlSession = sqlSessionUtils.getSqlSession();
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
Dept deptAndEmpByStepOne = mapper.getDeptAndEmpByStepOne(1);
System.out.println(deptAndEmpByStepOne);
}