java 级联删除_JavaEE中的级联删除讲解级源码
我们在做项目开发的时候,一定会遇到多个表之间相关联的情况,在这种情况下,我们如果想要删除其中的某个表中的数据,就要连同其他表中与之对应的数据删除。例如:我们设计一个客户表,一个订单表,一个订单明细表。在每个客户表中对应多个订单表,而每个订单表对应着多个订单明细表,当我们想要删除一个客户,那么我们就得把这个客户对应的订单表以及其对应的订单明细表一同删除,那么这是我们就用到了级联删除。
我们在使用级联删除时,
如果遇到多对一关系或者一对多关系时,我们应该先删除多的一方,然后在删除一的一方。如上例,当我们删出客户时应当先删除用户对应的所有订单表,而当删除订单表时我们又得先删除与之对应的所有订单明细表。所以我们就应该先删除订单明细表,再删除订单表最后删除客户。但我们在使用级联删除时我们应该将这些删除操作都包含在一个事务中,如果我们在操作中有一处不成功我们就得让事务回滚。如果全部成功我们才能提交事务,这样才能保证我们的级联删除成功,而且不会造成只删除部分数据。下面是我们编写的级联删除的代码部分:首先我们先封装俩个工具类这是线面几个类都得用的到达类:
数据库连接池: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 {
boolean insert(T entity);
boolean delete(T entity);
boolean deleteById(PK id);
boolean update(T entity);
T findById(PK id);
List findAll();
List findNowPageInfo(int nowpage,int pagesize,String
where);}//删除订单明细表中的数据//订单明细表dao层public interface OrderDetailsDao
extendsDao {
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
{
//获取与客户关联的订单
ListfindByCid(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);
// 第八步:释放资源
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
{
}//客户的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;
544627560
java 级联删除_JavaEE中的级联删除讲解级源码相关推荐
- 如何把UGUI当做一个插件使用(删除Unity中的UGUI,导入UGUI源码进入项目)
最近闲着没事,一直也都知道UGUI是开源的,所以就想着把UGUI的源代码放到Unity里面,看一看能不能用,经过一番调试,终于弄好了,有兴趣的同学可以看一下,欢迎交流沟通. 欲练神功,必先自宫.第一步 ...
- java usb摄像头_Android中多USB摄像头解决方案——UVCCamera源码分析(一)
前言 前段时间捣鼓多USB摄像头的方案,一阵手忙脚乱算是勉强跑起来了.整个流程主要还是依赖于网上大神们封装好的库.之前想仔细分析一下整套底层实现,然而一直拖到现在--也没有完全看完,于是想着干脆分阶段 ...
- c语言中怎样删除字符串中的字母,删除字符串中的字符(C语言)
题目: 编程序将给定字符串中指定字符删除.要求删除指定字符后原字符串不能留下空位置,字符串和指定字符均由键盘输入 基本思路 将字符串与要删除的字符进行比较,若为相同字符,则将字符串中的该字符替换为原字 ...
- java arraylist 常用方法_分享ArrayList中的几个常用方法的源码
jdk1.7.0_79 上文里解析了有关ArrayList中的几个常用方法的源码--<有关ArrayList常用方法的源码解析>,本文将对LinkedList的常用方法做简要解析. Lin ...
- Delphi:程序自己删除自己,适用于任何windows版本(含源码)
Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var sei: TSHELLEXECUTEINFO; szMod ...
- Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析
Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...
- java中的==、equals()、hashCode()源码分析(转载)
在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. == java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...
- Java定时任务(一) Timer及TimerTask的案例解析及源码分析
Java定时任务(一) Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...
- java毕业设计——基于Java+Socket的视频会议系统设计与实现(毕业论文+程序源码)——视频会议系统
基于Java+Socket的视频会议系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+Socket的视频会议系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下 ...
最新文章
- 微服务项目的整合与测试
- python进程间通信 listener_python进程间通信之Queue
- Linux修改/etc/profile配置错误command is not found自救方法
- iOS 7开发快速入门
- 北斗导航 | 卫星导航在动态监测中的应用(RTK)
- eclipse占用内存过大_MySQL 服务占用cpu 100%,如何排查问题? (MySQL面试第七弹)...
- 3 当某个应用的CPU使用达到100%,该怎么办?
- i-doIT 0.9.9-7发布 CMDB配置管理数据库
- Razor Page–Asp.Net Core 2.0新功能 Razor Page介绍
- SQL - waitfor delay/time(SQL中延迟时间的方法)
- 查看文件md5_软件推荐丨go-fastdfs——高性能、高可靠分布式文件系统
- win10启动项_win10 -- 取消不需要的开机启动项和服务项加快win10系统开机速度
- EMC测试仪器_智芯文库 | 单片机系统EMC测试和故障排除
- 圣诞祝福网页_圣诞营销H5的多种趣味玩法(案例+模板)
- List集合去重的常见几种方式
- 【Flink】(04)Apache Flink 漫谈系列 —— 实时计算 Flink 与 Alibaba Cloud Realtime Compute 剖析
- 黑群晖DSM 6.1网卡支持列表
- 【StyleGAN代码学习】StyleGAN损失函数与训练过程
- 为什么软件系统开发公司不会同意技术入股
- 行业解决方案】高速公路供配电监控系统-安科瑞 周莉娜
热门文章
- 通过机器视觉对PCB焊点缺陷检测
- [英语阅读]世界艾滋病日:进步与挑战并存
- python怎样画立体图-Python 竟能绘制出如此酷炫的三维图
- AE教程:如何在After Effects中创建一个闪烁的眼睛过渡
- OpenCV学习笔记(12):waitKey函数与Sleep函数的不同
- 三个数的排序常用方法
- 终于理解了什么是LGPL
- 配置使用豆瓣pip源
- 单片机全局有必要封装_从业将近十年!手把手教你单片机程序框架(连载)
- 计算机学院班群头像,【北工大表白墙】计算机类18级3班孙宇辰同学,你是广袤沙漠里的盐。...