MyBatis一对多关联查询(级联查询)

Mybatis 一对多关联查询(两种方法) NULL 博文链接:https://qihaibo1989.iteye.com/blog/2354597 立即下载
一对多级联查询

创建表及准备数据:

CREATE TABLE `user` (
  `uid` tinyint(2) NOT NULL,
  `uname` varchar(20) DEFAULT NULL,
  `usex` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `orders` (
		`id` tinyint(2) PRIMARY KEY AUTO_INCREMENT,
		`ordersn` varchar(10) DEFAULT NULL,
		`user_id` tinyint(2) DEFAULT NULL,
		CONSTRAINT fk_user_id FOREIGN KEY(user_id) REFERENCES user(uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述
在这里插入图片描述
创建工程并导入相关JAR包
在这里插入图片描述
创建持久化类MyUser、Orders:

package pers.zhang.po;

import java.util.List;

/**
* 数据库中user表的持久类
*/
public class MyUser {
    private Integer uid; // 主键
    private String uname;
    private String usex;

    private List<Orders> ordersList; //一对多关系表达
    
    public Integer getUid() {
		return uid;
	}


	public void setUid(Integer uid) {
		this.uid = uid;
	}


	public String getUname() {
		return uname;
	}


	public void setUname(String uname) {
		this.uname = uname;
	}


	public String getUsex() {
		return usex;
	}


	public void setUsex(String usex) {
		this.usex = usex;
	}

	

	public List<Orders> getOrdersList() {
		return ordersList;
	}


	public void setOrdersList(List<Orders> ordersList) {
		this.ordersList = ordersList;
	}


	@Override
	public String toString() {
		return "MyUser [uid=" + uid + ", uname=" + uname + ", usex=" + usex + ", ordersList=" + ordersList + "]";
	}
}
package pers.zhang.po;

public class Orders {
    private Integer id;
    private String ordersn;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getOrdersn() {
        return ordersn;
    }

    public void setOrdersn(String ordersn) {
        this.ordersn = ordersn;
    }

    @Override
    public String toString() {
        return "Orders[id=" + id + ",ordersn=" + ordersn + "]";
    }
}

创建映射文件:
UserMapper.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="pers.zhang.mapper.UserMapper">
    <!-- 一对多 根据uid查询用户及其关联的订单信息:级联查询的第一种方法(嵌套查询) -->
    <resultMap type="pers.zhang.po.MyUser" id="userAndOrders1">
        <id property="uid" column="uid" />
        <result property="uname" column="uname" />
        <result property="usex" column="usex" />
        <!-- 一对多级联查询,ofType表示集合中的元素类型,将uid传递给selectOrdersByld -->
        <collection property="ordersList" ofType="pers.zhang.po.Orders"
            column="uid" select="pers.zhang.mapper.OrdersMapper.selectOrdersById" />
    </resultMap>
    <select id="selectUserOrdersById1" parameterType="Integer"
        resultMap="userAndOrders1">
        select * from user where uid = #{id}
    </select>
    
    
    <!--对多根据uid查询用户及其关联的订单信息:级联查询的第二种方法(嵌套结果) -->
    <resultMap type="pers.zhang.po.MyUser" id="userAndOrders2">
        <id property="uid" column="uid" />
        <result property="uname" column="uname" />
        <result property="usex" column="usex" />
        <!-- 对多级联查询,ofType表示集合中的元素类型 -->
        <collection property="ordersList" ofType="pers.zhang.po.Orders">
            <id property="id" column="id" />
            <result property="ordersn" column="ordersn" />
        </collection>
    </resultMap>
    <select id="selectUserOrdersById2" parameterType="Integer"
        resultMap="userAndOrders2">
        select u.*,o.id, o.ordersn from user u, orders o where u.uid
        = o.user_id and
        u.uid=#{id}
    </select>
    
    
    <!-- 一对多 根据uid查询用户及其关联的订单信息:连接查询(使用POJO存储结果) -->
    <select id="selectUserOrdersById3" parameterType="Integer"
        resultType="pers.zhang.po.SelectUserOrdersById">
        select u.*, o.id, o.ordersn from user u, orders o where
        u.uid = o.user_id
        and u.uid=#{id}
    </select>
</mapper>

OrdersMapper.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="pers.zhang.mapper.OrdersMapper">
    <!-- 根据用户uid查询订单信息 -->
    <select id="selectOrdersById" resultType="pers.zhang.po.Orders"
        parameterType="Integer">
        select * from orders where user_id=#{id}
    </select>
</mapper>

创建 POJO 类:

package pers.zhang.po;

public class SelectUserOrdersById {
    private Integer uid;
    private String uname;
    private String usex;
    private Integer id;
    private String ordersn;
    
    public Integer getUid() {
		return uid;
	}

	public void setUid(Integer uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}
	
	public void setUname(String uname) {
		this.uname = uname;
	}

	public String getUsex() {
		return usex;
	}

	public void setUsex(String usex) {
		this.usex = usex;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getOrdersn() {
		return ordersn;
	}

	public void setOrdersn(String ordersn) {
		this.ordersn = ordersn;
	}

	@Override
    public String toString() { // 为了方便查看结果,重写了toString方法
        return "User[uid=" + uid + ",uname=" + uname + ",usex=" + usex
                + ",oid=" + id + ",ordersn=" + ordersn + "]";
    }
}

创建Mapper接口:

package pers.zhang.mapper;

import java.util.List;

import pers.zhang.po.MyUser;
import pers.zhang.po.SelectUserOrdersById;

public interface UserMapper {
	
	public MyUser selectUserOrdersById1(Integer uid);

    public MyUser selectUserOrdersById2(Integer uid);

    public List<SelectUserOrdersById> selectUserOrdersById3(Integer uid);
}
package pers.zhang.mapper;

import java.util.List;

import pers.zhang.po.Orders;

public interface OrdersMapper {

	public List<Orders> selectOrdersById(Integer uid);
}
测试

一对多第一种方式:嵌套查询

@Test
public void test1() throws Exception{
	//加载核心配置文件
	String resource = "sqlMapConfig.xml";
	InputStream in = Resources.getResourceAsStream(resource);
	//创建SqlSessionFactory
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	//获得sqlSession
	SqlSession sqlSession = sqlSessionFactory.openSession();
	//获得Mapper
	UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	Integer id = 3;
	MyUser user = mapper.selectUserOrdersById1(id);
	System.out.println(user);
}

控制台打印输出:

DEBUG [main] - ==>  Preparing: select * from user where uid = ? 
DEBUG [main] - ==> Parameters: 3(Integer)
DEBUG [main] - <==      Total: 1
DEBUG [main] - ==>  Preparing: select * from orders where user_id=? 
DEBUG [main] - ==> Parameters: 3(Integer)
DEBUG [main] - <==      Total: 1
MyUser [uid=3, uname=Lily, usex=女, ordersList=[Orders[id=6,ordersn=3331]]]

一对多第二种方式:连接查询,映射到持久化类中

@Test
public void test2() throws Exception{
	//加载核心配置文件
	String resource = "sqlMapConfig.xml";
	InputStream in = Resources.getResourceAsStream(resource);
	//创建SqlSessionFactory
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	//获得sqlSession
	SqlSession sqlSession = sqlSessionFactory.openSession();
	//获得Mapper
	UserMapper mapper = sqlSession.getMapper(UserMapper.class);
	Integer id = 2;
	MyUser user = mapper.selectUserOrdersById2(id);
	System.out.println(user);
}

控制台打印:

DEBUG [main] - ==>  Preparing: select u.*,o.id, o.ordersn from user u, orders o where u.uid = o.user_id and u.uid=? 
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 2
MyUser [uid=2, uname=Jerry, usex=男, ordersList=[Orders[id=4,ordersn=2221], Orders[id=5,ordersn=2222]]]

一对多第三种方式:连接查询,映射到POJO中

@Test
	public void test3() throws Exception{
		//加载核心配置文件
		String resource = "sqlMapConfig.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		//创建SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
		//获得sqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//获得Mapper
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		Integer id = 2;
		List<SelectUserOrdersById> list = mapper.selectUserOrdersById3(id);
		System.out.println(list);
	}

控制台打印:

DEBUG [main] - ==>  Preparing: select u.*, o.id, o.ordersn from user u, orders o where u.uid = o.user_id and u.uid=? 
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 2
[User[uid=2,uname=Jerry,usex=男,oid=4,ordersn=2221], User[uid=2,uname=Jerry,usex=男,oid=5,ordersn=2222]]
2024年最全scrapy+scrapyd+gerapy 爬虫调度框架,字节跳动面试时间 scrapyd是一个用于部署和运行scrapy爬虫的程序,它允许你通过JSON API来部署爬虫项目和控制爬虫运行,scrapyd是一个守护进程,监听爬虫的运行和请求,然后启动进程来执行它们方便地控制爬虫运行直观地查看爬虫状态实时地查看爬取结果简单地实现项目部署统一地实现主机管理轻松地编写爬虫代码。 阅读详情

相关推荐

从零构建FOC:手把手教你实现无刷电机磁场定向控制

本文是一份详尽的FOC(磁场定向控制)实战教程,指导开发者从零开始构建无刷电机驱动系统。文章深入解析了FOC的核心算法,包括坐标变换(Clarke/Park)、SVPWM调制和双环PI控制,并对比了有感与无感方案的实现差异。通过分步调试指南,帮助读者亲手实现稳定、高效的无刷电机控制,彻底掌握其底层原理。

h3i4j的博客 514

mybatis_“关联查询(级联查询)“

一、一对一关联 1.1、提出需求   根据班级id查询班级信息(带老师的信息) 1.2、创建表和数据   创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系。 CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT,

weixin_45828554的博客 801

红外气体检测方案解析:从NDIR原理到物联网终端设计实践

气体检测是工业安全与环境监测的核心需求,其技术原理主要基于气体分子对特定物理或化学信号的响应。非色散红外(NDIR)技术作为一种物理检测方法,通过测量气体分子对特定波长红外光的吸收来定量浓度,因其不依赖化学反应,具备寿命长、抗干扰强和响应快等优势。在工程实践中,红外气体检测方案的价值在于为物联网终端设备提供了高可靠、低功耗的感知能力,广泛应用于工业过程监控、环境空气质量监测以及智能家居安全预警等场景。本文以一套集成了Microchip MCU、Axetris红外光源和Pyreos热释电传感器的参考设计为例,

weixin_30954817的博客 394

MyBatis一对多级联查询

MyBatis一对多级联查询 级联关系是数据库实体的概念,有3种级联关系,分别为1对1级联,1对多级联,多对多级联。 级联的优点:关联数据十分方便。 缺点:级联过多会增加数据库系统的复杂度,同时降低系统性能。 如果表A引用了表B的主键,A表就是主表,B表就是父表,当查询表A数据时,通过A的外键将B的相关记录返回,这就是级联查询。例如,当查询一个人的个人信息,可以通过身份证号返回他的身份信息。 在实际生活中一对多级联关系有很多,例如一个用户可以有多个订单,而一个订单只属于一个用户。 下面通过用户和订单的关系实

nuist_NJUPT的博客 1803

FIddler+Proxifer 实现PC客户端抓包详细教程

FIddler+Proxifer 实现PC客户端抓包详细教程

森明帮大于黑虎帮的博客 1万+

ArcMap新手必看:Shape属性中的点ZM值到底是什么?如何快速处理

本文深入解析ArcMap中Shape属性中的点ZM值,揭示其在GIS数据中的隐藏维度作用,包括Z值(高程值)和M值(测量值)。针对ZM值可能引发的服务发布问题,提供三种高效处理方案,帮助新手快速掌握数据导入时的ZM值管控策略及精准去除方法。

weixin_42561476的博客 431

Mybatis多表联接查询(一对多分级查询)

【代码】Mybatis多表联接查询(一对多分级查询)

qq_52076808的博客 975

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3372

【Mybatis】级联查询之一对多级联查询

目录引言创建工程和数据库表创建实体类和数据库操作接口Order 类User类UserMapperOrderMapper创建配置文件mybatis-config.xmlOrderMapper.xmlUserMapper.xml方法1方法2添加测试代码 引言 与前面介绍的一对一相比 Mybatis】级联查询之一对一级联查询,在实际开发中接触最多的还是一对多的关联关系。 应用场景举例:用户与订单之间的关系为一对多,即一个用户可以有多个订单,而一个订单只属于一个用户。 创建工程和数据库表 创建Spring整合My

lucashu的博客 1583

KylinOS 离线安装 MinIO【图文步骤】

在国产操作系统 KylinOS 中安装 MinIO,详细步骤...

甘蓝的专栏 1536

Windows Docker Desktop部署MaxKB详细教程

MaxKB(Max Knowledge Base)是一款基于大语言模型(LLM)和检索增强生成(RAG)技术的开源知识库问答系统,旨在帮助企业、教育机构及研究组织高效管理知识并提供智能问答服务。

猿小白的博客 1374

Mybatis(三):一对多级联查询

主要是使用<collection>来实现关联。 package cn.saytime.domain; import java.util.List; /** * 用户 */ public class User { private Long id; private String username; private Integer age; //private IdCard idCard; // 一对多 private List<O

meser88的博客 365

【模型】OpenClaw 接入阿里云永久免费模型方案

Qwen2.5-7B-Instruct 模型为例。

海兰 4473

mybatis一对多关联 创建_MyBatis多对多关联查询(级联查询)

其实,MyBatis 没有实现多对多级联,这是因为多对多级联可以通过两个一对多级联进行替换。例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系,使用一个中间表(订单记录表)就可以将多对多级联转换成两个一对多的关系。下面以订单和商品(实现“查询所有订单以及每个订单对应的商品信息”的功能)为例讲解多对多级联查询。1)创建数据表订单表在前面已创建,这里需要创建商品表 ...

weixin_28914371的博客 348

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mybatis(二)之关联查询

mybatis之关联查询一、简单一对一级联查询二、嵌套结果与嵌套查询三、一对多单向查询四、缓存(了解)五、延迟加载(了解)六、鉴别器(自)七、调用存储过程八、分页拦截器九、多形参问题 一、简单一对一级联查询   有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如:最常见到的一对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。前面节中介绍的都是单表映射的一些操作,然而在我们的实际项目中往往是用到多表映射。在 Java 实体对象对中,一对多可以根据 List 和

faramita_of_mine的博客 1685

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Mybatis实现多表查询,级联,缓存

一对一,一对多,多对多,级联查询 一二级缓存

九点六 730

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

使用注解方式实现mybatis一对多

class ClassA { private int id; private List list; // public getters and setters } class ClassB { private int id; // public getters and setters } public interface ClassADA

yf.z的专栏 8165

Mybatis级联查询

文章目录MyBatis一对一关联查询1)创建数据表2)创建持久化类3)创建映射文件4)创建 POJO 类5)创建数据操作接口6)调用接口方法及测试Mybatis一对多关联查询1)创建数据表2)创建持久化类3)创建映射文件4)创建 POJO 类5)创建数据操作接口6)调用接口方法及测试MyBatis多对多关联查询1)创建数据表2)创建持久化类3)创建映射文件4)创建 POJO 类5)添加数据操作接口方法6)调用接口方法及测试 MyBatis一对一关联查询 一对一级联关系在现实生活中是十分常见的,例如一个大学生

今天星期六 576

mybatis ---- 级联查询 一对多 (集合映射)

关联有嵌套查询和嵌套结果两种方式,本文是按照嵌套结果这种方式来说明的 上一章介绍了多对一的关系,用到了,这是一个复杂类型的关联。我们选择一个示例来回顾下,比如:一个博客有一个用户,关联映射就工作于这种结果之上。首先看下,我们在本文中要用到的表结构字段: 博客 blog : id title author_id 作者 author: id username password e

我是小坏 3万+

MyBatis-Plus实现多表联查(一对一,一对多使用)

在使用mybatis-plus开发需求的时候会发现对于大部分的业务场景来说都会使用到join来进行联表查询,但是mybatis-plus封装的 mapper 不支持 join,如果需要支持就需要自己手动去实现,给大家推荐一个好用的插件(Mybatis-Plus-Join(简称 MPJ)是一个 Mybatis-Plus的增强工具,在 MyBatis-Plus 的基础上只做增强不做改变,为简化开发、提高效率而生。

慷慨的博客 2万+

MyBatis的级联查询(一对一、一对多、多对多)

本文介绍了使用MyBatis进行级联查询(一对一、一对多、多对多)时的使用方法和应用要点,以及使用级联查询时需要注意的事项!

weixin_68093610的博客 1790

MyBatis级联查询(一对多)复习巩固练习

为了帮助巩固MyBatis级联查询的知识点,设计了一个完整的练习方案,包含理论复习和实践操作。

DD2187718660的博客 969

Mybatis级联查询(多对一、一对多)Demo及问题

Mybatis级联查询(多对一、一对多)Demo及问题1、问题描述2、工程源码A、首先是数据库部分B、工程代码3、问题解决4、总结 1、问题描述 今天做数据报表的时候,不想使用java代码做各种组合了,直接在MySQL里面搞级联查询,但是遇到了很多问题,在这里记录一下,防止后来的人踩坑。首先搭建一下环境,如果有人想学习,也可以直接拷贝代码运行即可。 2、工程源码 A、首先是数据库部分 sql ...

珍惜 5714

Mybatis多表联查的几种办法

开发过程中,对数据库多表连接查询是常规操作。Mybatis(plus)在多表连接查询上提供了很好的支持。通常,表与表之间存在四种映射关系:一对一映射、多对一映射、一对多映射、多对多映射。在处理的过程中,多对一和一对一映射一般采用同一种操作方式,一对多和多对多映射一般采用同一种操作方式。而且,对于Mybatis的运用,我们通常使用xml的方式。因此,本文主要介绍xml方式下一对一多表联查和一对多多表联查。

weixin_51667449的博客 2万+

mybatis级联查询,子查询多条件,且参数包含父查询没有的字段

mybaits中的级联查询,一对一,一对多等,有两种情况 1.一个参数,一般来说,这个参数是子查询与父查询的共有字段 mapper.xml &lt;resultMap id="ProjectResult" type="com.spms.entity.CompleteProject"&gt; &lt;result column="projid" jdbcType="NUME...

weixin_42179152的博客 8085

MyBatis_04 一对多、级联查询、缓存

文章目录一、一对一关联(级联查询)二、一对多(级联查询)1、实体类2、接口3、映射配置三、关联操作以新增为例1、新增一名学生信息,并关联以存在的老师。接口:映射配置:测试:2、新增一名学生信息,并关联新的老师。接口:映射配置:测试:四、缓存机制1、概念2、一级缓存示例3、一级缓存失效情况4、二级缓存(全局缓存)完整代码 一、一对一关联(级联查询) 思路: 级联查询 自定义association 映射配置: <?xml version="1.0" encoding="UTF-8" ?> &lt

qiaoshaw的博客 503
上一篇: MyBatis--一对一关联查询(级联查询)的三种方式
下一篇: MyBatis--多对多关联查询(级联查询)
吴声子夜歌
博客等级 码龄9年 2688粉丝 2270原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值