Service业务逻辑层

article/2025/8/20 11:56:52

就是功能实现
例:Account类要求编写业务逻辑层AccountServiceImpl类实现一个转账功能
先定义DBUtils类封装数据库连接代码、定义Account类、定义PersonDao类提供增删改查方法

public class AccountServiceImpl{public static void transfer(int fromId,String pwd,int toId,double money){//判断转账的用户id和密码是否正确//定义DBUtils类封装数据库连接代码、定义Account类、定义PersonDao类提供增删改查方法PersonDao personDao = new PersonDao();Account account = null;account = personDao.select(fromid);if(account==null){throw new RuntimeException("卡号错误");}if(account.getPassword()!=pwd){throw new RuntimeException("密码错误");}Account account1 = null;account1 = personDao.select(toId);if(account2==null){throw new RuntimeException("对方卡号不存在");)if(account.getBalance()<money){throw new RuntimeException("你的余额不足");}account.setBalance(account.getBalance() - money);personDao.Update(account);account1.setBanlance(account.getBalance() + money);personDao.Update(account1); }
}

以上代码在出错后不可逆,所以需要事务控制,当报错后,对数据库的内容修改回到初始态

1. Service层实现控制事务:(案例中余额减少出现异常情况)

获得连接对象:
设置当前事务的自动提交为手动提交,开启事务
connection.setAutoCommit(false);//false参数即关闭自动提交
connection.commit();//提交事务
connection.rollback();//回滚
关闭connection问题:
解决方法1:传递connection
缺点:不能复用,容易造成接口污染
解决方法2:ThreadLocal:
单线程中,存储一个共享值
线程拥有一个类似Map的属性,键值对结构<ThreadLocal对象,值>
一个共享同一个ThreadLocal,在整个流程中任一环节可以存值或取值。

2. 利用ThreadLocal重写DBUtils并封装事务

1. ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
利用ThreadLocal类的get()和set()方法,如果connection==null,则threadLocal.set(DriverManager.getConnection)
使我们拿到的connection为同一个

2. 因为connection是连接数据库的,所以不能把connection的事务控制继续写在Service层,由于connection是在DBUtils里面拿到的,所以应该封装到DBUtils里面
3. 把Dao层的增删改查方法中的closeAll()方法中的形参Connection connection全部设置为空
4. ThreadLocal里面的ThreadLocalMap集合里面的key值是弱引用(key值是当前的threadLocal对象,value就是connection),会造成内存泄漏,所以每次关闭连接以后,通过threadLocal.remove把通过set方法放到ThreadLocalMap集合的connection移除

  • 在这里插入图片描述
public class DBUtils{public static final Properties PROPERTIES = new Proerties();private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();static{InputStream is = DBUtils.class.getResourceAsStream("database.properties");PROPERTIES.load(is);class.forName(PROPERTIES.getProperties("driver"));}public static Connection getConnection(){Connection connection = threadLocal.get();if(conncetion==null){connection = DriverManager.getConnection(PROPERTIES.getProperties("url"),PROPRETIES.getProperties("user"),PROPERTIES.getProperties("password"));threadLocal.set(connection);}return connection;}public static void begin() {try {Connection connection = getConnection();connection.setAutoCommit(false);} catch (SQLException e) {e.printStackTrace();}}public static void commit(){Connection connection = null;try {connection = getConnection();connection.commit();} catch (SQLException e) {e.printStackTrace();} finally {CloseAll(connection,null,null);}}public static void rollback() throws SQLException {Connection connection = null;try {connection = getConnection();connection.rollback();} catch (SQLException e) {e.printStackTrace();} finally {CloseAll(connection,null,null);}}//把Dao层的增删改查方法中的closeAll()方法中的形参Connection connection全部设置为空public static void closeAll(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){if(connection!=null){try {connection.close();threadLocal.remove();//关闭连接后,移除connection对象} catch (SQLException e) {e.printStackTrace();}}if(preparedStatement!=null){try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}}
}

3. 把重写过的DBUtils控制事务方法添加到Service业务逻辑层的方法中

DBUtils.begin();//写在transfar()方法的开头
DBUtils.commit();//写在transfar()方法结尾
DBUtils.rollback;//写在trycatch中的catch代码里面

在这里插入图片描述


http://chatgpt.dhexx.cn/article/hTU2DVto.shtml

相关文章

业务逻辑详解

不同的项目有不同的功能&#xff0c;不同的功能需要不同的实现&#xff0c;实现这些核心功能的代码就叫业务逻辑 比如让你实现一个功能&#xff0c;给你两个数&#xff0c;让你获取它的和&#xff0c;你所写的如何才能获得任意给定的两个数的和&#xff0c;这个程序实现过程即可…

业务逻辑漏洞

业务逻辑漏洞定义&#xff1a; 业务逻辑漏洞是指由于程序逻辑不严谨或逻辑太复杂&#xff0c;导致一些逻辑分支不能正常处理或处理错误。 业务逻辑漏洞特性&#xff1a; 业务逻辑漏洞只出现于业务流程中&#xff08;模块功能&#xff09;&#xff0c;也就是说网站的部分都有…

业务逻辑漏洞总结

一、漏洞简介 业务逻辑漏洞产生的最核心原因&#xff0c;就是在编写程序时&#xff0c;只考虑了常规的操作流程&#xff0c;即“当在A情况下&#xff0c;就会出现B&#xff0c;此时执行C即可”&#xff0c;但是开发者却没有考虑当用户执行了意料之外的X时会发生什么。这种对于…

前端业务逻辑

前端业务逻辑 1-关于全选和非全选 Vue3环境下运用ant-design-vue框架 展示效果 全选 非全选 业务逻辑 1、数据结构data const state reactive({cart: , // 购物车信息ids: [], // 删除购物车单个商品的idcartNum: , // 购物车数量checkAll: false, // 是否处于全选状态c…

java业务逻辑_java业务逻辑怎么写?

现在Java项目一般都是用Spring全家桶开发&#xff0c;以web项目来讲结构主要分为Controller层、Service层和DAO层&#xff0c;细分的话有的项目可能还会有一个Manager层。 一个请求到达后端之后会根据请求的路径找到对应的Controller&#xff0c;Controller会调用相应的业务Ser…

什么是业务逻辑?

不同的项目有不同的功能&#xff0c;不同的功能需要不同的实现&#xff0c;实现这些核心功能的代码就叫业务逻辑 比如让你实现一个功能&#xff0c;给你两个数&#xff0c;让你获取它的和&#xff0c;你所写的如何才能获得任意给定的两个数的和&#xff0c;这个程序实现过程即可…

业务逻辑之终极分析

细说业务逻辑 前言 记得几个月前&#xff0c;在一次北京博客园俱乐部的活动上&#xff0c;最后一个环节是话题自由讨论。就是提几个话题&#xff0c;然后大家各自加入感兴趣的话题小组&#xff0c;进行自由讨论。当时金色海洋同学提出了一个话题——“什么是业务逻辑”。当…

Linux中tar命令用法

tar命令&#xff1a;主要用于压缩和解压缩。 tar命令有两种压缩格式 &#xff1a; 1、 gzip格式&#xff1a; 1&#xff09;、压缩 压缩用法&#xff1a; tar gcvf (压缩包名)文件1 文件2 一般压缩包包名以 .tar.gz作为后缀名&#xff0c;压缩完成之后保留原文件。 压缩前…

linux中tar命令的用法

linux下最常用的打包程序就是tar了&#xff0c;使用tar程序打出来的包我们常称为tar包&#xff0c;tar包文件的命令通常都是以.tar结尾的。生成tar包后&#xff0c;就可以用其它的程序来进行压缩。 1&#xff0e;命令格式&#xff1a; tar[必要参数][选择参数][文件] 2&…

Linux中tar命令

tar命令是类Linux中比价常用的解压与压缩命令。 可以使用命令 (man tar) 命令来进行查看man的基本命令。下面举例说明一下tar 的基本命令。 #tar -cvf sysconfig.tar /etc/sysconfig 命令解释&#xff1a;将目录/etc/sysconfig/目录下的文件打包成文件sysconfig.tar文…

linux-tar命令

tar命令 1. 压缩格式的介绍2. tar命令格式3. tar命令及选项的使用4. zip和unzip命令及选项的使用5.常见解压/压缩命令巨人肩膀 1. 压缩格式的介绍 Linux默认支持的压缩格式: .gz.bz2.zip 说明: .gz和.bz2的压缩包需要使用tar命令来压缩和解压缩.zip的压缩包需要使用zip命令…

tar命令集合(详解)

tar 命令可以将许多文件一起保存至一个单独的磁带或磁盘归档&#xff0c;并能从归档中单独还原所需文件。 示例 以test文件为例 压缩命令 tar -cvf test.tar test test1解压命令 tar -xvf test.tar主操作模式: -A, --catenate, --concatenate 追加 tar 文件至归档 -c, --…

GBDT原理

梯度提升树的使用 GBDT算法流程 GBDT流程 输入&#xff1a;训练数据集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } D\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots,\left(x_{N}, y_{N}\right)\right\} D{(x1​,y1​),(x2​,y2​),……

GBDT总结

一&#xff1a;声明 本文基本转自刘建平先生的该篇文章&#xff0c;原文写的很好&#xff0c;读者可以去看看。本文中&#xff0c;作者将根据自己实际项目和所学结合该文章&#xff0c;阐述自己的观点和看法。 二&#xff1a;GBDT概述 GBDT也是集成学习Boosting家族的成员&a…

GBDT模型

GBDT&#xff08;Gradient Boosting Decision Tree&#xff0c;梯度提升树&#xff09;属于一种有监督的集成学习算法&#xff0c;与前面几章介绍的监督算法类似&#xff0c;同样可用于分类问题的识别和预测问题的解决。该集成算法体现了三方面的优势&#xff0c;分别是提升Boo…

GBDT模型详解

GBDT算法 GBDT&#xff08;Gradient Boosting Decision Tree&#xff09;&#xff0c;全名叫梯度提升决策树&#xff0c;是一种迭代的决策树算法&#xff0c;又叫MART&#xff08;Multiple Additive Regression Tree&#xff09;&#xff0c;它通过构造一组弱的学习器&#xf…

机器学习之集成学习:GBDT

目录 一、什么是GBDT 二、GBDT的理解 2.1、GBDT通俗解释 2.2、GBDT详解 三、GBDT的应用 3.1、二分类问题 3.2、多分类问题 3.3、回归问题 四、GBDT如何选择特征 五、GBDT优缺点 一、什么是GBDT GBDT&#xff0c;Gardient Boosting Decision Tree&#xff0c;梯度…

传统机器学习笔记7——GBDT模型详解

目录 前言一.GBDT算法1.1.Boosting1.2.GDBT1.2.1.GBDT与负梯度近似残差1.2.2.GDBT训练过程 二.梯度提升与梯度下降三.GDBT模型优缺点四.GDBT vs 随机森林 前言 上篇博文我们介绍了关于回归树模型的基本知识点&#xff0c;有不懂的小伙伴可以回到前面再看下&#xff0c;传统机器…

机器学习集成学习——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

系列文章目录 机器学习神经网络——Adaboost分离器算法 机器学习之SVM分类器介绍——核函数、SVM分类器的使用 机器学习的一些常见算法介绍【线性回归&#xff0c;岭回归&#xff0c;套索回归&#xff0c;弹性网络】 文章目录 系列文章目录 前言 一、GBDT(Gradient Boos…

移动端UI框架大比拼

1、vonic vonic是一个基于 vue.js 和 ionic 样式的 UI 框架&#xff0c;用于快速构建移动端单页应用 onic 依赖以下几个库&#xff0c;在创建 vonic 项目之前&#xff0c;请确保引入它们。 vue.js vue-router.js axios.js (vue.js 官方推荐的 ajax 方案) 中文文档 在线预览 …