我们在做项目开发的时候,一定会遇到多个表之间相关联的情况,在这种情况下,我们如果想要删除其中的某个表中的数据,就要连同其他表中与之对应的数据删除。例如:我们设计一个客户表,一个订单表,一个订单明细表。在每个客户表中对应多个订单表,而每个订单表对应着多个订单明细表,当我们想要删除一个客户,那么我们就得把这个客户对应的订单表以及其对应的订单明细表一同删除,那么这是我们就用到了级联删除。
我们在使用级联删除时, 如果遇到多对一关系或者一对多关系时,我们应该先删除多的一方,然后在删除一的一方。如上例,当我们删出客户时应当先删除用户对应的所有订单表,而当删除订单表时我们又得先删除与之对应的所有订单明细表。所以我们就应该先删除订单明细表,再删除订单表最后删除客户。
但我们在使用级联删除时我们应该将这些删除操作都包含在一个事务中,如果我们在操作中有一处不成功我们就得让事务回滚。如果全部成功我们才能提交事务,这样才能保证我们的级联删除成功,而且不会造成只删除部分数据。
下面是我们编写的级联删除的代码部分:
首先我们先封装俩个工具类这是线面几个类都得用的到达类:
数据库连接池:
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);
// 第六步:执行 更新,或查询
pstmt.executeUpdate();
// 第七步:释放资源
JdbcUtil.release(rs, pstmt);
} catch (Exceptione) {
// TODO Auto-generated catch block
try {
conn.rollback();// 回滚
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
conn.setAutoCommit(true);// 开启自动提交
} catch(SQLException e) {
e.printStackTrace();
}
}
}
}
//orderDao层(order表示订单表影射的类)
package cn.csdn.products.dao;
import java.util.List;
import cn.csdn.products.domain.Orders;
import cn.csdn.products.util.Dao;
public interface OrdersDao extendsDao<Orders, Integer> {
//获取与客户关联的订单
List<Orders>findByCid(Integer cid);
//删除与客户关联的订单的记录
voiddeleteByCid(Integer cid);
}
//orderDaoImpl层
package cn.csdn.products.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import cn.csdn.products.domain.Orders;
import cn.csdn.products.util.JdbcUtil;
public class OrdersDaoImpl implements OrdersDao {
/* 封装数据库操作的信息 */
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
public boolean deleteById(Integer id) {
// 先删除 多的哪一方
OrderDetailsDao odd = new OrderDetailsDaoImpl();
odd.deleteByOid(id);
// 第一步 声明返回值变量
boolean flag = false;
// 第二步:获取连接对象
conn = JdbcUtil.getConn();
try {
// 关闭事务
conn.setAutoCommit(flag);
// 第三步:声明sql语句
String sql = "delete from orders where id =?";
// 第四步: 根据sql语句用conn创建预处理对象
pstmt = conn.prepareStatement(sql);
// 第五步:为占位符 赋值 索引从1开始
int index = 1;
pstmt.setObject(index++, id);
// 第六步:执行 更新,或查询
int i =pstmt.executeUpdate();
// 第七步:判断
if (i > 0){
flag = true;
}
} catch (Exceptione) {
// TODO Auto-generated catch block
try {
conn.rollback();// 回滚
} catch(SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
try {
conn.setAutoCommit(true);// 开启自动提交
} catch(SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 第八步:释放资源
JdbcUtil.release(rs, pstmt);
/* 记得修改其返回值变量 */
return flag;
}
}
//客户映射的类的Dao层
package cn.csdn.products.dao;
import cn.csdn.products.domain.Customers;
import cn.csdn.products.util.Dao;
public interface CustomersDao extendsDao<Customers, Integer> {
}
//客户的DaoImpl层
package cn.csdn.products.dao;
import java.util.List;
import cn.csdn.products.domain.Customers;
public class CustomersDaoImpl implements CustomersDao{
public boolean delete(Customers entity) {
returndeleteById(entity.getId());
}
public boolean deleteById(Integer id) {
OrdersDao oDao = new OrdersDaoImpl();
oDao.deleteByCid(id);
return false;
}
}