• JDBC多表操作


    一、一对多关系:部门管理系统

    1、数据库

     1       
     2       create table department
     3       (
     4           id varchar(40) primary key,
     5           name varchar(40)
     6       );
     7       
     8       
     9       create table employee
    10       (
    11           id varchar(40) primary key,
    12           name varchar(40),
    13           salary double,
    14           department_id varchar(40),
    15           constraint department_id_FK foreign key(department_id) references department(id) on delete set null;
    16       );
    constraint department_id_FK foreign key(department_id) references department(id) on delete set null; 设置级联 
    当主表的记录删除后,从表的外键置为空

     

     2、对象

    Department.java:部门

     1 package com.domain;
     2 
     3 import java.util.HashSet;
     4 import java.util.Set;
     5 
     6 public class Department {
     7 
     8     private String id;
     9     private String name;
    10     
    11     //设置一个Set集合保存所有员工
    12     private Set employees = new HashSet();
    13     
    14     public String getId() {
    15         return id;
    16     }
    17     public void setId(String id) {
    18         this.id = id;
    19     }
    20     public String getName() {
    21         return name;
    22     }
    23     public void setName(String name) {
    24         this.name = name;
    25     }
    26     public Set getEmployees() {
    27         return employees;
    28     }
    29     public void setEmployees(Set employees) {
    30         this.employees = employees;
    31     }
    32 }

     

     在多对一的情况下,要注意“一”的一方是否需要维护多的一方数据的集合

     

    Employee.java:员工

     1 package com.domain;
     2 
     3 public class Employee {
     4     private String id;
     5     private String name;
     6     private double salary;
     7     private Department department;
     8     
     9     public String getId() {
    10         return id;
    11     }
    12     public void setId(String id) {
    13         this.id = id;
    14     }
    15     public String getName() {
    16         return name;
    17     }
    18     public void setName(String name) {
    19         this.name = name;
    20     }
    21     public double getSalary() {
    22         return salary;
    23     }
    24     public void setSalary(double salary) {
    25         this.salary = salary;
    26     }
    27     public Department getDepartment() {
    28         return department;
    29     }
    30     public void setDepartment(Department department) {
    31         this.department = department;
    32     }
    33 }

     

     

    3、dao层

    DepartmentDao.java

     1 package com.dao;
     2 import java.sql.SQLException;
     3 import java.util.List;
     4 import java.util.Set;
     5 
     6 import org.apache.commons.dbutils.QueryRunner;
     7 import org.apache.commons.dbutils.handlers.BeanHandler;
     8 import org.apache.commons.dbutils.handlers.BeanListHandler;
     9 
    10 import com.domain.Department;
    11 import com.domain.Employee;
    12 import com.utils.JdbcUtils;
    13 
    14 
    15 public class DepartmentDao {
    16     //插入操作
    17     public void insert(Department d) throws SQLException{
    18         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
    19         
    20         //1、把Department对象的数据插入到department表
    21         String sql = "insert into department(id,name) values(?,?)";
    22         Object params[] = {d.getId(),d.getName()};
    23         runner.update(sql, params);
    24         
    25         //2、把department维护的所有员工保存在employee表
    26         Set<Employee> set = d.getEmployees();
    27         for(Employee e : set){
    28             sql = "insert into employee(id,name,salary,department_id) values(?,?,?,?)";
    29             
    30             //3、更新员工的外键列,说明员工所在的部门
    31             params = new Object[]{e.getId(),e.getName(),e.getSalary(),d.getId()};
    32             runner.update(sql, params);
    33         }
    34     }
    35     
    36     //查找
    37     public Department find(String id) throws SQLException{
    38         
    39         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
    40         
    41         //1.找部门表,查出部门的基本信息
    42         String sql = "select * from department where id=?";
    43         Department d = (Department) runner.query(sql, id, new BeanHandler(Department.class));
    44         
    45         //2.找员工表,找出部门下面所有员工
    46         sql = "select * from employee where department_id=?";
    47         List list = (List) runner.query(sql, id, new BeanListHandler(Employee.class));
    48         
    49         
    50         d.getEmployees().addAll(list);
    51         
    52         return d;
    53     }
    54     
    55     //删除
    56     public void delete(String id) throws SQLException{
    57         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
    58         String sql = "delete from department where id=?";
    59         runner.update(sql, id);
    60     }
    61 }

     

     

    4、service层

     1 package com.service;
     2 
     3 import java.sql.SQLException;
     4 
     5 import org.junit.Test;
     6 
     7 import com.dao.DepartmentDao;
     8 import com.domain.Department;
     9 import com.domain.Employee;
    10 
    11 public class Bservice {
    12     @Test
    13     public void add() throws SQLException{
    14         Department d = new Department();
    15         d.setId("111");
    16         d.setName("开发部");
    17         
    18         Employee e1 = new Employee();
    19         e1.setId("1");
    20         e1.setName("aa");
    21         e1.setSalary(10000);
    22         
    23         
    24         Employee e2 = new Employee();
    25         e2.setId("2");
    26         e2.setName("bb");
    27         e2.setSalary(10000);
    28         
    29         d.getEmployees().add(e1);
    30         d.getEmployees().add(e2);
    31         
    32         DepartmentDao dao = new DepartmentDao();
    33         dao.insert(d);
    34     }
    35     
    36     @Test
    37     //查找
    38     public void find() throws SQLException{
    39         
    40         DepartmentDao dao = new DepartmentDao();
    41         Department d = dao.find("111");
    42         System.out.println(d.getName());
    43     
    44     }
    45     
    46     
    47     @Test
    48     //删除
    49     public void delete() throws SQLException{
    50         
    51         DepartmentDao dao = new DepartmentDao();
    52         dao.delete("111");
    53     }
    54 }

     

     

    5、工具类

    JdbcUtils.java

     1 package com.utils;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.sql.Connection;
     6 import java.sql.SQLException;
     7 import java.util.Properties;
     8 
     9 import javax.sql.DataSource;
    10 
    11 import org.apache.commons.dbcp.BasicDataSourceFactory;
    12 
    13 public class JdbcUtils {
    14     private static DataSource ds;
    15     static{
    16         try {
    17             Properties prop = new Properties();
    18             InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
    19             prop.load(in);
    20             
    21             //创建数据源
    22             BasicDataSourceFactory factory = new BasicDataSourceFactory();
    23             ds = factory.createDataSource(prop);
    24         } catch (Exception e) {
    25             throw new ExceptionInInitializerError(e);
    26         }
    27     }
    28     
    29     //提供数据源
    30     public static DataSource getDataSource(){
    31         return ds;
    32     }
    33     
    34     //获取连接
    35     public static Connection  getConnection() throws SQLException{
    36         return ds.getConnection();
    37     }
    38 }

     

     

    二、多对多关系:老师-----学生

    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)
    );

    2、实体类

    Teacher.java

     3 import java.util.HashSet;
     4 import java.util.Set;
     5 
     6 public class Teacher {
     7     private String id;
     8     private String name;
     9     private double salary;
    10     private Set students = new HashSet();
    11     public String getId() {
    12         return id;
    13     }
    14     public void setId(String id) {
    15         this.id = id;
    16     }
    17     public String getName() {
    18         return name;
    19     }
    20     public void setName(String name) {
    21         this.name = name;
    22     }
    23     public double getSalary() {
    24         return salary;
    25     }
    26     public void setSalary(double salary) {
    27         this.salary = salary;
    28     }
    29     public Set getStudents() {
    30         return students;
    31     }
    32     public void setStudents(Set students) {
    33         this.students = students;
    34     }
    35     
    36     
    37     
    38 }

    Student.java

     3 import java.util.HashSet;
     4 import java.util.Set;
     5 
     6 public class Student {
     7     private String id;
     8     private String name;
     9     private Set teachers = new HashSet();
    10     public String getId() {
    11         return id;
    12     }
    13     public void setId(String id) {
    14         this.id = id;
    15     }
    16     public String getName() {
    17         return name;
    18     }
    19     public void setName(String name) {
    20         this.name = name;
    21     }
    22     public Set getTeachers() {
    23         return teachers;
    24     }
    25     public void setTeachers(Set teachers) {
    26         this.teachers = teachers;
    27     }
    28     
    29     
    30 }

     

    3、dao层

    TeacherDao.java

     1 import java.sql.SQLException;
     2 import java.util.List;
     3 import java.util.Set;
     4 
     5 import org.apache.commons.dbutils.QueryRunner;
     6 import org.apache.commons.dbutils.handlers.BeanHandler;
     7 import org.apache.commons.dbutils.handlers.BeanListHandler;
     8 
     9 import cn.itcast.domain.Student;
    10 import cn.itcast.domain.Teacher;
    11 import cn.itcast.utils.JdbcUtils;
    12 
    13 public class TeacherDao {
    14     
    15     public void add(Teacher t) throws SQLException {
    16         
    17         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
    18         
    19         //1`.取出老师存老师表
    20         String sql = "insert into teacher(id,name,salary) values(?,?,?)";
    21         Object params[] = {t.getId(),t.getName(),t.getSalary()};
    22         runner.update(sql, params);
    23         
    24         
    25         //2.取出老师所有学生的数据,存学生表
    26         Set<Student> set = t.getStudents();
    27         for(Student s : set){
    28             sql = "insert into student(id,name) values(?,?)";
    29             params = new Object[]{s.getId(),s.getName()};
    30             runner.update(sql, params);
    31             
    32             //3.更新中间表,说明老师和学生的关系
    33             sql = "insert into teacher_student(teacher_id,student_id) values(?,?)";
    34             params = new Object[]{t.getId(),s.getId()};
    35             runner.update(sql, params);
    36         }
    37     }
    38     
    39     public Teacher find(String id) throws SQLException{
    40         
    41         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
    42         
    43         //1.找老师表,找出老师的基本信息
    44         String sql = "select * from teacher where id=?";
    45         Teacher t = (Teacher) runner.query(sql, id, new BeanHandler(Teacher.class));
    46         
    47         //2.找出老师的所有学生    多表查询
    49         sql = "select s.* from teacher_student ts,student s where ts.teacher_id=? and ts.student_id=s.id";
    50         List list = (List) runner.query(sql, id, new BeanListHandler(Student.class));
    51     
    52         
    53         t.getStudents().addAll(list);
    54         return t;
    55     }
    56     
    57     public void delete(String id){
    58         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
    59         String sql = "delete from teacher where id=?";
    60         
    61     }
    62 }

    4、测试

     1     @Test
     2     public void addTeacher() throws SQLException{
     3         
     4         Teacher t = new Teacher();
     5         t.setId("1");
     6         t.setName("老张");
     7         t.setSalary(100000);
     8         
     9         Student s1 = new Student();
    10         s1.setId("1");
    11         s1.setName("aa");
    12         
    13         Student s2 = new Student();
    14         s2.setId("2");
    15         s2.setName("bb");
    16         
    17         t.getStudents().add(s1);
    18         t.getStudents().add(s2);
    19         
    20         
    21         TeacherDao dao = new TeacherDao();
    22         dao.add(t);
    23     }
    24     
    25     @Test
    26     public void findTeacher() throws SQLException{
    27         TeacherDao dao = new TeacherDao();
    28         Teacher t = dao.find("1");
    29         System.out.println(t);
    30     }

     

  • 相关阅读:
    Beginning Silverlight 4 in C#数据绑定和Silverlight List控件
    使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
    分布式事物:第一章:分布式事物简介
    Redis数据结构存储系统:第三章:Redis在项目中如何使用?
    Android “NetworkOnMainThreadException”出错原因及解决办法
    asp.net 运行时, 报控件不存在
    Only the original thread that created a view hierarchy can touch its views
    android模拟器打开时比较慢,Run As就找不到模拟器
    db2数据库还原
    去掉代码中自动生成的TODO Autogenerated method stub
  • 原文地址:https://www.cnblogs.com/niuchuangfeng/p/9184047.html
Copyright © 2020-2023  润新知