Java Web实现转账案例(HTML、三层架构、事务管理)
2021/9/5 17:06:42
本文主要是介绍Java Web实现转账案例(HTML、三层架构、事务管理),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
一、需求:
二、思路:
三、搭建环境
数据库准备
页面展示
jar包、工具类导入,设置配置文件
四、代码实现
bean
Utils
dao 持久层
Service 业务层
web 表现层
一、需求:
按照用户录入信息实现转账业务V1
二、思路:
web层
获取请求参数(付款方、收款方、金额)
调用业务处理
结果响应
service层
处理业务
要点问题:1.如何使用JDBC处理事务?
2.如何保证使用同一个连接?
调用dao
dao层
操作数据库
三、搭建环境
数据库准备
-- 数据库的准备 create table account( id int primary key auto_increment, name varchar(20), money double ); insert into account values(null,'zs',1000); insert into account values(null,'ls',1000); insert into account values(null,'ww',1000);
页面展示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="post" action="transfer"> <table border="2px" width="250px" align="center"> <caption><font size="5">转账页面</font></caption> <tr> <td>付款方</td> <td><input type="text" name="Payer"></td> </tr> <tr> <td>收款方</td> <td><input type="text" name="Payee"></td> </tr> <tr> <td>金额</td> <td><input type="text" name="money"></td> </tr> <tr> <td colspan="2" align="right"> <input type="button" value="返回" style="background-color: darkgrey" align="left"> <input type="reset" style="background-color: darkgrey"> <input type="submit" style="background-color: darkgrey"> </td> </tr> </table> </form> </body> </html>
jar包、工具类导入,设置配置文件
四、代码实现
然后按照 bean-->Utils ---> Dao--->service--->Servlet 步骤实现代码
bean
public class Account { private String name; private double money; public Account() { } public Account(String name, double money) { this.name = name; this.money = money; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } @Override public String toString() { return "Account{" + "name='" + name + '\'' + ", money=" + money + '}'; } }
Utils
public class C3P0Utils { // 定义为一个私有静态的连接池常量 private static final ComboPooledDataSource DATA_SOURCE = new ComboPooledDataSource(); // 提供一个公共的静态方法获得连接池 public static DataSource getDataSource(){ return DATA_SOURCE; } // 提供一个公共的静态方法获得连接 public static Connection getConnection() throws SQLException { return DATA_SOURCE.getConnection(); } // 提供一个公共的静态方法释放资源 public static void release(ResultSet resultSet, Statement statement, Connection connection) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
/** * 同一线程中共用connection对象 */ public class MyConnectionUtils { private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>(); public static Connection getConnection() throws SQLException { //从ThreadLocal中获取connection对象 Connection connection = threadLocal.get(); if (connection == null) { //如果第一次获取的时候ThreadLocal中还没有存储connection对象,就将connection存入到ThreadLocal中 connection = C3P0Utils.getConnection(); threadLocal.set(connection); } return connection; } }
dao 持久层
根据转账逻辑,操作数据库。
public class TransferDao { /** * * @param Payer 付款方 * @param money 转账金额 * @return 数据库中受影响行数 * @throws SQLException */ public int reduceMoney(String Payer, Double money) throws SQLException { QueryRunner queryRunner = new QueryRunner(); String sql = "update account set money = money-? where name=?"; return queryRunner.update(MyConnectionUtils.getConnection(), sql, money, Payer); } /** * * @param Payer 付款方 * @return 付款方余额 * @throws SQLException */ public double balance(String Payer) throws SQLException { QueryRunner queryRunner = new QueryRunner(); String sql = "select * from account where name=?"; Account account = queryRunner.query(MyConnectionUtils.getConnection(), sql, new BeanHandler<>(Account.class), Payer); return account.getMoney(); } /** * * @param Payee 收款方 * @param money 转账金额 * @return 数据库中受影响行数 * @throws SQLException */ public int addMoney(String Payee, Double money) throws SQLException { QueryRunner queryRunner = new QueryRunner(); String sql = "update account set money = money+? where name=?"; return queryRunner.update(MyConnectionUtils.getConnection(), sql, money, Payee); } }
Service 业务层
分析:要将转账的钱增加和钱减少 两个操作封装成一个整体,同时处理。
解决:添加事务控制
事务可以将多个操作作为一个整体执行,操作同时成功,或者同时失败
事务使用:1.开启手动事务
2.执行操作
3.若操作成功,提交事务
若操作失败,回滚事务
进行事务控制,执行操作所有的connection连接对象要是同一个,ThreadLocal可解决。
public class TransferService { /** * * @param Payer 付款方 * @param Payee 收款方 * @param money 转账金额 * @return 数据库是否操作成功 * @throws SQLException */ public boolean transfer(String Payer, String Payee, Double money) throws SQLException { //在service中添加事务 确保增加和减少同时发生 Connection connection = MyConnectionUtils.getConnection(); //开启手动事务 connection.setAutoCommit(false); try { TransferDao transferDao = new TransferDao(); //获取付款方 数据库受影响行数 int rows1 = transferDao.reduceMoney(Payer, money); //获取付款方 数据库受影响后的余额 double balance = transferDao.balance(Payer); //添加异常测试 //int i=1/0; //获取收款方 数据库受影响行数 int rows2 = transferDao.addMoney(Payee, money); if (rows1 > 0 && rows2 > 0 && balance>0) { //转账成功 提交事务 connection.commit(); return true; } //转账失败 回滚事务 connection.rollback(); return false; } catch (Exception e) { e.printStackTrace(); //出现异常 回滚事务 connection.rollback(); return false; } } }
web 表现层
调用业务处理,响应结果
@WebServlet("/transfer") public class TransferServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //请求响应中文乱码处理 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //获取用户输入信息 String Payer = request.getParameter("Payer"); String Payee = request.getParameter("Payee"); double money = Double.parseDouble(request.getParameter("money")); //调用业务处理 TransferService transferService = new TransferService(); boolean flag = transferService.transfer(Payer, Payee, money); //结果响应 if (flag) { response.getWriter().print("转账成功!"); } else { response.getWriter().print("转账失败!"); } } catch (SQLException throwables) { throwables.printStackTrace(); response.getWriter().print("服务器异常!"); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
这篇关于Java Web实现转账案例(HTML、三层架构、事务管理)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南