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. 巨蟒django之权限9:前端展示修改删除合并&&权限展示

    1.权限组件控制流程(硬核重点) 2.权限组件控制流程 3.角色管理 4.删除合并 5.权限展示

  2. KVC示例

    KVC –key value Coding,可以让我们通过键值编码的形式进行属性值的赋值 参考苹果官网的图.. 1.KVC 定义一个Person类 .h文件 1: #import <Founda ...

  3. if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary

    if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary

  4. springboot集成liquibase,h2数据库

    Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. Liquibase具备如下特性:* 不依赖于特 ...

  5. 前端基础-html(3)

    一.列表标签 1.ul(无序列表)标签 ul(unordered list)无序列表,ul下的子元素只能是li(list item),如下示例: <ul> <li>第一项< ...

  6. PCL+Qt+VS可视化点云

    前言 Point Cloud Library (PCL)是一个功能强大的开源C++库,假设可以使用好PCL将会对我们在LiDAR数据处理领域的研究产生巨大帮助.LiDAR技术经过几十年的发展.眼下国内 ...

  7. Linux中的服务管理

    RPM包默认安装的服务 查看已安装的服务: chkconfig --list 默认安装位置: /etc/init.d 启动脚本 /etc/sysconfig 初始化环境配置文件 /etc  配置文件位 ...

  8. Java基础—访问权限控制

    Java中访问权限控制的作用: 为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分. 为了让类库设计者可用更改类的内部工作方式,而不 ...

  9. F110 参数保存和重新运行录屏

    **初始界面回车 PERFORM frm_dynpro USING ' 'X'. PERFORM frm_dynpro USING '' 'BDC_CURSOR' 'F110V-LAUFD'. PER ...

  10. LeetCode:学生的出勤记录|【551】

    LeetCode:学生的出勤记录|[551] 题目描述 给定一个字符串来代表一个学生的出勤纪录,这个纪录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : P ...