JDBC多表的CRUD操作
jopen
12年前
一、简介
Javaweb中开发中必然会有多个javabean对象,而对象之间必然会存在的关系。那么对象之间的关系在关系型数据库中,如MySql、Oracle、Sql Server数据库中是如何体现这里关系的呢。
Javabean一般在数据库中是以表的形式体现,而java对象之间的关系(不管是简单的还是复杂的关系)都是以表外键约束来体现的。
二、Java对象关系与数据库表之间的关系映射
从实现事务来分,事务之间存在的多对多、多对一、一对一三种关系。比如学生与老师的关系,是多对多的关系(一个学生有多位老师,而一位老师教多位学生),员工与部门的关系,是多对一关系(多个员工对应一个部门),公民与身份证的关系,是一对一关系。在实现开发中,建议使用多对一描述对象关系。尽量的避免使用多与多与一对多的关系。
1>多对多关系映射(双向) 实现开发中建议使用单向的。比如只在Teacher类中保有Student等..
2>多对一关系映射(单向) 实现开发中也建议使用单向的,在多的一方建立关系
3>一对一关系映射
三、 多表操作示例代码
public class TeacherDaoImpl { private QueryRunner qr = new QueryRunner(DbcpUtil.getDataSource()); public void addTeacher(Teacher t){ try{ //保存教师的基本信息 String sql = "insert into teacher(id,name) values(?,?,?)"; Object params[] = {t.getId(),t.getName())}; qr.update(sql, params); List<Student> stus = t.getStudents(); if(0 != teacher.getList().size()){ //保存学生相关信息及维护第三方表的相关信息 sql = "insert into student(id,name,grade) values(?,?,?)"; String sql2 = "insert into tea_stu_fk(s_id,t_id) values(?,?)"; Object[][] prams = new Object[teacher.getList().size()][]; Object[][] prams2 = new Object[teacher.getList().size()][]; for(int i=0;i<teacher.getList().size();i++){ Student stu = teacher.getList().get(i); prams[i] = new Object[]{stu.getId(),stu.getName(),stu.getGrade()}; prams2[i] = new Object[]{stu.getId(),teacher.getId()}; } qr.batch(conn,sql, prams); qr.batch(conn,sql2, prams2); } }catch(Exception e){ throw new RuntimeException(e); } } public Teacher findTeacherById(Integer id){ try{ String sql = "select * from teacher where id=?"; Teacher t = qr.query(sql, new BeanHandler<Teacher>(Teacher.class), id); if(t!=null){ sql = "select * from student where id in (select s_id from teacher_student where t_id=?)"; List<Student> students = qr.query(sql, new BeanListHandler<Student>(Student.class), id); t.setStudents(students); } return t; }catch(Exception e){ throw new RuntimeException(e); } } }