一.操作一对多情况
开发步骤
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. 在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。 请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯();当N=9时呢?

    在你面前有一个n阶的楼梯,你一步只能上1阶或2阶.请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯:当N=9时呢? 思路解析 ①台阶只有一级阶梯时,只有一种走法. ②当台阶有两级时,可以先走 ...

  2. NOIP 模拟八 考试总结

    T1星际旅行 给出n个点,m条边,求满足一条路径使得m-2条边经过2次,2条边经过1次的方案数.并且题目中给出有自环. 看到题面我以为是个计数DP,可能是计数题做多了吧哈哈.其实仔细朝图的方向想一想就 ...

  3. 在开源项目或项目中使用git建立fork仓库

    前言: vector我们经常使用,对vector里面的基本函数构造函数.增加函数.删除函数.遍历函数我们也会用到.其中在使用遍历之后erase删除元素过程中,会出现一种删除最后一个元素破坏了迭代器的情 ...

  4. 每个男孩的机械梦「GitHub 热点速览 v.21.41」

    作者:HelloGitHub-小鱼干 机械臂可能在医疗剧中看过,可以用来执行一些精细化的操作,例如:缝合之类的.但这次 Dummy-Robot 让你不仅看看而已,还具备一定的实操性(有一定的动手.经济 ...

  5. Pandas高级教程之:时间处理

    目录 简介 时间分类 Timestamp DatetimeIndex date_range 和 bdate_range origin 格式化 Period DateOffset 作为index 切片和 ...

  6. Unity——资源文件夹介绍

    Unity资源文件夹介绍 1.编辑时 在Asset文件下存在Resources和SteamingAsset文件夹: Resources 只读不可修改,打包时直接写死,没有办法通过热更新替换资源: 可以 ...

  7. HTTP基础系列之:一文搞懂URL

    一般我们日常在上网的时候,会在浏览器的地址栏里输入一个网站的 "网址",点击下回车,就会跳到你想去的网站,就类似这样 但其实,叫做 "网址" 并不是特别的准确, ...

  8. Java基础之(二):Notepad++实现HelloWorld

    现在我们开始编写我们的第一个程序:Hello World! HelloWorld 新建一个java文件 文件后缀名为.java Hello.java 代码分析: 接下来写完最大的框之后,那接下来当然就 ...

  9. NOI 2017 Day1 题解

    被虐爆了... T1 整数 题目传送门 Description 有一个整数 \(x\),有 \(n\) 此操作,每次操作为以下两种情况: 给出 \(a,b\),将 \(x\) 加上 \(a\times ...

  10. print spooler LPF 打印机漏洞

    打印机漏洞 该漏洞可以通过创建打印机驱动和端口,实现任意文件写入,用于提权或者写入后门. 打印机调用流程:client通过RPC调用server的spoolsv.exe,spoolsv.exe是sys ...