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 ...
随机推荐
- gradle结合spring-boot生成可运行jar包,并打印日志
1.用gradle把springboot项目打包成jar 1.1 build.gradle 中添加 buildscript { repositories { mavenLocal() maven { ...
- Winform启动时隐藏不显示
我最终用了这个方法:1.MainForm的构造方法中添加: public MainForm() { InitializeComponent(); this.ShowInTaskbar = false; ...
- Maven实战(八)pom.xml简介
目录 pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件.开发者需要遵循的规则.缺陷管理系统.组织和licenses.项目的url.项目的依赖 ...
- JavaScript基础进阶之常用字符串方法总结
前面三篇文章简单的把JavaScript基础内容过了一遍,我们已经可以用JavaScript写一些简单的代码了. 今天主要总结一下JavaScript中String对象中自带的一些方法,来帮助我们处理 ...
- Java基础知识强化107:DecimalFormat
1. 引入: 如何控制输出数据的精度? >1. 使用Math.round方法 (1)Java如何把一个float(double)四舍五入到小数点后2位,4位,或者其它指定位数 ? 答:比如,如下 ...
- 2.3 Python语言基础
2.3 Python语言基础 1 语言语义(Language Semantics) 缩进,而不是括号 Python使用空格(tabs or spaces)来组织代码结构,而不是像R,C++,Java那 ...
- 25个增强iOS应用程序性能的提示和技巧 — 中级篇
本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...
- impala jdbc驱动执行impala sql的一个坑(不支持多行sql)
架构使用spark streaming 消费kafka的数据,并通过impala来插入到kudu中,但是通过对比发现落地到kudu表中的数据比kafka消息数要少,通过后台日志发现,偶发性的出现jav ...
- [USACO08NOV]Mixed Up Cows
嘟嘟嘟 一看n那么小,那一定是状压dp了(表示从没写过,慌). 首先dp[i][j](i 是一个二进制数,第x位为1代表选了第x头牛),表示 i 这个状态最后一头牛是第 j 头牛时的方案数. 然后当 ...
- PHP microtime() 函数
定义和用法 microtime() 函数返回当前 Unix 时间戳和微秒数. 语法 microtime(get_as_float) 参数 描述 get_as_float 如果给出了 get_as_fl ...