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     }

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM