当前位置: 首页 > news >正文

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

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

二级缓存效果范围更大

http://www.xdnf.cn/news/1169335.html

相关文章:

  • 【学习路线】Python全栈开发攻略:从编程入门到AI应用实战
  • Custom SRP - Draw Calls
  • Claude Code Kimi K2 环境配置指南 (Windows/macOS/Ubuntu)
  • python小工具:测内网服务器网速和延迟
  • Qt资源系统:如何有效管理图片和文件
  • Canmv k230 DAC案例——TLV5638
  • 104.二叉树的最大深度
  • API是什么,如何保障API安全?
  • 刀客doc:Netflix与YouTube开始在广告战场正面交锋
  • [学习] 笛卡尔坐标系的任意移动与旋转详解
  • 洛谷 B3939:[GESP样题 四级] 绝对素数 ← 素数判定+逆序整数
  • 深入解析 Pandas:Python 数据分析的强大工具
  • Jenkins接口自动化测试(构建)平台搭建
  • Kafka监控体系搭建:基于Prometheus+JMX+Grafana的全方位性能观测方案
  • NLP自然语言处理的一些疑点整理
  • JavaScript AJAX 实现,演示如何将 Token 添加到 Authorization
  • 怎么在Mac系统中使用不坑盒子?
  • 交叉编译opencv(Cpp)于arm64架构开发板上
  • .NET使用EPPlus导出EXCEL的接口中,文件流缺少文件名信息
  • 【n8n教程笔记——工作流Workflow】文本课程(第一阶段)——1、导航编辑器界面(Navigating the editor UI)介绍
  • numpy库的基础知识(二)
  • 理解后端开发中的API设计原则
  • 达梦数据库表字段增加时报错[-2106]:无效的表或视图名,[-2116]:列[IS_REPEAT]已存在
  • [3-02-02].第04节:开发应用 - RequestMapping注解的属性2
  • 支付网关系统前后端鉴权方案
  • 网络原理 HTTP 和 HTTPS
  • 代码检测SonarQube+Git安装和规范
  • Uni-App:跨平台开发的终极解决方案
  • uniapp打开导航软件并定位到目标位置的实现
  • 当直播间告别“真人时代”:AI数字人重构商业新秩序