JDBC多表联查

JDBC多表联查

在单一表进行查询时,只需要对表中的单个字段进行解析即可;例如下面代码:

@Override
	public List<ClassBean> selectAllDao() {
		List list = new ArrayList();
		try {
			String sql = "select * from class";
			rs = select(sql);
			while(rs.next()) {
				ClassBean cb = new ClassBean();
				cb.setClassId(rs.getInt("classid"));
				cb.setClassName(rs.getString("classname"));
				list.add(cb);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DaoUtil.closeResource(conn, statement, rs);
		}
		return list;
	}

在进行多表联查时会遇到第一个问题就是在实体类中不存在从表的字段,紧接着第二个问题在就是主表与从表的对应关系是一对一还是一对多关系。

以学生和班级表为例:从图中可以看出表对应关系

在这里插入图片描述

两个表的结构如下:

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

创建两个实体类:

student的实体类,加入外部属性,也就是引入class的属性,以为学生和班级是一对一的关系,因此只需要一个班级对象即可:

public class Student {
	
	private int sid;
	private String sname;
	private Date birthday;
	private String ssex;
	private int classId;	
	//外部属性
	private Banji bj;

	//get、set、构造器、toString方法省略
}

Banji表(class是Java关键字,所以用拼音)分析可知,一个班级里有多个学生,因此需要引入一个集合外部属性,用来存储班级中的多个学生:

public class Banji {
	
	private int classId;
	private String className;
	//外部属性
	private List<Student> stu;
    
    //get、set、构造器、toString方法省略
}

在这里将部分的代码进行了封装,形成了两个类:

DaoUtil工具类:

package com.li.dao;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DaoUtil {
	private static DataSource ds = null;
    
	static {
		try {
			FileInputStream stream = new FileInputStream("./src/druid.properties");		
			Properties pro = new Properties();
			pro.load(stream);			
			//创建连接			
			ds = DruidDataSourceFactory.createDataSource(pro);	
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
    //创建连接对象方法
	public static Connection getConn() {
		Connection conn = null;
		try {
			conn = ds.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
    //关闭资源操作
	public static void closeResource(Connection conn,PreparedStatement prestatm, ResultSet rs) {
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(prestatm != null) {
			try {
				prestatm.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

BaseDao工具类:

package com.li.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class BaseDao {
	protected Connection conn;
	protected PreparedStatement prestatm;
	protected ResultSet rs;
	
	protected ResultSet query(String sql, Object ... arge) {
		ResultSet rs = null;
		try {
			conn = DaoUtil.getConn();
			prestatm  = conn.prepareStatement(sql);
			if(arge != null) {
				for(int i = 0; i< arge.length; i++) {
					prestatm.setObject(i+1, arge[i]);
				}
			}
			rs = prestatm.executeQuery();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return rs;
	}
}

学生的实现类(接口省略):

package com.li.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.li.bean.Banji;
import com.li.bean.Student;
import com.li.dao.BaseDao;
import com.li.dao.DaoUtil;
import com.li.dao.IStudentDao;

public class StudentDaoImpl extends BaseDao implements IStudentDao{

	@Override
	public List<Student> findAllStudent() {
		List<Student> list = new ArrayList();
		try {
			String sql = "select * from student left join class on student.classid = class.classid";
			rs = query(sql);
			while (rs.next()) {
				Student stu = new Student();
				Banji bj = new Banji();
				// 学生的数据
				stu.setBirthday(rs.getDate("birthday"));
				stu.setClassId(rs.getInt("classid"));
				stu.setSid(rs.getInt("sid"));
				stu.setSname(rs.getString("sname"));
				stu.setSsex(rs.getString("ssex"));
				
                //给班级属性赋值
				bj.setClassId(rs.getInt("classid"));
				bj.setClassName(rs.getString("classname"));
                //将班级对象赋值给班级中定义的实体类
				stu.setBj(bj);
				
				list.add(stu);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			DaoUtil.closeResource(conn, prestatm, rs);
		}
		return list;
	}

}

班级的集合中存放班级编号等信息,班级编号的集合中又存放学生,就是集合中套集合:

在这里插入图片描述

Banji实现类(接口省略):

package com.li.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.li.bean.Banji;
import com.li.bean.Student;
import com.li.dao.BaseDao;
import com.li.dao.DaoUtil;
import com.li.dao.IBanjiDao;

public class BanjiDaoImpl extends BaseDao implements IBanjiDao{

	@Override
	public List<Banji> findAllBanji() {
		
		List<Banji> blist = new ArrayList(); 
		String sql = "select * from class left join student on class.classid = student.classid";
		rs = query(sql);
		try {
			while(rs.next()) {
				boolean falg = false;
				int index = -1;
				for(int i = 0; i <blist.size(); i++) {
                    //判断班级集合中是否存在某字段的班级编号
					if(rs.getInt("classid") == blist.get(i).getClassId()) {
						falg =true;
						index = i;
						break;
					}
				}
				//已经存在班级集合
				if(falg) {
					Student stu =  new Student();
					stu.setBirthday(rs.getDate("birthday"));
					stu.setClassId(rs.getInt("classid"));
					stu.setSid(rs.getInt("sid"));
					stu.setSname(rs.getString("sname"));
					stu.setSsex(rs.getString("ssex"));
					Banji banji = blist.get(index);
					banji.getStu().add(stu);
				}
				//不存在班级集合
				else {
					//新建班级集合并放入
					List<Student> slist = new ArrayList();
					Banji bj = new Banji();
					bj.setClassId(rs.getInt("classId"));
					bj.setClassName(rs.getString("classname"));
					bj.setStu(slist);
					//新建学生类放入集合中
					Student stu =  new Student();
					stu.setBirthday(rs.getDate("birthday"));
					stu.setClassId(rs.getInt("classid"));
					stu.setSid(rs.getInt("sid"));
					stu.setSname(rs.getString("sname"));
					stu.setSsex(rs.getString("ssex"));
					slist.add(stu);
					blist.add(bj);
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			DaoUtil.closeResource(conn, prestatm, rs);
		}
		return blist;
	}
}

测试类:

public static void main(String[] args) {
		
		IBanjiDao bjd = new BanjiDaoImpl();
		List<Banji> list = bjd.findAllBanji();
		IStudentDao sdi = new StudentDaoImpl();
		List<Student> list = sdi.findAllStudent();
		list.forEach(System.out::println);
		
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/309288.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

buuctf[极客大挑战 2019]BabySQL--联合注入、双写过滤

目录 1、测试万能密码&#xff1a; 2、判断字段个数 3、尝试联合注入 4、尝试双写过滤 5、继续尝试列数 6、查询数据库和版本信息 7、查询表名 8、没有找到和ctf相关的内容&#xff0c;查找其他的数据库 9、查看ctf数据库中的表 10、查询Flag表中的字段名 11、查询表…

移远通信推出两款Wi-Fi 7模组新品,赋能无线连接巅峰体验

​1月9日&#xff0c;在2024年国际消费电子产品展览会 (CES) 期间&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出支持Wi-Fi 7技术的通信模组FGE576Q和FGE573Q &#xff0c;这两款模组将以前沿的Wi-Fi性能突破无线连接边界&#xff0c;为下一…

RabbitMQ(六)消息的持久化

目录 一、简介1.1 定义1.2 消息丢失的场景 二、交换机的持久化方式一&#xff1a;直接 new方式二&#xff1a;channel.exchangeDeclare()方式三&#xff1a;ExchangeBuilder【推荐】 三、队列的持久化方式一&#xff1a;直接 new方式二&#xff1a;channel.queueDeclare()方式三…

牛客网-JAVA(错题集)-1

1 Java的抽象类和接口不可以进行实例化 2 知识点&#xff1a; 1、不论如何 finally里面的代码是一定会执行的 2、finally里面的代码块比return早执行 3、多个return是按顺序执行的&#xff0c;只执行一次 public abstract class Test {public static void main(String[] ar…

深度解析-Java语言的未来

深度解析-Java语言的未来&#xff0c;文末有我耗时一个月&#xff0c;问遍了身边的大佬&#xff0c;零基础自学Java的路线&#xff0c;适用程序员入门&进阶&#xff0c;Java学习路线&#xff0c;2024新版最新版。 文章目录 Q1 - 能否自我介绍下&#xff1f; Q2 - Java语…

diffusers scheduler add_noise前向加噪可视化

参考: http://www.bryh.cn/a/604194.html 1、diffusers Pipeline使用 import torch from diffusers import PixArtAlphaPipelinepipe = PixArtAlphaPipeline.from_pretrained("PixArt-alpha/PixArt-XL-2-1024-MS", torch_dtype=torch.float16) pipe = pipe.to(cud…

嵌入式-Stm32-江科大基于寄存器点亮LED灯

文章目录 前言&#xff1a;一&#xff1a;搭建基于寄存器控制LED的工程二&#xff1a;用江科大的STM32板子实现基于寄存器点亮LED灯三&#xff1a;用非江科大stm32板子实现基于寄存器点亮LED灯道友&#xff1a;一星陨落&#xff0c;黯淡不了星空灿烂&#xff1b;一花凋零&#…

认识Linux指令之 “find grep” 命令

01.find指令&#xff1a; -name Linux下find命令在目录结构中搜索文件&#xff0c;并执行指定的操作。 Linux下find命令提供了相当多的查找条件&#xff0c;功能很强大。由于find具有强大的功能&#xff0c;所以它的选项也很多&#xff0c;其中大部分选项都值得我们花时间来…

Set和Map

一、Set的介绍 1.1、Set相关文档介绍 cplusplus.com/reference/set/set/?kwset 1. set是按照一定次序存储元素的容器 2. 在set中&#xff0c;元素的value也标识它(value就是key&#xff0c;类型为T)&#xff0c;并且每个value必须是唯一的。 set中的元素不能在容器中修改…

iOS14 Widget 小组件调研

桌面小组件是iOS14推出的一种新的桌面内容展现形式。 根据苹果的统计数据&#xff0c;“一般用户每天进入主屏幕的次数超过90次”&#xff0c;如果有一个我们应用的小组件在桌面&#xff0c;每天都有超过90次曝光在用户眼前的机会&#xff0c;这绝对是一个顶级的流量入口。 “…

世邦通信 SPON IP网络对讲广播系统uploadjson.php任意文件上传漏洞

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统uploadjson.php存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊请求包上传恶意后门…

【NLP】多标签分类【上】

简介 《【NLP】多标签分类》主要介绍利用三种机器学习方法和一种序列生成方法来解决多标签分类问题&#xff08;包含实验与对应代码&#xff09;。共分为上下两篇&#xff0c;上篇聚焦三种机器学习方法&#xff0c;分别是&#xff1a;Binary Relevance (BR)、Classifier Chain…

python 爬虫 request get或post传参

爬虫传参 import requestsurl http://www.xxx# get 或 post 传参数据 data {"pageNo": 1652,"pageSize": 10, }headers {Cookie: ,Host: ,Origin: ,Referer: ,User-Agent: , }# get 请求 # res requests.get( # url, # paramsdata, # hea…

PINN物理信息网络 | 泊松方程的物理信息神经网络PINN解法

基本介绍 泊松方程是一种常见的偏微分方程&#xff0c;它在物理学和工程学中具有广泛的应用。它描述了在某个区域内的标量场的分布与该场在该区域边界上的值之间的关系。 物理信息神经网络&#xff08;PINN&#xff09;是一种结合了物理定律和神经网络的方法&#xff0c;用于…

机器学习---流形学习

1. 流形学习 作为机器学习研究的热点问题之一&#xff0c;流形学习是要从高维数据集中发现内在的低维流形&#xff0c;并基于低 维流形来实现随后的各种机器学习任务&#xff0c;如模式识别&#xff0c;聚类分析。与欧氏空间不同&#xff0c;流形学习主要 处理的是非欧空间里…

spark基础--学习笔记

1 spark 介绍 1.1 spark概念 Apache Spark是专为大规模数据处理而设计的快速通用的分布式计算引擎&#xff0c;是开源的类Hadoop MapReduce的通用分布式计算框架。和MapReduce一样&#xff0c;都是完成大规模数据的计算处理。 简而言之&#xff0c;Spark 借鉴了 MapReduce思…

Mysql是怎么运行的(上)

文章目录 Mysql是怎么运行的Mysql处理一条语句的流程连接管理解析与优化存储引擎 基本配置配置文件系统变量状态变量字符集四种重要的字符集MySQL中的utf8和utf8mb4各级别的字符集和比较规则MySQL中字符集的转换排序规则产生的不同的排序结果 InnoDB存储引擎介绍COMPACT行格式介…

06.构建大型语言模型步骤

在本章中,我们为理解LLMs奠定了基础。在本书的其余部分,我们将从头开始编写一个代码。我们将以 GPT 背后的基本思想为蓝图,分三个阶段解决这个问题,如图 1.9 所示。 图 1.9 本书中介绍的构建LLMs阶段包括实现LLM架构和数据准备过程、预训练以创建基础模型,以及微调基础模…

HarmonyOS应用开发学习笔记 UI布局学习 List(){}创建列表 列表形式显示 简单使用

List 创建列表 列表形式显示 官方文档&#xff1a;创建列表&#xff08;List&#xff09; 关键代码 List(){} 列表控件ListItem() {} 子元素 例如 1、简单使用代码 List(){} List() {ListItem() {Row() {Image($r(app.media.iconE)).width(40).height(40).margin(10)Tex…

继承详细说明

概述 Java中提供一个关键字extends&#xff0c;用这个关键字&#xff0c;我们可以让一个类和另一个类建立起父子关系。 例如&#xff1a;public class Student extends People {} Student称为子类&#xff08;派生类&#xff09;&#xff0c;People称为父类(基类 或超类)。 …