> 技术文档 > mybatis多对一一对多的关联及拼接操作以及缓存处理

mybatis多对一一对多的关联及拼接操作以及缓存处理

1、多对一:简单的说,就是将查询出来的多个结果分别赋予另一个结果的三个属性

多对一关联:

①创建对象,添加属性(这里不再展示config.xml文件连接数据库,这是每一个项目必备的)

@Datapublic class Emp { private Integer empNo; private String ename; private String job; private Integer mgr; private String hireDate1; private Double sal; private Double comm; private Integer deptNo; public Integer state; //描述多对一的关系 private Dept dept;}
@Datapublic class Dept { private Integer deptNo; private String dname; private String loc;}

 ②建立接口,创建方法

public interface EmpMapper { //描述多对一的关联 Emp findById1(int id);}

③xml文件书写SQL查询语句 

             select * from emp e left join dept d on e.deptno=d.deptno where state=1 and empno=#{id} 

④ 实现多对一关联

 private static void b1(){ InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(\"config.xml\"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); Emp emp = empMapper.findById1(7980); System.out.println(emp); sqlSession.close(); }

 多对一拼接:

①建立接口,创建方法

public interface EmpMapper { //描述多对一的拼接操作 Emp findById2(int id);}
public interface DeptMapper { //多对一的,查询出来的部门信息 Dept findById(int id);}

 ②xml文件书写SQL查询语句 

  select * from dept where DEPTNO = #{id} 

 ③实现多对一拼接

 private static void b2(){ InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(\"config.xml\"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); //只能获取到员工信息 Emp emp = empMapper.findById2(7980); //只能查询到部门信息 DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class); Dept dept = deptMapper.findById(emp.getDeptNo()); //组装 emp.setDept(dept); System.out.println(emp); sqlSession.close(); }

2、一对多:相当于一个部门拥有多个员工

一对多关联:

①创建对象,添加属性

@Datapublic class Dept { private Integer deptNo; private String dname; private String loc; //描述一对多关系 private Set emp;}
@Datapublic class Emp { private Integer empNo; private String ename; private String job; private Integer mgr; private String hireDate1; private Double sal; private Double comm; private Integer deptNo; public Integer state;}

②建立接口,创建方法

public interface DeptMapper { //一对多的关联写法 Dept findById1(int id);}

③xml文件书写SQL查询语句 

        select * from dept d left join emp e on d.deptno = e.deptno where d.deptno = #{id} 

④ 实现一对多关联

 private static void c1(){ InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(\"config.xml\"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class); Dept dept = deptMapper.findById1(10); System.out.println(dept); sqlSession.close(); }

一对多拼接:

①建立接口,创建方法

public interface DeptMapper { //一对多的拼接写法 Dept findById2(int id);}
public interface EmpMapper { //描述一对多的拼接操作 Set findByDeptNo(int id);}

②xml文件书写SQL查询语句 

  select * from dept where deptno = #{id} 
  select * from emp where state=1 and empno=#{id} 

③实现一对多拼接

 private static void c2(){ InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(\"config.xml\"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //查询部门 DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class); Dept dept = deptMapper.findById2(10); //查询员工信息 EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); Set emps = empMapper.findByDeptNo(10); //组装 dept.setEmp(emps); System.out.println(dept); sqlSession.close(); }

3、一级缓存只在一个会话间起作用,二级缓存可以解决一级缓存中不是一个会话、手动调用了清空缓存的方法、当执行更新操作(insert,update和delete)导致缓存失效等问题

一级缓存:

①创建对象,添加属性

@Datapublic class Emp{ private Integer empNo; private String ename; private String job; private Integer mgr; private String hireDate1; private Double sal; private Double comm; private Integer deptNo; public Integer state;}

②建立接口,创建方法

public interface EmpMapper { Emp findById(int id);}

③xml文件书写SQL查询语句 

  select * from emp where empno = #{id} 

④实现一级缓存处理

 private static void a(){ InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(\"config.xml\"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); //查询7908的员工 Emp emp1 = empMapper.findById(7908); System.out.println(emp1); //又查询了7908的员工,这次不需要连接数据库了 使用了缓存(一级缓存) Emp emp2 = empMapper.findById(7908); System.out.println(emp2); sqlSession.close(); }

二级缓存:

①在config.xml文件中开启二级缓存 ------>cacheEnabled

  

②让实体类序列化 ------>implements Serializable

@Datapublic class Emp implements Serializable { private Integer empNo; private String ename; private String job; private Integer mgr; private String hireDate1; private Double sal; private Double comm; private Integer deptNo; public Integer state;}

③在书写SQL语句的xml文件中使当前mapper参与缓存

  

二级缓存效果范围更大