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/>

二级缓存效果范围更大

相关推荐
菜菜子爱学习1 小时前
Nginx学习笔记(八)—— Nginx缓存集成
笔记·学习·nginx·缓存·运维开发
魏波.1 小时前
常用缓存软件分类及详解
缓存
Easocen5 小时前
Mybatis学习笔记(十)
mybatis
yh云想7 小时前
《多级缓存架构设计与实现全解析》
缓存·junit
白仑色11 小时前
Redis 如何保证数据安全?
数据库·redis·缓存·集群·主从复制·哨兵·redis 管理工具
千睢12 小时前
Mybatis实现页面增删改查
mybatis
浩浩测试一下12 小时前
02高级语言逻辑结构到汇编语言之逻辑结构转换 if (...) {...} else {...} 结构
汇编·数据结构·数据库·redis·安全·网络安全·缓存
ycchenG714 小时前
缓存元数据损坏操作步骤(lvmcache修复)
linux·缓存
Warren9816 小时前
Java后端面试题(含Dubbo、MQ、分布式、并发、算法)
java·开发语言·分布式·学习·算法·mybatis·dubbo
2301_7930868718 小时前
Redis 03 redis 缓存异常
数据库·redis·缓存