1. 1对多,部门--员工 为例, 多的一方建外键。

domain,建立bean对象

public class Department {
private String id;
private String name;
private Set<Employee> employees = new HashSet<Employee>(); 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<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
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;
}
}

dao层实现增查功能

/*
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)
);
* */ public class DepartmentDao { public void add(Department department) throws SQLException { QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource()); // 1.取出department对象的基本信息存在 department表
String sql = "insert into department(id,name) values(?,?)";
Object[] params = {department.getId(), department.getName()};
qr.update(sql, params); // 2. 取出department对象中所有的员工信息,存在员工表
sql = "insert into employee(id,name,salary,department_id) values(?,?,?,?)";
Set<Employee> set = department.getEmployees();
Object[][] params2 = new Object[set.size()][];
int index = 0;
for(Employee e : set)
{
params2[index++] = new Object[]{e.getId(), e.getName(), e.getSalary(), department.getId()};
}
qr.batch(sql, params2); // 3.更新员工表的外键列,说明员工所属部门
} public Department find(String id) throws SQLException{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource()); //1.查出部门表的信息,存在department对象中
String sql = "select * from department where id=?";
Department d = (Department) qr.query(sql, id, new BeanHandler(Department.class)); //2.查出部门下的所有员工信息,存在department对象维护的员工对象中
// 不要直接轻易取出所有数据, 数据太多一定要分页
sql = "select id,name,salary from employee where department_id=?";
List list = (List) qr.query(sql, id, new BeanListHandler(Employee.class)); d.getEmployees().addAll(list); return d;
}
}

Service层实现调用, 这里仅用junit做测试

public class BusinessService {

	DepartmentDao ddao = new DepartmentDao();
TeacherDao tdao = new TeacherDao();
PersonDao pdao = new PersonDao(); @Test
public void addDepartment() throws SQLException
{
Department d = new Department();
d.setId("1");
d.setName("开发部"); Employee e1 = new Employee();
e1.setId("1");
e1.setName("aaa");
e1.setSalary(300); Employee e2 = new Employee();
e2.setId("2");
e2.setName("bbb");
e2.setSalary(300); d.getEmployees().add(e1);
d.getEmployees().add(e2);
ddao.add(d);
} @Test
public void findDepartment() throws SQLException
{
Department d = ddao.find("1");
System.out.println("department name: " + d.getName());
for( Employee e : d.getEmployees() )
{
System.out.println("Employee name: " + e.getName());
}
} @Test
public void addTeacher() throws SQLException
{ Teacher t = new Teacher();
t.setId("1");
t.setName("张三");
t.setSalary(999999); Student s1 = new Student();
s1.setId("1");
s1.setName("aaa"); Student s2 = new Student();
s2.setId("2");
s2.setName("bbb"); t.getStudents().add(s1);
t.getStudents().add(s2); tdao.add(t);
} @Test
public void findTeacher() throws SQLException
{
Teacher t = tdao.find("1");
System.out.println("teacher Name: " + t.getName());
for(Student s : t.getStudents())
{
System.out.println("Student name: " + s.getName());
}
} @Test
public void addPerson() throws SQLException
{
Person p = new Person();
p.setId("id7788");
p.setName("kevin"); Idcard card = new Idcard();
card.setId(p.getId());
card.setAddress("广东中山"); p.setIdcard(card);
pdao.add(p);
} }

2. 多对多,老师--学生为例, 建立中间表

domain,建立bean对象

public class Teacher {
private String id;
private String name;
private double salary;
private Set<Student> students = new HashSet<Student>(); 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<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
public class Student {
private String id;
private String name;
private Set<Teacher> teachers = new HashSet<Teacher>(); 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<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}

Dao层实现 增查功能

/*
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)
); * */ public class TeacherDao { public void add(Teacher t) throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource()); //1.取出老师的基本信息,存在老师表
String sql = "insert into teacher(id, name, salary) values(?,?,?)";
Object[] params = {t.getId(), t.getName(), t.getSalary()};
qr.update(sql, params); // 2.取出老师下面所有的学生,存在学生表
Set<Student> set = t.getStudents();
for(Student s : set)
{
sql = "insert into student(id, name) values(?,?)";
params = new Object[]{s.getId(), s.getName()};
qr.update(sql, params); // 3.在中间表中说明老师和学生的关系
sql = "insert into teacher_student(teacher_id, student_id) values(?,?)";
params = new Object[]{t.getId(), s.getId()};
qr.update(sql, params);
}
} public Teacher find(String id) throws SQLException
{
QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource()); // 1.从老师表中找出老师的基本信息
String sql = "select * from teacher where id=?";
Teacher t = (Teacher) qr.query(sql, id, new BeanHandler(Teacher.class)); // 2.从中间表和学生表中得到老师所有的学生(尽量不取,取则 数据多要分页)
sql = "select s.id,s.name from teacher_student ts,student s where teacher_id=? and ts.student_id=s.id";
List<Student> list = (List<Student>) qr.query(sql, id, new BeanListHandler(Student.class));
t.getStudents().addAll(list);
return t;
}
}

service 层代码 如上 例一。

3. 1对1, 人--身份证为例, 建立主从关系

domain,建立bean对象

public class Person {

	private String id;
private String name;
private Idcard idcard; 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 Idcard getIdcard() {
return idcard;
}
public void setIdcard(Idcard idcard) {
this.idcard = idcard;
}
}
public class Idcard {

	private String id;
private String address;
private Person person; public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}

Dao层 实现增功能

/*
create table person(
id varchar(40) primary key,
name varchar(40)
); create table idcard(
id varchar(40) primary key,
address varchar(100),
constraint id_FK foreign key(id) references person(id)
);
* */ public class PersonDao { public void add(Person p) throws SQLException { QueryRunner qr = new QueryRunner(JdbcUtils_C3P0.getDataSource()); // 取出person的信息存在person表
String sql = "insert into person(id,name) values(?,?)";
Object params[] = { p.getId(), p.getName() };
qr.update(sql, params); // 取出身份证的信息存在身份证表
sql = "insert into idcard(id,address) values(?,?)";
params = new Object[] { p.getId(), p.getIdcard().getAddress() };
qr.update(sql, params);
}

Java -- 数据库 多表操作,1对多,多对多,1对1。 基于dbutils框架的更多相关文章

  1. c# 数据库编程(利用DataSet 和 DataAdaper对象操作数据库--跨表操作)

    上篇文章我们介绍了如何利用DataSet 和 DataAdaper对象来对单张表进行操作. 本文我们将介绍如何进行跨表操作. 我们通过具体例子方式进行演示,例子涉及到三张表. 1)student表(学 ...

  2. c# 数据库编程(利用DataSet 和 DataAdaper对象操作数据库--单表操作)

    一.概述 前面2篇文章,介绍了使用SqlCommand对象利用sql命令来操作数据库. 这篇文章我们来介绍使用c#的DataSet 和 DataAdaper对象操作操作数据库. 先来介绍下这两个对象是 ...

  3. SQL Server 基础 01 数据库、表操作

    对着书慢慢学习,一天一点点! 数据库操作 (create.alter.drop)  --3-3-1 /create database 语句创建数据库 create database testSQL - ...

  4. Java Web 单表操作

    为了测试 JavaWeb 项目,我做了一个关于一张表的更新操作. 1.加群 如果需要本项目的源码,欢迎加群:438255459 2.解压 解压开这个包,然后用 Eclipse 打开项目,至于涉及到 T ...

  5. 数据库 -- mysql表操作

    一,存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 详见:https://www.cnblogs.com/peng104/p/9751738.html 二,表介绍 表相当 ...

  6. day 46 Django 学习3 数据库单表操作以及反向解析

    前情提要: Django 已经学了不少了, 今天学习链接数据库的操作.以及相关的反向解析等 一:反向解析 1:反向解析模板层 跳转时设定url会随着前面的路由改变而改变         2:反向解析之 ...

  7. zabbix 数据库分表操作

    近期zabbix数据库占用的io高,在页面查看图形很慢,而且数据表已经很大,将采用把数据库的数据目录移到新的磁盘,将几个大表进行分表操作 一.数据迁移: 1.数据同步到新的磁盘上,先停止mysql(不 ...

  8. MySQL-快速入门(1)基本数据库、表操作语句

    1.创建数据库 create database db_name;show create database db_name\G; //查看数据创建语句show databases; //查看当前创建的数 ...

  9. MySQL快速回顾:数据库和表操作

    前提要述:参考书籍<MySQL必知必会> 利用空闲时间快速回顾一些数据库基础. 4.1 连接 在最初安装MySQL,可能会要求你输入一个管理登录(通常为root)和一个口令(密码). 连接 ...

随机推荐

  1. [Spring MVC]学习笔记--FreeMarker的使用

    还是先贴出该例子存于github上的位置 https://github.com/lemonbar/spring-mvc-freemarker Sping-Framework 的官方文档简单列出了在sp ...

  2. 1686 第K大区间(尺取+二分)

    1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...

  3. 项目中调用ExcelCom组件时的配置流程

    异常提示如下:         Microsoft Office Excel 不能访问文件“*.xls”. 可能的原因有:        1 文件名称或路径不存在.       2 文件正被其他程序使 ...

  4. undefined let 作用域

    const o = {uid:123,pid:'wwww'}const wxPayNotifyUrlBizInfo = (o) => { // TODO json let s = '' for ...

  5. sparse matrix

    w https://en.wikipedia.org/wiki/Sparse_matrix 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB - Bin的专栏 - 博客园ht ...

  6. Java 注解入门

    1.什么是注解 注解的语法: @注解名称; 注解的作用: 用来替代 xml 配置文件; 在 Servlet 3.0 中就可以使用注解来代替配置文件; 注解是由框架来读取使用的; 所有的注解都是 Ann ...

  7. Django 视图系统(views)

    介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图 ...

  8. Linux python3安装/shell脚本/if/循环/函数

    python3安装 安装过程 安装包: wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgztar -xvf Python-3.7 ...

  9. 卸载SQL Server 2008 (R2)

    一.卸载SQL Server 2008 (R2) 1.找到控制面板,win8及win7都可以直接点解“开始”按钮找到. (Tip:win10系统的小盆友可以在“开始”菜单下点击“所有应用”,找到win ...

  10. Vuex核心知识(转)

    转:http://www.cnblogs.com/ghost-xyx/p/6380689.html Vuex 是一个专门为 Vue.js 应该程序开发的状态管理模式,它类似于 Redux 应用于 Re ...