我们在使用级联删除时, 如果遇到多对一关系或者一对多关系时,我们应该先删除多的一方,然后在删除一的一方。如上例,当我们删出客户时应当先删除用户对应的所有订单表,而当删除订单表时我们又得先删除与之对应的所有订单明细表。所以我们就应该先删除订单明细表,再删除订单表最后删除客户。但我们在使用级联删除时我们应该将这些删除操作都包含在一个事务中,如果我们在操作中有一处不成功我们就得让事务回滚。如果全部成功我们才能提交事务,这样才能保证我们的级联删除成功,而且不会造成只删除部分数据。下面是我们编写的级联删除的代码部分:首先我们先封装俩个工具类这是线面几个类都得用的到达类:
数据库连接池:packagecn.csdn.products.util;importjava.sql.*;publicclass JdbcUtil {
/* 私有的静态的成员变量*/
private static Connection conn = null;
/* 私有的构造器 */
private JdbcUtil() {
}
/* 公有静态的返回 成员变量的方法 */
public static Connection getConn() {
if (conn == null) {
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager
.getConnection("jdbc:mysql://localhost:3306/products?user=root&password=root&useUnicode=true&characterEncoding=UTF8");
} catch (Exception e) {
e.printStackTrace();
}
}
return conn;
}
/* 公有静态的没有 返回值 对数据库操作的对象的关闭操作 */
public static void release(ResultSet rs,PreparedStatement pstmt) {
/* 关闭结果集 */
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}
}
/* 关闭预处理对象 */
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println(JdbcUtil.getConn());
}}Dao工具类package cn.csdn.products.util;import java.util.List;public interface Dao<T, PK> {
boolean insert(T entity);
boolean delete(T entity);
boolean deleteById(PK id);
boolean update(T entity);
T findById(PK id);
List<T> findAll();
List<T> findNowPageInfo(int nowpage,int pagesize,String where);}//删除订单明细表中的数据//订单明细表dao层public interface OrderDetailsDao extendsDao<OrderDetails, Integer> {
void deleteByOid(Integer oid);}public class OrderDetailsDaoImpl implements OrderDetailsDao { /* 封装数据库操作的信息 */
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;public void deleteByOid(Integer oid) {
// 第二步:获取连接对象
conn = JdbcUtil.getConn();
try {
// 关闭事务
conn.setAutoCommit(false);
// 第三步:声明sql语句oid是order(订单表中的外键)
String sql = "delete from orderdetails where oid =?";
// 第四步: 根据sql语句用conn创建预处理对象
pstmt = conn.prepareStatement(sql);
// 第五步:为占位符 赋值 索引从1开始
int index = 1;
pstmt.setObject(index++,oid);