【JDBC】实现JDBC实现银行的转账事务

JDBC中的事务是默认提交的,也就是说每执行一次PreparedStatement,那么数据就会被写入到磁盘。如果需要关闭默认提交,使用  void setAutoCommit(false)  .

db.properties

driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=system
password=517839

db.properties

JDBCUtilProperties.java

package com.xdl.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtilProperties {
    public  static   String   driverClassName;
    public  static   String   url;
    public  static   String   username;
    public  static   String   password;
    static {
        try {
            // 读取 db.properties 文件 ,路径是相对于项目的路径
            InputStream  inputStream = JDBCUtilProperties.class.getClassLoader().
                getResourceAsStream("com/xdl/util/db.properties");
            /* Properties  就是一个key value 结构  */
            Properties  pro = new Properties();
            try {
                pro.load(inputStream);
                driverClassName = pro.getProperty("driverClassName");
                url = pro.getProperty("url");
                username = pro.getProperty("username");
                password = pro.getProperty("password");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Class.forName(driverClassName);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /* 获取数据库 连接的方法  */
    public  static  Connection   getConnection(){
        Connection  conn  = null;
        try {
            conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return  conn;
    }
    /* 释放资源的方法  */
    public  static  void  releaseResource(Connection conn,Statement st,ResultSet rs){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                rs = null;
            }
        }
        if(st != null){
            try {
                st.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                st = null;
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                conn = null;
            }
        }
    }
}

JDBCUtilProperties.java

Test.java

package com.xdl.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.xdl.util.JDBCUtilProperties;

public class Test {
    /* 转账的案例
       create  table   bankAccount(
           id   number  primary key,
           name  varchar2(30),
           money   number);
       insert  into  bankAccount values(1,‘name1‘,10000000);
       insert  into  bankAccount values(2,‘name2‘,10000000);
       commit;
     */
    public  static void   test(){
        // 1.获取连接
        Connection   conn  = null;
        PreparedStatement   ps = null;
        PreparedStatement   ps2 = null;
        conn = JDBCUtilProperties.getConnection();
        try {
            //关闭自动提交
            conn.setAutoCommit(false);
            double  m = 1000000;
            //从name1账户中扣钱
            ps = conn.prepareStatement
               ("update bankaccount set money=money-? where id=1 and name=‘name1‘");
            ps.setDouble(1, m);
            //得到影响的行数
            int rows = ps.executeUpdate();
            //往name2账户中加钱
            ps2 = conn.prepareStatement
                ("update bankaccount set money=money+? where id=2 and name=‘namw2‘");
            ps2.setDouble(1, m);
            //得到影响的行数
            int rows2 = ps2.executeUpdate();
            //如果两个语句得到影响行数都是1,那么提交事务
            if(rows == 1 && rows2 == 1 ){
                System.out.println("转账成功");
                conn.commit();
            }else{
                //若不满足条件,则对两个语句回归
                System.out.println("转账失败");
                conn.rollback();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            try {
                conn.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JDBCUtilProperties.releaseResource(conn, ps, null);
            JDBCUtilProperties.releaseResource(conn, ps2, null);
        }
    }
    public static void main(String[] args) {
        test();
    }

}

Test.java

时间: 2024-12-11 16:46:35

【JDBC】实现JDBC实现银行的转账事务的相关文章

有关jdbc以及JDBC事务的相关操作

有关jdbc及jdbc事务的操作 一,什么是JDBC *Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法.JDBC也是Sun Microsystems的商标.我们通常说的JDBC是面向关系型数据库的. --以上来自百度百科.* 二,JDBC的本质 本质上jdbc就是一套接口,我们需要面向接口编程,而不是面向具体的类,达到解耦合的目的,各大数据库厂商 如

jsp+servlet+mysql 实现简单的银行登录转账功能

jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从一个登录页面开始(利用表单提交,action="jsp实现页面")第一步:在(mysql)数据库中建表:建立一个用户的基本信息表(用户姓名,密码,账户余额),用户转账(用户名,转账金额)的操作表第二步:登录页面:输入用户名和密码对数据库中的用户信息(login.jsp)进行验证(qq浏览器

Jmeter JDBC Request--sqlserver JDBC驱动配置相关

1.做JDBC请求,首先要了解这个JDBC对象是什么,现在已SQLServer为例来说明 首先下载对应的数据库驱动,我已经上传到我的网盘中了,请各位直接下载,不用再在csdn用积分下载了. 地址:http://yunpan.cn/QaEjwXyXFrA5H (提取码:1f35) 注意:下载完成后,直接把sqljdbc4.zip改为jar的后缀名.然后放到放在apache-jmeter-2.6\lib下面. 2.至于创建Jmeter工程这里不再详述,直接参看下图(添加配置元件 JDBC Conne

28Spring_的事务管理_银行转账业务加上事务控制_基于注解进行声明式事务管理

将applicationContext.xml 和 AccountServiceImpl 给备份一个取名为applicationContext2.xml 和 AccountServiceImpl2.java 第一步:配置事务管理器 第二步:配置注解驱动 以上两步是在ApplicationContext2.xml中完成的. 内容如下所示: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo

27Spring_的事务管理_银行转账业务加上事务控制_基于tx.aop进行声明式事务管理

上一篇文章中,银行转账业务没有使用事务,会出现问题,所以这篇文章对上篇文章出现的问题进行修改. 事务 依赖 AOP , AOP需要定义切面, 切面由Advice(通知) 和 PointCut(切点) 组成 ! 项目结构图: 这个案例和前一篇文章的案例是一样的,我们修改的其实只是ApplicationContext.xml文件,其他代码不会变所以这里就不多做解释了. 直接给出ApplicationContext.xml代码.里面的注释好好看一下. <?xml version="1.0&quo

Spring AOP 事务配置(实现转账事务)

1. 事务特性 事务特性:ACID 原子性:整体 [原子性是指事务包含的所有操作要么全部成功,要么全部失败] 一致性:数据 [一个事务执行之前和执行之后都必须处于一致性状态] 隔离性:并发 [对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行.] 持久性:结果 [持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的] 隔离问题 脏读:一个事务读到另一个事务未提交的内容[读取未

JDBC—01—JDBC简介;JDBC常用接口与类;

一. JDBC 简介 1 什么是 JDBC JDBC(Java DataBase Connectivity)java 数据库连接 是 JavaEE 平台下的技术规范 定义了在 Java 语言中连接数据,执行 SQL 语句的标准(标准即是接口:) 可以为多种关系数据库提供统一访问 2 什么是数据库驱动程序 数据库厂商对 JDBC 规范的具体实现,是接口的实现类: 不同数据产品的数据库驱动名字有差异 在程序中需要依赖数据库驱动来完成对数据库的操作 3 程序操作数据库流程 定义了在 Java 语言中连

读取JDBC配置文件jdbc.properties碰到的问题

这里 查询要读取jdbc.properties配置文件,采取类加载器转换流来读取, 类名调用.   而 jdbc.properties位置一定要放在src下面.否则会报找不到的错误

初学JDBC,JDBC工具类的简单封装

//工具类不需要被继承 public final class JdbcUtils{ //封装数据库连接参数,便于后期更改参数值 private static String url="jdbc:mysql://localhost:3306/jdbc"; private static String user="userName"; private static String password="password"; //无需被创建对象 private