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、三层架构、事务管理)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程