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

3 MyBatis 级联操作

1 一对多查询

对 student 数据表和 classes 数据表进行级联查询。(通过学生查班级)
在这里插入图片描述
在这里插入图片描述

  • 创建实体类 Classes 和 Student
package com.southwind.entity;

import lombok.Data;

import java.util.List;

@Data
public class Classes {
    private long id;
    private String name;
    private List<Student> students;
}
package com.southwind.entity;

import lombok.Data;

@Data
public class Student {
    private long id;
    private String name;
    private Classes classes;
}
  • 创建 StudentRepository 接口
package com.southwind.repository;

import com.southwind.entity.Student;

public interface StudentRepository {
    public Student findById(long id);
}
  • 创建 StudentRepository.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.southwind.repository.StudentRepository">
    <select id="findById" parameterType="long" resultType="com.southwind.entity.Student">
        select s.id,s.name,c.id,c.name from student s,classes c where s.id=#{id} and s.cid=c.id
    </select>
</mapper>
  • 在 config.xml 中注册 StudentRepository.xml
<mapper resource="com/southwind/repository/StudentRepository.xml"></mapper>
  • 调用接口的代理对象完成相关的业务操作
package com.southwind.test;

import com.southwind.repository.StudentRepository;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class Test3 {
    public static void main(String[] args) {
        InputStream inputStream = Test2.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlsession = sqlSessionFactory.openSession();
        StudentRepository studentRepository = sqlsession.getMapper(StudentRepository.class);
        System.out.println(studentRepository.findById(1));
    }
}
  • 运行结果
    在这里插入图片描述

那么:为什么 classes = null ???
答:因为查出来的表格前两列与Student属性id和name相对应,故会将值赋给这两个属性,而由于后面表中没有列名为classes的列,故无法赋值,所以classes为null。
在这里插入图片描述

  • 处理方法,修改 StudentRepository.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.southwind.repository.StudentRepository">
    <resultMap id="studentMap" type="com.southwind.entity.Student">
        <id column="id" property="id"></id><!-- 主键 -->
        <result column="name" property="name"></result>
        <association property="classes" javaType="com.southwind.entity.Classes">
            <id column="cid" property="id"></id>
            <result column="cname" property="name"></result>
        </association>
    </resultMap>
    <select id="findById" parameterType="long" resultMap="studentMap">
        select s.id,s.name,c.id as cid,c.name as cname from student s,classes c where s.id=#{id} and s.cid=c.id
    </select>
</mapper>
  • 运行结果:
    在这里插入图片描述

2 多对多查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 创建实体类:Customer、Goods
package com.southwind.entity;

import lombok.Data;
import java.util.List;

@Data
public class Customer {
    private long id;
    private String name;
    private List<Goods> goods;
}
package com.southwind.entity;

import lombok.Data;
import java.util.List;

@Data
public class Goods {
    private long id;
    private String name;
    private List<Customer> customers;
}
  • 创建 CustomerRepository 接口,以及 CustomerRepository.xml
package com.southwind.repository;

import com.southwind.entity.Customer;

public interface CustomerRepotory {
    public Customer findById(long id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.southwind.repository.CustomerRepository">
    <resultMap id="customerMap" type="com.southwind.entity.Customer">
        <id column="cid" property="id"></id>
        <result column="cname" property="name"></result>
        <collection property="goods" ofType="com.southwind.entity.Goods">
            <id column="gid" property="id"/>
            <result column="gname" property="name"/>
        </collection>
    </resultMap>
    <select id="findById" parameterType="long" resultMap="customerMap">
        select c.id cid,c.name cname,g.id gid,g.name gname from customer c,goods
            g,customer_goods cg where c.id = #{id} and cg.cid = c.id and cg.gid = g.id
    </select>
</mapper>
  • 创建 GoodsRepository 接口 和 GoodsRepository.xml
package com.southwind.repository;

import com.southwind.entity.Goods;

public interface GoodsRepository {
    public Goods findById(long id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.southwind.repository.GoodsRepository">
    <resultMap id="goodsMap" type="com.southwind.entity.Goods">
        <id column="gid" property="id"></id>
        <result column="gname" property="name"></result>
        <collection property="customers" ofType="com.southwind.entity.Customer">
            <id column="cid" property="id"/>
            <result column="cname" property="name"/>
        </collection>
    </resultMap>
    <select id="findById" parameterType="long" resultMap="goodsMap">
        select c.id cid,c.name cname,g.id gid,g.name gname from customer c,goods
            g,customer_goods cg where g.id = #{id} and cg.cid = c.id and cg.gid = g.id
    </select>
</mapper>

相关文章:

  • Vue项目的部署(服务器)
  • 什么是 Docker 镜像层?
  • 0922 理论知识
  • 信号采集之传感器信号学习笔记
  • CS:APP第九章 虚拟内存
  • Android Tile快捷设置
  • JVM监控和诊断的工具(JProfiler)
  • 批判性思维读书笔记
  • 42-瑞吉外卖(SpingBoot+MyBatisPlus)
  • Docker(4)Docker镜像
  • 同义词/近义词查询易语言代码
  • Python Tkinter 教程(四)—— 子模块 messagebox、colorchooser 以及 filedialog 的使用及技巧(万字详解)
  • C++画图 => 蓝桥杯青少组C++ => 信奥 学习路线图
  • 微信公众号的附件链接怎么弄
  • 概率论与梳理统计学习:随机变量(二)——知识总结与C语言案例实现
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Angularjs之国际化
  • django开发-定时任务的使用
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • JavaScript类型识别
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • 大型网站性能监测、分析与优化常见问题QA
  • 关于List、List?、ListObject的区别
  • 记一次和乔布斯合作最难忘的经历
  • 聊聊redis的数据结构的应用
  • 前端知识点整理(待续)
  • 前嗅ForeSpider采集配置界面介绍
  • 我有几个粽子,和一个故事
  • 携程小程序初体验
  • ionic入门之数据绑定显示-1
  • 回归生活:清理微信公众号
  • 如何用纯 CSS 创作一个货车 loader
  • 通过调用文摘列表API获取文摘
  • 选择阿里云数据库HBase版十大理由
  • #includecmath
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (ZT)一个美国文科博士的YardLife
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (一)为什么要选择C++
  • (转)四层和七层负载均衡的区别
  • ****Linux下Mysql的安装和配置
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET CLR Hosting 简介
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net6 webapi log4net完整配置使用流程
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [ linux ] linux 命令英文全称及解释
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [<MySQL优化总结>]
  • [100天算法】-二叉树剪枝(day 48)
  • [1181]linux两台服务器之间传输文件和文件夹
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)