银行账务转账系统(事务处理)

流程如下:在这里插入图片描述

创建项目工程如下:

在这里插入图片描述

transfer包下的代码如下:

package beyond.transfer.dao;import java.sql.Connection;
import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;import beyond.utils.DataSourceUtils;public class TransferDao {public void out(Connection conn,String out, double money) throws SQLException {QueryRunner runner = new QueryRunner();//不用穿参数//Connection conn = DataSourceUtils.getConnection();String sql = "update account set money= money-? where name=?";runner.update(conn, sql, money,out);}public void in(Connection conn,String in, double money) throws SQLException {QueryRunner runner = new QueryRunner();//不用穿参数//Connection conn = DataSourceUtils.getConnection();String sql = "update account set money= money+? where name=?";runner.update(conn, sql, money,in);}}
package beyond.transfer.service;import java.sql.Connection;
import java.sql.SQLException;import beyond.transfer.dao.TransferDao;
import beyond.utils.DataSourceUtils;public class TransferService {public boolean transfer(String out, String in, double money) {//创建dao层对象TransferDao dao = new TransferDao();boolean isTransferSuccess = true;Connection conn = null;try {//进行事务控制,开启事务conn = DataSourceUtils.getConnection();//不自动开启事务,也就是手动开启事务conn.setAutoCommit(false);//调用dao层的转出钱的方法,只需要知道 转钱的人是谁 跟 钱数 就行dao.out(conn,out,money);//调用dao层的转入钱的方法,只需要知道 转给谁 跟 钱数 就行dao.in(conn,in,money);} catch (SQLException e) {isTransferSuccess = false;try {//当出现事务错误,进行事务的回滚;回滚本身内部不包含提交的功能conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally{try {conn.commit();} catch (SQLException e) {e.printStackTrace();}}return isTransferSuccess;}}
package beyond.transfer.web;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import beyond.transfer.service.TransferService;public class TransferServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//接收转账的参数String out = request.getParameter("out");String in = request.getParameter("in");String moneyStr = request.getParameter("money");double money=Double.parseDouble(moneyStr);//进行将转账金额强转//调用业务层的转账方法TransferService service = new TransferService();boolean isTransferSuccess = service.transfer(out,in,money);//解决乱码问题response.setContentType("text/html;charset=UTF-8");if(isTransferSuccess){response.getWriter().write("转账成功!!!");}else{response.getWriter().write("转账失败!!!");}}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

transfer.jsp代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body><form action="${pageContext.request.contextPath}/transfer" method="post">传出账户:<input type="text" name="out"><br/>传入账户:<input type="text" name="in"><br/>转转金额:<input type="text" name="money"><br/><input type="submit" value="确认转账"><br/></form>
</body>
</html>

数据库创建如下:

CREATE TABLE `account` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(30) DEFAULT NULL,`money` double DEFAULT NULL,UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

dbutils包下代码如下:

package beyond.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {//通过jdbc去控制事务Connection conn = null;try {//1,注册驱动	Class.forName("com.mysql.jdbc.Driver");//2,获得connectionconn = DriverManager.getConnection("jdbc:mysql:///web19","root","wsq");//三个///代表本地一个端口//手动开启事务conn.setAutoCommit(false);//是否自动提交false,代表不自动提交也就是手动提交//3,获得操作数据库对象(执行平台)Statement stmt = conn.createStatement();//4,操作sql//stmt.executeUpdate("insert into account values(null,'zhangsan',3000)");int executeUpdate = stmt.executeUpdate("update account set money=5000 where name='sq'");//提交事务conn.commit();stmt.close();conn.close();} catch (Exception e) {try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}}
}

jdbc包下代码如下:

package beyond.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {//通过jdbc去控制事务Connection conn = null;try {//1,注册驱动	Class.forName("com.mysql.jdbc.Driver");//2,获得connectionconn = DriverManager.getConnection("jdbc:mysql:///web19","root","wsq");//三个///代表本地一个端口//手动开启事务conn.setAutoCommit(false);//是否自动提交false,代表不自动提交也就是手动提交//3,获得操作数据库对象(执行平台)Statement stmt = conn.createStatement();//4,操作sql//stmt.executeUpdate("insert into account values(null,'zhangsan',3000)");int executeUpdate = stmt.executeUpdate("update account set money=5000 where name='sq'");//提交事务conn.commit();stmt.close();conn.close();} catch (Exception e) {try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}}
}

utils包下代码如下:

package beyond.utils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class DataSourceUtils {private static DataSource dataSource = new ComboPooledDataSource();private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();// 直接可以获取一个连接池public static DataSource getDataSource() {return dataSource;}public static Connection getConnection() throws SQLException{return dataSource.getConnection();}// 获取连接对象public static Connection getCuruentConnection() throws SQLException {Connection con = tl.get();if (con == null) {con = dataSource.getConnection();tl.set(con);}return con;}// 开启事务public static void startTransaction() throws SQLException {Connection con = getCuruentConnection();if (con != null) {con.setAutoCommit(false);}}// 事务回滚public static void rollback() throws SQLException {Connection con = getCuruentConnection();if (con != null) {con.rollback();}}// 提交并且 关闭资源及从ThreadLocall中释放public static void commitAndRelease() throws SQLException {Connection con = getCuruentConnection();if (con != null) {con.commit(); // 事务提交con.close();// 关闭资源tl.remove();// 从线程绑定中移除}}// 关闭资源方法public static void closeConnection() throws SQLException {Connection con = getCuruentConnection();if (con != null) {con.close();}}public static void closeStatement(Statement st) throws SQLException {if (st != null) {st.close();}}public static void closeResultSet(ResultSet rs) throws SQLException {if (rs != null) {rs.close();}}}

c3p0-config.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><default-config><property name="user">root</property><property name="password">wsq</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql:///web19</property></default-config> 
</c3p0-config> 

需要的一系列的jar包如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【msdn wpf forum翻译】TextBox中文本 中对齐 的方法

原文链接&#xff1a;http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/49864e35-1dbf-4292-a361-93f1a8400558问题&#xff1a;TextBox中文本中对齐&#xff0c;使用 TextBox.HorizontalContentAlignment"Center"行不通&#xff08;TextBox.VerticalConte…

wifi操作及实例

1.什么事WIFI 利用无线路由器上网的协议2.获取WIFI网卡的状态 WIFI网卡的状态是由一系列的整形常量来表示的 有状态&#xff1a; 网卡不可用WIFI_STATE_DISABLED 对应值为1 网卡正在关闭WIFI_STATE_DISABLING 对应值为0 网卡可用WIFI_STATE_ENABLED 对应的值为3 …

c语言 函数的参数传递示例_C语言中带有示例的remove()函数

c语言 函数的参数传递示例C语言中的remove()函数 (remove() function in C) The remove() function is defined in the <stdio.h> header file. remove()函数在<stdio.h>头文件中定义。 Prototype: 原型&#xff1a; int remove(const char* filename);Parameter…

使用ThreadLocal绑定连接资源(事务)

dao层代码如下&#xff1a; package beyond.transfer.dao;import java.sql.Connection; import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;import beyond.utils.DataSourceUtils; import beyond.utils.MyDataSourceUtils;public class TransferDa…

算法---栈和队列

栈和队列1 栈栈的顺序存储栈的链式存储2 队列队列的顺序存储队列的链式存储3 栈和队列的应用用栈实现队列用队列实现栈最小栈1 栈 参考文章&#xff1a; https://zhuanlan.zhihu.com/p/346164833 https://zhuanlan.zhihu.com/p/120965372#:~:text%E6%A0%88%E6%98%AF%E4%B8%80%…

学习网站LIST

面向对象的脚本语言Rubyhttp://rubycn.ce-lab.net/20020101.htmlRUBY文档中心http://www.moer.net/ruby/doc/TCL脚本http://www.tclchina.com/Python快速入门http://wiki.woodpecker.org.cn/moin/WeiZhong/2006-01-17Python 研究(Dive Into Python)http://www.woodpecker.org.c…

再次参加(第七届)商学院徒步戈壁挑战赛,赋词几首

2012年5月21-25日&#xff0c;再次踏上甘肃莫贺延碛戈壁&#xff0c;参加第七届商学院徒步戈壁挑战赛。时隔五年&#xff0c;时空转换。 少年游 ——戈壁缘 江南物华&#xff0c;远水碧山&#xff0c;灯火相掩映。暮宴朝欢&#xff0c;酒绿灯红&#xff0c;踯躅夜归人。 孤城落…

Java StackTraceElement toString()方法与示例

StackTraceElement类的toString()方法 (StackTraceElement Class toString() method) toString() method is available in java.lang package. toString()方法在java.lang包中可用。 toString() method is used to represent stack trace element as a string or in other word…

增删改查

web层代码如下&#xff1a; package beyondwsq.web;import java.io.IOException; import java.sql.SQLException; import java.util.List;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; imp…

在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件

引言 这两天沉迷了Google SketchUp&#xff0c;刚刚玩够&#xff0c;一时兴起&#xff0c;研究了一下WebBrowser。 我在《WebBrowser控件使用技巧分享》一文中曾谈到过“我现在可以通过WebBrowser实现对各种Html元素的操控&#xff0c;唯独无法控制Html的上传控件”&#xff0c…

编写最简单的字符设备驱动

编写最简单的字符设备驱动1 编写驱动代码2 编写makefile3 编译和加载驱动4 编写应用程序测试驱动参考文章&#xff1a; linux驱动开发第1讲&#xff1a;带你编写一个最简单的字符设备驱动 linux驱动开发第2讲&#xff1a;应用层的write如何调用到驱动中的write 1 编写驱动代码…

Java ObjectStreamField toString()方法与示例

ObjectStreamField类toString()方法 (ObjectStreamField Class toString() method) toString() method is available in java.io package. toString()方法在java.io包中可用。 toString() method is used to return a string that defines this field. toString()方法用于返回定…

linux内核文件描述符fd、文件索引节点inode、文件对象file关系

文件描述符fd、文件索引节点inode、文件对象file关系1 VFS对象1.1 超级块对象1.2 索引节点对象1.3 文件对象1.4 进程描述符1.5 files_struct2 如何根据文件描述符fd找到文件&#xff1f;1 VFS对象 在说fd、inode和file关系之前&#xff0c;我们先了解VFS的几个概念。分别是进程…

sql2005 获取表字段信息和视图字段信息

获取表字段名,和字段说明SELECT[Table Name]OBJECT_NAME(c.object_id), [ColumnName]c.name, [Description]ex.value FROMsys.columns c LEFTOUTERJOINsys.exte…

解析css之position

CSS的很多其他属性大多容易理解&#xff0c;比如字体&#xff0c;文本&#xff0c;背景等。有些CSS书籍也会对这些简单的属性进行大张旗鼓的介绍&#xff0c;而偏偏忽略了对一些难缠的属性讲解&#xff0c;有避重就轻的嫌疑。CSS中主要难以理解的属性包括盒型结构&#xff0c;以…

Java ObjectInputStream readLong()方法(带示例)

ObjectInputStream类readLong()方法 (ObjectInputStream Class readLong() method) readLong() method is available in java.io package. readLong()方法在java.io包中可用。 readLong() method is used to read 8 bytes (i.e. 64 bit) of long value from this ObjectInputSt…

交换瓶子(蓝桥杯)

有N个瓶子&#xff0c;编号 1 ~ N&#xff0c;放在架子上。 比如有5个瓶子&#xff1a; 2 1 3 5 4 要求每次拿起2个瓶子&#xff0c;交换它们的位置。 经过若干次后&#xff0c;使得瓶子的序号为&#xff1a; 1 2 3 4 5 对于这么简单的情况&#xff0c;显然&#xff0c;至少…

Linux设备驱动开发---字符设备驱动程序

字符设备驱动程序1 主设备和次设备的概念设备号的注册和释放静态方法动态方法区别2 设备文件操作struct file_operations与struct file、struct inode关系3 分配和注册字符设备class_createcdev_adddevice_create4 字符设备驱动程序字符设备通过字符&#xff08;一个接一个的字…

Java LinkedHashMap getOrDefault()方法与示例

LinkedHashMap类的getOrDefault()方法 (LinkedHashMap Class getOrDefault() method) getOrDefault() method is available in java.util package. getOrDefault()方法在java.util包中可用。 getOrDefault() method is used to get the value associated with the given key el…

Java中的异常栈轨迹和异常链

Java中允许对异常进行再次抛出&#xff0c;以提交给上一层进行处理&#xff0c;最为明显的例子为Java的常规异常。 常规异常&#xff1a;有Java所定义的异常&#xff0c;不需要异常声明&#xff0c;在未被try-catch的情况下&#xff0c;会被默认上报到main()方法。 Example: pu…