1、多对一:简单的说,就是将查询出来的多个结果分别赋予另一个结果的三个属性
多对一关联:
①创建对象,添加属性(这里不再展示config.xml文件连接数据库,这是每一个项目必备的)
@Data
public 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;
}
@Data
public class Dept {
private Integer deptNo;
private String dname;
private String loc;
}
②建立接口,创建方法
public interface EmpMapper {
//描述多对一的关联
Emp findById1(int id);
}
③xml文件书写SQL查询语句
<!--多对一的关联操作-->
<resultMap id="map2" type="com.jiazhong.mybatis.m2.bean.Emp" autoMapping="true">
<id property="empNo" column="empno"/>
<result property="hireDate1" column="hiredate"/>
<!--
描述多对一
简单的说:就是将查询出来的deptno,dname,loc分别赋予dept的三个属性
-->
<association property="dept" javaType="com.jiazhong.mybatis.m2.bean.Dept" autoMapping="true">
<id property="deptNo" column="deptno"/>
<result property="dname" column="dname"/>
<result property="loc" column="loc"/>
</association>
</resultMap>
<select id="findById1" resultMap="map2">
select * from emp e left join dept d on e.deptno=d.deptno where state=1 and empno=#{id}
</select>
④ 实现多对一关联
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 id="findById" resultType="com.jiazhong.mybatis.m2.bean.Dept">
select * from dept where DEPTNO = #{id}
</select>
③实现多对一拼接
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、一对多:相当于一个部门拥有多个员工
一对多关联:
①创建对象,添加属性
@Data
public class Dept {
private Integer deptNo;
private String dname;
private String loc;
//描述一对多关系
private Set<Emp> emp;
}
@Data
public 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查询语句
<!--一对多的关联写法-->
<resultMap id="map3" type="com.jiazhong.mybatis.m2.bean.Dept" autoMapping="true">
<id property="deptNo" column="deptno"/>
<!--描述这个部门的员工-->
<collection property="emp" ofType="com.jiazhong.mybatis.m2.bean.Emp" autoMapping="true"/>
</resultMap>
<select id="findById1" resultMap="map3">
select * from dept d left join emp e on d.deptno = e.deptno where d.deptno = #{id}
</select>
④ 实现一对多关联
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<Emp> findByDeptNo(int id);
}
②xml文件书写SQL查询语句
<select id="findById2" resultType="com.jiazhong.mybatis.m2.bean.Dept">
select * from dept where deptno = #{id}
</select>
<select id="findByDeptNo" resultType="com.jiazhong.mybatis.m2.bean.Emp">
select * from emp where state=1 and empno=#{id}
</select>
③实现一对多拼接
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<Emp> emps = empMapper.findByDeptNo(10);
//组装
dept.setEmp(emps);
System.out.println(dept);
sqlSession.close();
}
3、一级缓存只在一个会话间起作用,二级缓存可以解决一级缓存中不是一个会话、手动调用了清空缓存的方法、当执行更新操作(insert,update和delete)导致缓存失效等问题
一级缓存:
①创建对象,添加属性
@Data
public 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 id="findById" resultType="com.jiazhong.mybatis.m3.bean.Emp">
select * from emp where empno = #{id}
</select>
④实现一级缓存处理
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
<!--① 开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
②让实体类序列化 ------>implements Serializable
@Data
public 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参与缓存
<!--③ 当前mapper参与缓存-->
<cache/>
二级缓存效果范围更大