JAVA操作两表关系
四种:双向一对一,一对多,多对一,多对多
多表关系处理数据
(1) 数据库通过外键建立两表关系
(2) 实体类通过属性的方式建立两表关系
实体类要求:类名=表名,列名=属性名
一对多(老师->学生)
在一方创建存储多方的集合
List studentList;
定义dao接口
定义一个根据老师id查询老师信息(学生的信息)
public Teacher getById(int tid);
定义实现类:
连接数据库
执行sql语句
List<student> students=new ArrayList<student>();
while (resultSet.next()){
//1.取出各自的信息
teacher.setTid(resultSet.getInt("tid"));
teacher.setTname(resultSet.getString("tname"));
Student student = new Student();
student.setStuId(resultSet.getInt("stuid"));
student.setStuName(resultSet.getString("stuname"));
//2.建立学生和老师之间的关系
students.add(student);
}
teacher.setStudentList(students);
return teacher;
多对一(学生->老师)
在多方创建一个用于存储一方的对象
private Teacher teacher;
在接口新增:
//查询所有的学生(包含老师的信息)
实现类:
连接数据库,执行sql语句
public List getAll();
List students=new ArrayList<>();
while (resultSet.next()){
//1.取出各自的信息
Student student = new Student();
student.setStuId(resultSet.getInt("stuid"));
student.setStuName(resultSet.getString("stuname"));
Teacher teacher = new Teacher();
teacher.setTid(resultSet.getInt("tid"));
teacher.setTname(resultSet.getString("tname"));
//2.建立学生和老师之间的关系
student.setTeacher(teacher); students.add(student);
}
return students;
一对一(妻子丈夫)
在任何一方都有对方的对象
定义接口:
//查询妻子信息(包含丈夫信息)
public Wife getWife(int wid);
//查询丈夫信息(包含妻子信息)
public Husband getHus(int hid);
实现类:
Wife wife = new Wife();
while (resultSet.next()){
//1.取出各自的信息
wife.setWifeId(resultSet.getInt("wifeid"));
wife.setWifeName(resultSet.getString("wifename"));
Husband husband = new Husband();
husband.setHusId(resultSet.getInt("husid"));
husband.setHusName(resultSet.getString("husname"));
//2.建立妻子和丈夫之间的关系
wife.setHusband(husband);
}
return wife;
通过丈夫找妻子的方法同上,改一下返回的值
多对多(科目-学生)
双方都有对方的集合
接口:
//查询某个学生信息(查询出所学科目)
public Student findById(int id);
//查询某个科目以及对应的学生姓名
public Subject findBySubId(int subId);
实现类:
Student student = new Student();
List subjects=new ArrayList<>();
while (resultSet.next()){
//1.取出各自的信息
student.setStuId(resultSet.getInt("stuid"));
student.setStuName(resultSet.getString("stuname"));
Subject subject = new Subject();
subject.setSubId(resultSet.getInt("subid"));
subject.setSubName(resultSet.getString("subname"));
subjects.add(subject);
}
//2.建立学生和科目之间的关系
student.setSubjects(subjects);
return student;
查询科目ID同上,参考一对多的思想
数据库事务
JDBC中事务应用
如JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库
事务使您能够控制是否和何时更改应用于数据库。它将单个SQL语句或一组SQL语句视为一
个逻辑单 元,如果任何语句失败,则整个事务将失败。
connection.setAutoCommit(布尔值)
True:自动提交
False:手动提交
完成更改后,我们要提交更改,然后在连接对象上调用commit()方法
conn.commit();
要使用连接名为conn的数据库回滚更新
conn.rollback( );
在Catch中编写
Savepoints
保存点
新的JDBC 3.0 Savepoint接口为您提供了额外的事务控制。
设置保存点时,可以在事务中定义逻辑回滚点。如果通过保存点发生错误,则可以使用回滚
方法来撤消 所有更改或仅保存在保存点之后所做的更改。
Connection对象有两种新的方法来帮助您管理保存点:
- setSavepoint(String savepointName):定义新的保存点。它还返回一个Savepoint
对象。
- releaseSavepoint(Savepoint savepointName):删除保存点。请注意,它需要一个
Savepoint 对象作为参数。此对象通常是由setSavepoint()方法生成的保存点
1、要取消掉JDBC的自动提交:void setAutoCommit(boolean autoCommit)
2、执行各个SQL语句,加入到批处理之中
3、如果所有语句执行成功,则提交事务 commit();如果出现了错误,则回滚:rollback()