美文网首页
使用JDBC操作多个表

使用JDBC操作多个表

作者: 小小蒜头 | 来源:发表于2017-10-10 20:49 被阅读128次

什么情况下才会产生多表操作呢?内存里面产生了一个对象,这个对象是一个复杂对象,有关联的对象。

一对多的关系

一对多关系

假设做一个部门管理系统,一个部门下有多个员工。

1. 建表:

      create table department
      (
        id varchar(40) primary key,
        name varchar(40)
      );
      
      在多的那一方加外键约束
      create table employee
      (
        id varchar(40) primary key,
        name varchar(40),
        salary double,
        department_id varchar(40),
        constraint department_id_FK foreign key(department_id) references department(id)
      );

2. 实体类DepartmentEmployee写好。

**3. 具体的实现DepartmentDao **

package cn.itcast.dao;

import cn.itcast.domain.Department;
import cn.itcast.domain.Employee;
import cn.itcast.utils.JdbcUtils_dbcp;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.SQLException;
import java.util.List;
import java.util.Set;

/**
 * Created by yvettee on 2017/10/10.
 */
public class DepartmentDao {
    public void add(Department d) {
        try {
            QueryRunner runner = new QueryRunner(JdbcUtils_dbcp.getDataSource());
            //1.把department对象的数据插入到department表
            String sql = "insert into department(id,name) values(?,?)";
            Object params[] = {d.getId(), d.getName()};
            runner.update(sql, params);

            //2.把department对象中维护的所有员工插入到员工表
            //3.更新员工表的外键列,说明员工的部门
            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);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Department find(String id) throws SQLException {

        QueryRunner runner = new QueryRunner(JdbcUtils_dbcp.getDataSource());

        //1.找部门表,查出部门的基本信息
        String sql = "select * from department where id=?";
        Department d = (Department) runner.query(sql, id, new BeanHandler(Department.class));

        //2.找员工表,找出部门下面所有员工
        sql = "select * from employee where department_id=?";
        List list = (List) runner.query(sql, id, new BeanListHandler(Employee.class));

        d.getEmployees().addAll(list);
        return d;
    }

    //删除时有外键,采用级联删除,删除时,将外键列置为空,修改表
    public void delete(String id) throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils_dbcp.getDataSource());
        String sql= "delete from department where id=?";
        runner.update(sql, 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;

多对多的关系

教学管理系统:多个教师与多个学生

1. 创建表:

create table teacher
    (
        id varchar(40) primary key,
        name varchar(40),
        salary double
    );
    
    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; 
     
     
     alter table teacher_student drop foreign key student_id_FK;
     alter table teacher_student add constraint student_id_FK foreign key(student_id) references student(id) on delete cascade;

2. 具体实现

package cn.itcast.dao;

import cn.itcast.domain.Student;
import cn.itcast.domain.Teacher;
import cn.itcast.utils.JdbcUtils_dbcp;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.SQLException;
import java.util.List;
import java.util.Set;

/**
* Created by yvettee on 2017/10/10.
*/
public class TeacherDao {


   public void add(Teacher t) throws SQLException {
       QueryRunner runner = new QueryRunner(JdbcUtils_dbcp.getDataSource());
       //1.取出老师存老师表
       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_dbcp.getDataSource());
       //1.找老师表,找出老师的基本信息
       String sql = "select * from teacher where id=?";
       Teacher t = runner.query(sql, id, new BeanHandler<Teacher>(Teacher.class));

       //2.找出老师所有学生
       sql = "select * from teacher_student ts,student s where ts.teacher_id=? and ts.teacher_id=s.id";
       List<Student> list = runner.query(sql, id, new BeanListHandler<Student>(Student.class));

       t.getStudents().addAll(list);
       return t;
   }
}

3. 功能测试

 @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.getId());
        System.out.println(t.getStudents());
    }

源代码:https://github.com/yvettee36/MoreForm

相关文章

  • 使用JDBC操作多个表

    什么情况下才会产生多表操作呢?内存里面产生了一个对象,这个对象是一个复杂对象,有关联的对象。 一对多的关系 假设做...

  • MyBatis多表连接查询

    使用MyBatis进行单表查询十分简单,多表连接查询相比单表查询操作稍微复杂,不过相较于使用JDBC方式简单得多:...

  • Mybatis源码分析(01)-JDBC操作回顾,Mybatis

    一 JDBC的规范操作及问题回顾 假设数据库test中有一张表account 直接使用JDBC,dao层的实现类可...

  • JDBC连接数据库

    什么是JDBC? 解释:JDBC全称 Java DataBase Connectivity,是使用java语言操作...

  • SpringBoot使用Sharding-JDBC分库分表

    本文介绍SpringBoot使用当当Sharding-JDBC进行分库分表。 1.有关Sharding-JDBC ...

  • 数据库访问优化

    1.数据源的比较 分别使用jdbc连接和数据库连接池进行50次查询sequence操作,再进行50次单表插入操作。...

  • 10《Spring Boot 入门教程》使用 JdbcTempl

    1. 前言 如果我们的项目非常简单,仅仅是对数据库几张表进行简单的增删改查操作,那么实际上直接使用 JDBC 操作...

  • JAVAEE——JDBC连接池&DBUtils

    JDBC连接池&DBUtils 使用连接池改造JDBC的工具类: 1.1.1 需求: 传统JDBC的操作,对连接的...

  • 分库分表之第二篇

    @TOC 2. Sharding-JDBC快速入门 2.1需求说明 使用Sharding-JDBC完成对订单表的水...

  • JAVA_JDBC

    JDBC概念: 使用JAVA代码操作数据库 ----------------------------- DEMO:...

网友评论

      本文标题:使用JDBC操作多个表

      本文链接:https://www.haomeiwen.com/subject/hwkvyxtx.html