一.操作一对多情况
开发步骤
1创建对象
 //代码部门的对象
public class Department {
 private String id;
 private String name;
 private Set<Employee> employees = new HashSet(); //用来保存部门中员工的集合
//代表员工的对象

}
public class Employee {
 private String id;
 private String name;
 private double salary;
 private Department department;  //所属部门属性

}
2.根据对象创建表,不用考虑过多,有什么对象先创建出该对象的表
//创建部门表单
create table department
(
 id varchar(40) primary key,//设置主键
 name varchar(40)
);
//创建员工表单
create table employee
(
 id varchar(40) primary key,
 name varchar(40),
 salary decimal(10,2),
 department_id varchar(40),
 constraint department_id_FK foreign key(department_id) references department(id) //设置外键
);
alter table employee drop foreign key department_id_FK; //移除外键
alter table employee add constraint department_id_FK foreign key(department_id) references department(id) on delete set null; //重新设置外键,并设置外键约束,当主键删除时,外键制空
alter table employee drop foreign key department_id_FK;
alter table employee add constraint department_id_FK foreign key(department_id) references department(id) on delete cascade;//重新设置外键,并设置外键约束,当主键删除时,外键删除
 */
3.编写Dao,操作数据库
public class DepartmentDao {
//对多表操作的添加方法
 public void add(Department d) throws SQLException{
  QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
  //1.取出department对象的数据,存在department表
  String sql = "insert into department(id,name) values(?,?)";
  Object params[] = {d.getId(),d.getName()};
  runner.update(sql, params);
  //2.得到department对象中所有员工,把每一个员工的数据存到员工表
  Set<Employee> set = d.getEmployees();
  for(Employee e : set){  //遍历集合将员工数据存到员工表
   sql = "insert into employee(id,name,salary,department_id) values(?,?,?,?)";
   params = new Object[]{e.getId(),e.getName(),e.getSalary(),d.getId()};
   runner.update(sql, params);
  }
  //3.更新数据库employee表中外键列,在数据库中描述员工和部门的关系,本来应该是3步,但是这样写其实麻烦了,可以直接在保存员工信息的时候直接存到表中
 }
 //一对多的查询,在查询多方的数据,如果数据量一大,就千万要小心
 public Department find(String id) throws SQLException{
  QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
  //1.查找department表,找出department对象的数据
  String sql = "select * from department where id=?";
  Department d = (Department) runner.query(sql, id, new BeanHandler(Department.class));
  //2.查找employee ,找到部门所有员工的数据,只要不是必须显示一般不要获取,如果员工数据过大,那么很有可能导致内存溢出,在获取前一定要考虑好
    //d.getEmployees().add(list);   //set(list)
  return d;
 }
//操作多表的删除方法
 public void delete(String id) throws SQLException{
  QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
  //删除部门
  String sql = "delete from department where id=?";
  runner.update(sql, id);
 }
}
4.测试Dao
//把一对多的对象存到数据库
public class Demo3 {
 @Test 添加
 public void addDepartment() throws SQLException{
  Department d = new Department();
  d.setId("1");
  d.setName("开发部");

Employee e1 = new Employee();
  e1.setId("1");
  e1.setName("aa");
  e1.setSalary(1000);
 
  Employee e2 = new Employee();
  e2.setId("2");
  e2.setName("bb");
  e2.setSalary(1000);
 
  d.getEmployees().add(e1);
  d.getEmployees().add(e2);
  //d
  DepartmentDao dao = new DepartmentDao();
  dao.add(d);
 }
 @Test 查找
 public void findDepartment() throws SQLException{
  DepartmentDao dao = new DepartmentDao();
  Department d = dao.find("1");
  System.out.println(d);
 }
 @Test 删除
 public void delete() throws SQLException{
  DepartmentDao dao = new DepartmentDao();
  dao.delete("1");
 }
}

二.操作多对多情况

开发步骤

1创建Bean对象类

 

//老师类

public class Teacher {
 private String id;
 private String name;
 private double salary;
 private Set<Student> students = new HashSet();  //保存学生的集合
//学生类
public class Student {
 private String id;
 private String name;
 private Set<Teacher> students = new HashSet();  //保存教师的集合
2.创建对应类的表,不要考虑那么多,首先根据对象创建表,然后由于多对多情况,在创建中间表,用来记住两个表的关系
//教师表
 create table teacher
 (
  id varchar(40) primary key,
  name varchar(40),
  salary decimal(10,2)
 );
 //学生表
 create table student
 (
  id varchar(40) primary key,
  name varchar(40)
 );
//中间表
 create table teacher_student
 (
  teacher_id varchar(40),
  student_id varchar(40),
  primary key(teacher_id,student_id),
  constraint teacher_id_FK foreign key(teacher_id) references teacher(id), //设置外键关系
  constraint student_id_FK foreign key(student_id) references student(id)
 );
 
 alter table teacher_student drop foreign key teacher_id_FK;  //删除外键约束
 alter table teacher_student add constraint teacher_id_FK foreign key(teacher_id) references teacher(id) on delete cascade; //设置外键约束,如果主键删除,删除外键
注意这里on delete null是不可以的,因为中间表中老师和学生id是一个联合主键,必须有值,不能制空
 3.开发Dao操作数据库
public class TeacherDao {
//添加方法
 public void add(Teacher t) throws SQLException{
  QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
  //1.取出teacher的数据存在teacher表
  String sql = "insert into teacher(id,name,salary) values(?,?,?)";
  Object params[] = {t.getId(),t.getName(),t.getSalary()};
  runner.update(sql, params);
  //2.把老师所有学生的数据存在学生表
  Set<Student> set = t.getStudents();
  for(Student s : set){
   sql = "insert into student(id,name) values(?,?)";
   params = new Object[]{s.getId(),s.getName()};
   runner.update(sql,params);
   //3.更新中间表,描述老师和学生的关系
   sql = "insert into teacher_student(teacher_id,student_id) values(?,?)";
   params = new Object[]{t.getId(),s.getId()};
   runner.update(sql, params);
  }
 }
//查询方法
 public Teacher find(String id) throws SQLException{
  QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
  //1.找老师表,找出老师的基本信息
  String sql = "select * from teacher where id=?";
  Teacher t= (Teacher) runner.query(sql, id, new BeanHandler(Teacher.class));
  //2.找中间表,找出老师所有的学生(id)
  sql = "select s.* from teacher_student ts,student s where ts.teacher_id=? and s.id=ts.student_id";
  List list = (List) runner.query(sql, id, new BeanListHandler(Student.class));
  t.getStudents().addAll(list);
  return t;
 }
4.测试Dao
//多对多对象的操作
public class Demo4 {
 @Test
 public void addTeacher() throws SQLException{
  Teacher t = new Teacher();
  t.setId("1");
  t.setName("老张");
  t.setSalary(10000);
 
  Student s1 = new Student();
  s1.setId("1");
  s1.setName("aaa");
 
  Student s2 = new Student();
  s2.setId("2");
  s2.setName("bbb");
 
  t.getStudents().add(s1);
  t.getStudents().add(s2);
 
  TeacherDao dao = new TeacherDao();
  dao.add(t);
 }
 
 @Test
 public void findTeacher() throws SQLException{
  TeacherDao dao = new TeacherDao();
  Teacher t = dao.find("1");
  System.out.println(t);
 }
 
}
三.一对一操作情况(其实就是1对多的特殊情况)
开发步骤
1.创建Bean对象
//身份证对象
public class Idcard {
 private String id;
 private String address;
 private Person person;
//人对象
public class Person {
 private String id;
 private String name;
 private Idcard idcard;
2.创建表
//person表
create table person
  (
   id varchar(40) primary key,
   name varchar(40)
  ) ;
//身份证表
  create table idcard
  (
   id varchar(40) primary key,
   address varchar(40),
   constraint id_FK foreign key(id) references person(id) //将主键同时设置成外键,这样实现了,不能为空,不能重复,和关系,从而形成一对一关系
  );
Tip:注意事项
不管java的对象存在何种关系,反映到关系型数据库中,都是使用外键表示纪录(即对象)的关联关系。
设计java对象如涉及到多个对象相互引用,要尽量避免使用一对多,或多对多关系,而应使用多对一描述对象之间的关系(或使用延迟加载的方式)。

JDBC操作多张表一的更多相关文章

  1. (10)MySQL触发器(同时操作两张表)

    什么是触发器 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整性. 举个例子,比如你现在有两个表[用户表]和[日志 ...

  2. update操作多张表

    sql 语句多张表UPDATE用法一.当用一个表中的数据来更新另一个表中的数据,T-SQL提供多种写法(下面列出了二种),但建议用第一种写法,虽然传统,但结构清晰.飞.飞Asp技术乐园并且要注意,当用 ...

  3. ThinkPHP 处理商品添加的时候操作多张表 用事务解决。

    #重新父类的add方法 public function add(){ #同时操作多装表,可以考虑用事务来做,要同时插入数据成功要么都不插输入数据. #开启事务的前提是表的引擎必须是InnoDB #开启 ...

  4. 用JDBC操作MySQL——获取表的大小

    JDBC中获取MySQL我们有时需要获得表的大小,这包括了表的行数和列数,我们可以分别用以下的方法得到: 假设我们得到了一个ResultSet对象rs,则操作如下: 读取结果集前获取行数: rs.la ...

  5. oracle创建第三方数据接口表,指定特定用户访问某张表

    /*****创建用户并指定操作哪张表开始******/ --1.创建用户并设置默认表空间 CREATE USER CHENGDWY IDENTIFIED BY CHENGDWY DEFAULT TAB ...

  6. asp.net 建多个项目实现三层的实例——读取一张表中的记录条数

    学习asp.net两周,通过学习发现,.net和php之间的区别还是蛮大的,比php要复杂一些,开始学习的有些吃力,后来跟着传智播客里的老师学习,渐渐的学到了一些东西. 今天要记录一下.net里的简单 ...

  7. 第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表、验证码表、轮播图表

    第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表.验证码表.轮播图表 创建Django项目 项目 settings.py ...

  8. 利用pymysql同时修改两张表的数据

    使用pymysql操作数据库中相关联的两张表需求:两张表中分别有一个字段是json格式,需要往json中再插入一个属性值’container_cloud’=’fasle’. import pymysq ...

  9. 基于CDH5.x 下面使用eclipse 操作hive 。使用java通过jdbc连接HIVESERVICE 创建表

    基于CDH5.x 下面使用eclipse 操作hive .使用java通过jdbc连接HIVESERVICE 创建表 import java.sql.Connection; import java.s ...

随机推荐

  1. 微信小程序访问豆瓣api报403错误解决方法

    通过豆瓣API可以获取很多电影.书籍的数据信息,今天在调用豆瓣正在上映电影接口的时候报403错误,原因是豆瓣设置了小程序的访问权限.如下: 解决方法是使用代理,将豆瓣API地址换成 https://d ...

  2. 关于VS中的无法解析的外部符号问题

    利用caffe的源码编译出的caffe.lib静态链接库里面就包含了源码里面的那些函数的接口i,所以如果在程序中使用的是源码的话,就不需要在链接器里面再添加此静态链接库了 对于无法解析的外部符号,首先 ...

  3. 世纪联华的 Serverless 之路

    作者 | 朱鹏(旻苍) 来源 | Serverless 公众号 一.世纪联华超市简介 1. 公司简介 杭州联华华商集团有限公司成立于 2002 年 7 月,主要业务涵盖购物中心.大卖场.超市.便利店等 ...

  4. 题解 Hero meet devil

    题目传送门 题目大意 给出一个长度为 \(n\) 的字符串,对于每个 \(k\in [0,n]\),求出有多少个长度为 \(m\) 的字符串满足两者最长公共子序列长度为 \(k\). \(n\le 1 ...

  5. Kubernetes client-go 源码分析 - Reflector

    概述入口 - Reflector.Run()核心 - Reflector.ListAndWatch()Reflector.watchHandler()NewReflector()小结 概述 源码版本: ...

  6. Linux信号处理编程

    01. 学习目标 了解信号中的基本概念 熟练使用信号相关的函数 了解内核中的阻塞信号集和未决信号集作用 熟悉信号集操作相关函数 熟练使用信号捕捉函数signal 熟练使用信号捕捉函数sigaction ...

  7. 【UE4】GAMES101 图形学作业5:光线与物体相交(球、三角面)

    总览 在这部分的课程中,我们将专注于使用光线追踪来渲染图像.在光线追踪中最重要的操作之一就是找到光线与物体的交点.一旦找到光线与物体的交点,就可以执行着色并返回像素颜色. 在这次作业中,我们要实现两个 ...

  8. vue3.x异步组件

    在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块 vue2.x 曾经简单的异步组件 components: { AsyncComponent: () =& ...

  9. 【二食堂】Beta - Scrum Meeting 12

    Scrum Meeting 12 例会时间:5.27 20:00~20:10 进度情况 组员 当前进度 今日任务 李健 1. 知识图谱导出功能完成 issue 1. 继续完成文本保存的工作 issue ...

  10. Spring Security Jwt Token 自动刷新

    token的自动刷新 一.功能需求 二.功能分析 1.token 的生成 2.token 的自动延长 3.系统资源的保护 4.用户如何传递 token 三.实现思路 1.生成 token 和 refr ...