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

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

多对一关联:

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

java 复制代码
@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;
}
java 复制代码
@Data
public class Dept {
    private Integer deptNo;
    private String dname;
    private String loc;
}

②建立接口,创建方法

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

③xml文件书写SQL查询语句

XML 复制代码
    <!--多对一的关联操作-->
    <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>

④ 实现多对一关联

java 复制代码
    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();
    }

多对一拼接:

①建立接口,创建方法

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

②xml文件书写SQL查询语句

XML 复制代码
    <select id="findById" resultType="com.jiazhong.mybatis.m2.bean.Dept">
        select * from dept where DEPTNO = #{id}
    </select>

③实现多对一拼接

java 复制代码
    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、一对多:相当于一个部门拥有多个员工

一对多关联:

①创建对象,添加属性

java 复制代码
@Data
public class Dept {
    private Integer deptNo;
    private String dname;
    private String loc;
    //描述一对多关系
    private Set<Emp> emp;
}
java 复制代码
@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;
}

②建立接口,创建方法

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

③xml文件书写SQL查询语句

XML 复制代码
    <!--一对多的关联写法-->
    <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>

④ 实现一对多关联

java 复制代码
    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();
    }

一对多拼接:

①建立接口,创建方法

java 复制代码
public interface DeptMapper {
    //一对多的拼接写法
    Dept findById2(int id);
}
java 复制代码
public interface EmpMapper {
    //描述一对多的拼接操作
    Set<Emp> findByDeptNo(int id);
}

②xml文件书写SQL查询语句

XML 复制代码
    <select id="findById2" resultType="com.jiazhong.mybatis.m2.bean.Dept">
        select * from dept where deptno = #{id}
    </select>
XML 复制代码
    <select id="findByDeptNo" resultType="com.jiazhong.mybatis.m2.bean.Emp">
        select * from emp where state=1 and empno=#{id}
    </select>

③实现一对多拼接

java 复制代码
    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)导致缓存失效等问题

一级缓存:

①创建对象,添加属性

java 复制代码
@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;
}

②建立接口,创建方法

java 复制代码
public interface EmpMapper {
    Emp findById(int id);
}

③xml文件书写SQL查询语句

XML 复制代码
    <select id="findById" resultType="com.jiazhong.mybatis.m3.bean.Emp">
        select * from emp where empno = #{id}
    </select>

④实现一级缓存处理

java 复制代码
    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

XML 复制代码
        <!--① 开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>

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

java 复制代码
@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参与缓存

XML 复制代码
    <!--③ 当前mapper参与缓存-->
    <cache/>

二级缓存效果范围更大

相关推荐
番茄炒鸡蛋加糖33 分钟前
缓存三大问题
缓存
江晓鱼未暖5 小时前
十七、Redis 核心原理与架构详解
大数据·数据库·数据仓库·redis·缓存·架构
小罗水6 小时前
第13章 Redis 缓存、幂等锁与任务状态
数据库·redis·缓存
热心市民lcj6 小时前
Spring Boot 整合 Caffeine 本地缓存实战
spring boot·后端·缓存
zx1154507 小时前
【热点 Key 探测与加长缓存 TTL 实战】
缓存
momo19 小时前
Java+WebAI黑马知识点
java·spring boot·mybatis
toooooop821 小时前
如何用 ss + ps 精准定位本机 Redis 的“隐形”消费者?
linux·数据库·redis·缓存
软萌萌的121 小时前
C#中的多级缓存架构设计与实现深度解析
缓存·c#·wpf
snow@li1 天前
MyBatis:动态 SQL 全景梳理
数据库·sql·mybatis
就改了1 天前
Mybatis快速入门大全(详细版)
java·spring boot·mybatis