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

二级缓存效果范围更大

相关推荐
接着奏乐接着舞。2 小时前
【2026】73道Redis 常见面试题与参考答案
数据库·redis·后端·缓存
SQL-First布道者6 小时前
⚡Spring JDBC 完整体系 · 第 10 集 · 手搓 `BaseCondition`
java·spring boot·后端·spring·mybatis·spring jdbc
南城以南溫暖如初1476 小时前
社交裂变商城系统设计与实战开发指南
java·spring boot·mysql·vue·mybatis
南城以南溫暖如初1476 小时前
分享返现商城系统开发实战:技术架构与运营经验指南
java·spring boot·mysql·架构·vue·mybatis
南城以南溫暖如初1478 小时前
社群电商实战指南:从零搭建高转化社区的技术架构
java·spring boot·mysql·系统架构·vue·mybatis
南城以南溫暖如初1478 小时前
会员返利商城系统开发实战:架构设计与实现指南
java·spring boot·mysql·vue·mybatis
Seraphina369 小时前
记一次实验:利用缓存服务器规范化技术进行网页缓存欺骗
经验分享·笔记·网络安全·缓存
草莓熊Lotso2 天前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
煎饼皮皮侠2 天前
【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis
数据库·mybatis
云存储小天使2 天前
训练效率提升50%以上:GooseFS 写缓存及其在具身智能数据处理中的应用
缓存·腾讯云·对象存储·goosefs