一、一对多关系:部门管理系统
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 }