数据库:多表之间的设计以及对应类之间的关系,与数据库的操作。

原创 2015年11月20日 16:24:46

当我们所做的项目要和数据库打交道的时候,总会要在数据库中创建表。

而表之间的关系:一对多,多对多,一对一,我们必须遵循数据完整性中的参照完整性。

简单提及一下,数据完整性有:实体完整性,域完整性,参照完整性。

create database dbtest;
use dbtest;
--客户和订单:一对多
create table customers(
	`id` int primary key,
	`name` varchar(100),
	`address` varchar(100)
);
create table `orders`(
	`id` int primary key,
	`num` int,
	amount float(8,2),
	customer_id int,
	constraint customer_id_fk foreign key(customer_id) references customers(id)
);
--教师和老师:多对多
create table teachers(
	id int primary key,
	name varchar(100),
	salary float(8,2)
);
create table students(
	id int,
	name varchar(100),
	grade varchar(10),
	primary key(id)
);
create table teachers_students(
	t_id int,
	s_id int,
	primary key(t_id,s_id),
	constraint t_id_fk foreign key(t_id) references teachers(id),
	constraint s_id_fk foreign key(s_id) references students(id)
);
--人和身份证:一对一
create table persons(
	id int primary key,
	name varchar(100)
);
create table idcards(
	id int primary key,
	num varchar(20),
	constraint person_id_fk foreign key(id) references persons(id)
);


表与表之间的关联关系:

一对多:

客户与订单之间的关系:一个客户可以有多个订单,但是一个订单只能属于一个客户。


CustomerDaoImpl.java
package com.xbmu.dao.impl;

import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.xbmu.domain.Customer;
import com.xbmu.domain.Order;
import com.xbmu.util.DBCPUtil;
public class CustomerDaoImpl {
	private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource());
	/**保存客户信息*/
	public void save(Customer c){
		try {
			//保存客户的基本信息到customers表
			qr.update("insert into customers (id,name,address) values(?,?,?)", c.getId(),c.getName(),c.getAddress());
			//判断客户有没有订单:如果有,保存到orders表中
			List<Order> os = c.getOrders();
			if(os.size()>0){
				for(Order o:os)
					qr.update("insert into orders (id,num,amount,customer_id) values(?,?,?,?)", o.getId(),
							o.getNum(),o.getAmount(),
							c.getId());
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
	}
	/**查询客户信息。客户关联的订单要不要查出来?看需求。*/
	public Customer findOne(int customerId){
		try {
			//查询客户信息
			Customer c = qr.query("select * from customers where id=?", new BeanHandler<Customer>(Customer.class),customerId);
			//同时查询客户的订单信息
			if(c!=null){
				List<Order> os = qr.query("select * from orders where customer_id=?", new BeanListHandler<Order>(Order.class), c.getId());
				c.setOrders(os);
			}
			return c;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

CustomerDaoImplTest.java

package cn.itcast.test;

import java.util.List;
import org.junit.Test;
import cn.itcast.dao.impl.CustomerDaoImpl;
import cn.itcast.domain.Customer;
import cn.itcast.domain.Order;
public class CustomerDaoImplTest {
	private CustomerDaoImpl dao = new CustomerDaoImpl();
	@Test
	public void testSave() {
		Customer c = new Customer();
		c.setId(1);
		c.setName("陈冲");
		c.setAddress("河南");
		
		Order o1 = new Order();
		o1.setId(1);
		o1.setNum(2014001);
		o1.setAmount(100);
		
		Order o2 = new Order();
		o2.setId(2);
		o2.setNum(2014002);
		o2.setAmount(1000);
		
		//建立关系
		c.getOrders().add(o1);
		c.getOrders().add(o2);
		
		dao.save(c);
	}

	@Test
	public void testFindOne() {
		Customer c = dao.findOne(1);
		System.out.println(c);
		List<Order> os = c.getOrders();
		for(Order o:os)
			System.out.println(o);
	}

}

多对多:

教师与学生的关系:一个教师可以有多个学生,一个学生可以有多个老师。因此教师与学生是多对多关系

TeacherDaoImpl.java

package com.xbmu.dao.impl;

import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.xbmu.domain.Student;
import com.xbmu.domain.Teacher;
import com.xbmu.util.DBCPUtil;
public class TeacherDaoImpl {
	private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource());
	public void save(Teacher t){
		try {
			//保存老师的基本信息
			qr.update("insert into teachers(id,name,salary) values (?,?,?)", t.getId(),t.getName(),t.getSalary());
			//保存学员信息:
			List<Student> students = t.getStudents();
			if(students.size()>0){
				for(Student s:students){
					//查询学员在不在:不在,保存学员信息
					Student stu = qr.query("select * from students where id=?", new BeanHandler<Student>(Student.class), s.getId());
					if(stu==null){
						qr.update("insert into students (id,name,grade) values(?,?,?)", s.getId(),s.getName(),s.getGrade());
					}
					//保存关系数据
					qr.update("insert into teachers_students (t_id,s_id) values(?,?)", t.getId(),s.getId());
				}
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
			
	}
	public Teacher findOne(int id){
		try {
			Teacher t = qr.query("select * from teachers where id=?", new BeanHandler<Teacher>(Teacher.class), id);
			if(t!=null){
				//查询学生信息
				String sql = "select s.* from students s,teachers_students ts where s.id=ts.s_id and ts.t_id=?";
				List<Student> stus = qr.query(sql, new BeanListHandler<Student>(Student.class), id);
				t.setStudents(stus);
			}
			return t;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

TeacherDaoImplTest.java

package cn.itcast.test;

import org.junit.Test;

import cn.itcast.dao.impl.TeacherDaoImpl;
import cn.itcast.domain.Student;
import cn.itcast.domain.Teacher;

public class TeacherDaoImplTest {
	private TeacherDaoImpl dao = new TeacherDaoImpl();
	@Test
	public void testSave(){
		
		Teacher t1 = new Teacher();
		t1.setId(1);
		t1.setName("陈文");
		t1.setSalary(10000);
		
		Teacher t2 = new Teacher();
		t2.setId(2);
		t2.setName("刘悦东");
		t2.setSalary(10000);
		
		Student s1 = new Student();
		s1.setId(1);
		s1.setName("张三");
		s1.setGrade("A");
		
		Student s2 = new Student();
		s2.setId(2);
		s2.setName("李四");
		s2.setGrade("A");
		
		//建立关系
		t1.getStudents().add(s1);
		t1.getStudents().add(s2);
		
		t2.getStudents().add(s1);
		t2.getStudents().add(s2);
		
		dao.save(t1);
		dao.save(t2);
	}
	@Test
	public void testQuery(){
		Teacher t = dao.findOne(2);
		System.out.println(t);
		for(Student s:t.getStudents())
			System.out.println(s);
	}
}

一对一:

人与身份证:一个人只能有一个身份证,一个身份证只能属于一个人。
PersonDaoImpl.java
package com.xbmu.dao.impl;

import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.xbmu.domain.IdCard;
import com.xbmu.domain.Person;
import com.xbmu.util.DBCPUtil;
public class PersonDaoImpl {
	private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource());
	public void save(Person p) {
		try {
			qr.update("insert into persons (id,name) values(?,?)", p.getId(),p.getName());
			IdCard idcard = p.getIdcard();
			if(idcard!=null){
				qr.update("insert into idcards (id,num) values(?,?)", p.getId(),idcard.getNum());
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public Person findOne(int id) {
		try {
			Person p = qr.query("select * from persons where id=?", new BeanHandler<Person>(Person.class), id);
			if(p!=null){
				IdCard idcard = qr.query("select * from idcards where id=?", new BeanHandler<IdCard>(IdCard.class), id);
				p.setIdcard(idcard);
			}
			return p;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

连接数据库需要的工具类:
DBCPUtil.java
package com.xbmu.util;

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 DBCPUtil {
	private static DataSource dataSource;
	
	static{
		try {
			Properties props = new Properties();
			InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
			props.load(in);
			dataSource = BasicDataSourceFactory.createDataSource(props);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static DataSource getDataSource(){
		return dataSource;
	}
	public static Connection getConnection(){
		try {
			Connection conn = dataSource.getConnection();
			return conn;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
PersonDaoImplTest.java
package cn.itcast.test;

import org.junit.Test;
import cn.itcast.dao.impl.PersonDaoImpl;
import cn.itcast.domain.IdCard;
import cn.itcast.domain.Person;
public class PersonDaoImplTest {
	private PersonDaoImpl dao = new PersonDaoImpl();
	@Test
	public void testSave() {
		Person p = new Person();
		p.setId(1);
		p.setName("陈冲");
		
		IdCard idcard = new IdCard();
		idcard.setNum("4201");
		
		p.setIdcard(idcard);
		
		dao.save(p);
	}

	@Test
	public void testFindOne() {
		Person p = dao.findOne(1);
		System.out.println(p.getName());
		System.out.println(p.getIdcard().getNum());
	}

}




版权声明:本文为博主原创文章,未经博主允许不得转载。

数据库设计(表与表之间的3种关系)

表与表之间一般存在三种关系,即一对一,一对多,多对多关系。 下面分别就三种关系讲解数据库相关设计的思路和思考过程;(1)一对一关系 例如,下面的一张表,保存了人的相关信息,有男有女,要求查处所有的...
  • lengjinghk
  • lengjinghk
  • 2016年08月07日 02:31
  • 43410

数据库实体间三种对应关系:一对一,一对多,多对多

数据库实体间有三种对应关系:一对一,一对多,多对多。一对一关系示例:一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。 一对多关系示例:一个学生只属于一个班,但是一个学院有多名学生。 ...
  • qq_26291823
  • qq_26291823
  • 2016年01月17日 23:47
  • 7209

ER 和 数据库关系模式

http://lianghuanyue123.blog.163.com/blog/static/130423244201162011850600/ 我们目前所接触的数据库基本上是关系数据库,...
  • sunmenggmail
  • sunmenggmail
  • 2012年09月26日 21:21
  • 35008

数据库中多表的连接

连接数据库中的表进行查询、建立视图,可以大大提高去查询数据库数据的效率。连接表进行查询实际上是通过各个表之间共同列的关系来查询数据的,他是关系数据查询最重要的特性。...
  • suneqing
  • suneqing
  • 2014年01月13日 18:33
  • 2547

关联数据库表多表联合查询

insert into employee (id,position,xueli,emplyee_name) values(1,1,4,'杨忠宇'); 就是说这个员工  是高中学历...
  • yboker
  • yboker
  • 2012年12月05日 11:55
  • 6971

PetShop数据访问层之数据库访问设计

 PetShop数据访问层之数据库访问设计Filed under: Design & Pattern — bruce zhang @ 1:50 pm 《解剖PetShop》系列之二二、PetShop数...
  • wanghu9999
  • wanghu9999
  • 2006年12月17日 21:22
  • 1531

Sql表间关系和连接查询应用举例

以前学连接查询时看的书上举的例子都是没有实际意义的,随便凑上两个表格,只是了解的语法,但却不明白到底为什么要用连接查询,连接查询的好处是什么。最近在学Hibernate,重温sql时想到一个特别好的案...
  • momowuwenderen
  • momowuwenderen
  • 2013年07月31日 12:19
  • 1302

如何定义数据库表之间的关系

特别说明数据库的正规化是关系型数据库理论的基础。随着数据库的正规化工作的完成,数据库中的各个数据表中的数据关系也就建立起来了。 在设计关系型数据库时,最主要的一部分工作是将数据元素如何分配到各个关系数...
  • feng19821209
  • feng19821209
  • 2006年04月21日 15:56
  • 3715

sql 表和表之间关联

1.表和表之间关联: (1)左关联left join:两个表之间以左边的表数据为准; (2)右关联right join:两个表之间以右边的表数据为准; (3)等值关联join :两个表都满足两个...
  • u011230322
  • u011230322
  • 2017年01月12日 21:01
  • 2033

数据库表之间的关系-关系图

  • 2015年09月27日 15:08
  • 422KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库:多表之间的设计以及对应类之间的关系,与数据库的操作。
举报原因:
原因补充:

(最多只允许输入30个字)