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 ...
随机推荐
- (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
1.Map集合(重点)1.1 常用的方法 Set<Map.Entry<K,V>> entrySet() - 用于将Map集合转换为Set集合. 其中Map.Entry<K ...
- XGBoost 输出特征重要性以及筛选特征
1.输出XGBoost特征的重要性 from matplotlib import pyplot pyplot.bar(range(len(model_XGB.feature_importances_) ...
- PHP字符串——简单应用
错误的学习编码语言观点:语言语法不用记,多练习就可以了. 应该是死记住,然后加强练习以免忘记.以及在练习中加强理解.试着想“为什么是这样的语法习惯”.PHP提供了8种数据类型.4种是标量型(单值) ...
- HBase学习之路 (八)HBase大牛博客
主要是记录一下链接 http://hbasefly.com
- Mac app打包成dmg
1. 找到打包的app文件,在Xcode工程的Products目录下 2. 在桌面新建一个文件夹dmg,将app文件放进去. 3. 为了实现拖拽到Application的效果,需要在这个文件夹里放一个 ...
- 集合之HashMap
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- Linux 无法连接网络排查方法
.hosts文件增加 127.0.0.1 对localhost的解析. .检查/etc/resove.cnf dns配置是否正确 .route命令检查是否有默认路由,没有就 route add 网段 ...
- 初识Qt鼠标、键盘事件及定时器和随机数
1.新建Qt Gui应用,项目名称为“myEvent”,基类名称为QWidget,类名称为Widget. 2.widget.h文件中添加以下代码,该段代码中包含了三个事件函数和一个槽函数 privat ...
- 网络编程之OSI七层协议
七层协议: 应用层 表示层 会话层 传输层 网络层 数据连接层 物理连接层 1.物理连接层: 实现计算机之间物理连接,传输的数据都是010101的二进制 电信号工作原理:电只有高低电频 2.数据链路层 ...
- CAN--UART的协议转换器
CAN--UART的协议转换器 //------------------------------------------------------// CAN <==> UART的协议转换 ...