JDBC多表操作
一、一对多关系:部门管理系统
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) on delete set null;
);
constraint department_id_FK foreign key(department_id) references department(id) on delete set null; 设置级联
当主表的记录删除后,从表的外键置为空
2、对象
Department.java:部门
package com.domain; import java.util.HashSet;
import java.util.Set; public class Department { private String id;
private String name; //设置一个Set集合保存所有员工
private Set employees = new HashSet(); public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getEmployees() {
return employees;
}
public void setEmployees(Set employees) {
this.employees = employees;
}
}
在多对一的情况下,要注意“一”的一方是否需要维护多的一方数据的集合
Employee.java:员工
package com.domain;
public class Employee {
private String id;
private String name;
private double salary;
private Department department;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
3、dao层
DepartmentDao.java
package com.dao;
import java.sql.SQLException;
import java.util.List;
import java.util.Set; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler; import com.domain.Department;
import com.domain.Employee;
import com.utils.JdbcUtils; public class DepartmentDao {
//插入操作
public void insert(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维护的所有员工保存在employee表
Set<Employee> set = d.getEmployees();
for(Employee e : set){
sql = "insert into employee(id,name,salary,department_id) values(?,?,?,?)"; //3、更新员工的外键列,说明员工所在的部门
params = new Object[]{e.getId(),e.getName(),e.getSalary(),d.getId()};
runner.update(sql, params);
}
} //查找
public Department find(String id) throws SQLException{ QueryRunner runner = new QueryRunner(JdbcUtils.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.getDataSource());
String sql = "delete from department where id=?";
runner.update(sql, id);
}
}
4、service层
package com.service; import java.sql.SQLException; import org.junit.Test; import com.dao.DepartmentDao;
import com.domain.Department;
import com.domain.Employee; public class Bservice {
@Test
public void add() throws SQLException{
Department d = new Department();
d.setId("111");
d.setName("开发部"); Employee e1 = new Employee();
e1.setId("1");
e1.setName("aa");
e1.setSalary(10000); Employee e2 = new Employee();
e2.setId("2");
e2.setName("bb");
e2.setSalary(10000); d.getEmployees().add(e1);
d.getEmployees().add(e2); DepartmentDao dao = new DepartmentDao();
dao.insert(d);
} @Test
//查找
public void find() throws SQLException{ DepartmentDao dao = new DepartmentDao();
Department d = dao.find("111");
System.out.println(d.getName()); } @Test
//删除
public void delete() throws SQLException{ DepartmentDao dao = new DepartmentDao();
dao.delete("111");
}
}
5、工具类
JdbcUtils.java
package com.utils; import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class JdbcUtils {
private static DataSource ds;
static{
try {
Properties prop = new Properties();
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
prop.load(in); //创建数据源
BasicDataSourceFactory factory = new BasicDataSourceFactory();
ds = factory.createDataSource(prop);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
} //提供数据源
public static DataSource getDataSource(){
return ds;
} //获取连接
public static Connection getConnection() throws SQLException{
return ds.getConnection();
}
}
二、多对多关系:老师-----学生
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
import java.util.HashSet;
import java.util.Set; public class Teacher {
private String id;
private String name;
private double salary;
10 private Set students = new HashSet();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Set getStudents() {
return students;
}
public void setStudents(Set students) {
this.students = students;
} }
Student.java
import java.util.HashSet;
import java.util.Set; public class Student {
private String id;
private String name;
9 private Set teachers = new HashSet();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getTeachers() {
return teachers;
}
public void setTeachers(Set teachers) {
this.teachers = teachers;
} }
3、dao层
TeacherDao.java
import java.sql.SQLException;
import java.util.List;
import java.util.Set; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler; import cn.itcast.domain.Student;
import cn.itcast.domain.Teacher;
import cn.itcast.utils.JdbcUtils; public class TeacherDao { public void add(Teacher t) throws SQLException { QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource()); //1`.取出老师存老师表
String sql = "insert into teacher(id,name,salary) values(?,?,?)";
Object params[] = {t.getId(),t.getName(),t.getSalary()};
runner.update(sql, params); 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 } 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)); 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)); t.getStudents().addAll(list);
return t;
} public void delete(String id){
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "delete from teacher where id=?"; }
}
4、测试
@Test
public void addTeacher() throws SQLException{ Teacher t = new Teacher();
t.setId("1");
t.setName("老张");
t.setSalary(100000); Student s1 = new Student();
s1.setId("1");
s1.setName("aa"); Student s2 = new Student();
s2.setId("2");
s2.setName("bb"); 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);
}
JDBC多表操作的更多相关文章
- spark使用Hive表操作
spark Hive表操作 之前很长一段时间是通过hiveServer操作Hive表的,一旦hiveServer宕掉就无法进行操作. 比如说一个修改表分区的操作 一.使用HiveServer的方式 v ...
- JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作
1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...
- 模型层之ORM、数据库和单表操作
一.ORM简介 ORM是“对象-关系-映射”的简称,一般指持久化数据和实体对象的映射 1.1 什么是“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中( ...
- Mybatis多表操作
一:引言 在学习完前面的mybatis基本语法后,大家都有个认知,这个Mybatis太强大了,比之前使用JDBC写方便多了,但是你们当初在使用原生JDBC写SQL查询的时候有没有遇到过多表查询呢?肯定 ...
- Mybatis(四)多表操作
数据库如下: 一.创建数据库所对应的bean类 public class User { private Integer uId; private String username; private St ...
- Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化
知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...
- Mysql常用表操作 | 单表查询
160905 常用表操作 1. mysql -u root -p 回车 输入密码 2. 显示数据库列表 show databases 3. 进入某数据库 use database data ...
- Sql Server系列:数据表操作
表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...
- 学习MySQL之单表操作(二)
##单表操作 ##创建表 CREATE TABLE t_employee( empno ), ename ), job ), MGR ), Hiredate DATE DEFAULT '0000-00 ...
随机推荐
- September 13th 2017 Week 37th Wednesday
Whenever people agree with me, I always feel I must be wrong. 每次人们赞同我时,我都觉得自己一定错了. We can draw lesso ...
- JavaScript动画
早期的JS动画 早期的JS循环动画主要是通过setInterval/setTimeout实现的 function jump() { console.log("我跳了一下"); } ...
- Hibernate事务、缓存和连接池
一.事务 1.数据库事务的概念 数据库事务是指由一个或多个SQL语句组成的工作单元,这个工作单元中的SQL语句相互依赖,如果有一个SQL语句执行失败,就必须撤销整个工作单元.在并发环境中,多个事务同时 ...
- [李居丽][다이아몬드][Diamond]
歌词来源:http://music.163.com/#/song?id=484056974 作曲 : Damon Sharpe/JOHN HO/JEFF SHUM [作曲 : Damon Sharpe ...
- SGU---101 无向图的欧拉回路
题目链接: https://cn.vjudge.net/problem/SGU-101 题目大意: 给定你n张骨牌,每张牌左右两端有一个数字,每张牌的左右两端数字可以颠倒,找出一种摆放骨牌的顺序,使得 ...
- python第十四课--排序及自定义函数
1.排序 特点: 1).升序:从小到大 2).降序:从大到小 课堂实现选择排序:参看老郭选择排序.py文件 2.函数:(方法/method) 自定义函数: 概念:它表示一段作用范围(作用域),当中封装 ...
- BZOJ3052:[WC2013]糖果公园(树上莫队)
Description Input Output Sample Input 4 3 51 9 27 6 5 12 33 13 41 2 3 21 1 21 4 20 2 11 1 21 4 2 Sam ...
- Python全栈开发:list 、tuple以及dict的总结
总结: 列表:增:append(),inset(),extend() 删:pop(),remove(),clear(),del 改:a.通过指定元素和切片重新赋值.b.可以使用repelace替换列表 ...
- jenkins pipeline 配置
pipeline { agent any stages { stage('Checkout') { steps { echo 'Checkout' checkout([$class: 'GitSCM' ...
- Vue滚动加载自定义指令
用Vue在移动端做滚动加载,使用mint-ui框架, InfiniteScroll指令loadmore组件,在uc浏览器和qq浏览器都无法触发.无奈我只能自己写了. 决定用vue 的自定义指令 写滚动 ...