当我们所做的项目要和数据库打交道的时候,总会要在数据库中创建表。
而表之间的关系:一对多,多对多,一对一,我们必须遵循数据完整性中的参照完整性。
简单提及一下,数据完整性有:实体完整性,域完整性,参照完整性。
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) );
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); } } }
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); } }
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); } } }
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); } }
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); } } }
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()); } }