立即注册
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广州大学城网业务调整

[Java/JSP] JavaEE中的级联删除讲解级源码 [复制链接] qrcode

查看: 2997 | 回复: 0

大法师的 该用户已被删除
发表于: 2012-12-29 15:06:56 | 显示全部楼层

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

QQ 744437114
  疯狂软件官网:http://www.fkjava.org
  疯狂java视频 android视频:http://www.fkjava.org/video.html


跳转到指定楼层
快速回复 返回顶部 返回列表