Java基于JDBC实现事务,银行转账及货物进出库功能示例

本文实例讲述了Java基于JDBC实现事务,银行转账及货物进出库功能。分享给大家供大家参考,具体如下:

1. 转账业务

转账必须执行2个sql语句(update更新)都成功的情况下,提交事务,如果有一个失败,则2个都回滚事务

2. 事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

① 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
② 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
③ 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
④ 持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

3. 这里以转账操作为案例进行演示说明,其注意点如下:

(1)一个sql语句操作不需要手动提交事务

(2)查询操作也不需要手动提交事务,

(3)但是更新,插入,删除都需要手动提交事务

(4)余额为负的可以先查询出结果再进行判断,然后再操作

(5)con.setAutoCommit(false);手动开启事务;con.commit();手动提交事务;con.rollback();事务回滚操作

4. 首先创建一个数据表或者两个数据表,这里为了演示清楚创建两个数据表

5. 创建好数据库和数据表,然后进行工具类的书写BaseDao.java

package com.bie.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @author BieHongLi
* @version 创建时间:2017年2月27日 上午10:09:00
* 连接数据库的工具类
*/
public class BaseDao {
  private static String driver="com.mysql.jdbc.Driver";
  private static String url="jdbc:mysql:///test";
  private static String user="root";
  private static String password="123456";
  /***
   * 连接数据库的方法
   * @return
   * @throws ClassNotFoundException
   * @throws SQLException
   */
  public static Connection getCon() throws ClassNotFoundException, SQLException{
    Class.forName(driver);//加载数据库驱动
    System.out.println("测试加载数据库成功");
    Connection con=DriverManager.getConnection(url, user, password);
    System.out.println("测试数据库链接成功");
    return con;
  }
  /***
   * 关闭数据库的方法
   * @param con
   * @param ps
   * @param rs
   */
  public static void close(Connection con,PreparedStatement ps,ResultSet rs){
    if(rs!=null){//关闭资源,避免出现异常
      try {
        rs.close();
      } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    if(ps!=null){
      try {
        ps.close();
      } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    if(con!=null){
      try {
        con.close();
      } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
  /***
   * 同意增删改的方法
   * @param sql
   * @param arr
   * @return
   */
  public static boolean addUpdateDelete(String sql,Object[] arr){
    Connection con=null;
    PreparedStatement ps=null;
    try {
      con=BaseDao.getCon();//第一步 :连接数据库的操作
      ps=con.prepareStatement(sql);//第二步:预编译
      //第三步:设置值
      if(arr!=null && arr.length!=0){
        for(int i=0;i<arr.length;i++){
          ps.setObject(i+1, arr[i]);
        }
      }
      int count=ps.executeUpdate();//第四步:执行sql语句
      if(count>0){
        return true;
      }else{
        return false;
      }
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return false;
  }
  /*public static void main(String[] args) {
    try {
      BaseDao.getCon();
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }*/
}

6. 这里直接在主方法里面进行了测试,所以写了UserDao进行测试,看效果即可。

package com.bie.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.bie.utils.BaseDao;
/**
* @author BieHongLi
* @version 创建时间:2017年2月27日 下午3:19:49
*
*/
public class UserDao {
  /***
   * 注意点:
   *   (1)一个sql语句操作不需要手动提交事务
   *   (2)查询操作也不需要手动提交事务,
   *   (3)但是更新,插入,删除都需要手动提交事务
   *  (4)余额为负的可以先查询出结果再进行判断,然后再操作
   * @param args
   */
  public static void main(String[] args) {
    Connection con=null;
    PreparedStatement ps1=null;
    PreparedStatement ps2=null;
    try {
      //第一步:连接数据库的操作
      con=BaseDao.getCon();
      //默认自动提交事务,所以默认是true,现在将true改为false,禁止默认自动提交事务
      //con.setAutoCommit(true);
      //事务1:如果设置为false,则需要手动提交事务
      con.setAutoCommit(false);
      //第二步:更新的sql语句
      String sql="update bank_a set usera_rmb=usera_rmb-500 where usera_id=1 ";
      String sql2="update bank_b set userb_rmb=userb_rmb+500 where userb_id=1 ";
      //第三步:预编译sql
      ps1=con.prepareStatement(sql);
      //第四步:执行sql语句,虽然执行了sql,但是还没持久化更新到数据库
      ps1.executeUpdate();
      //第三步:预编译sql2
      ps2=con.prepareStatement(sql2);
      //第四步:执行sql2,虽然执行了sql2,但是还没持久化更新到数据库
      ps2.executeUpdate();
      System.out.println("转账成功...");
      //事务2:手动提交事务,如果两个都执行成功了,那么提交事务
      con.commit();
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      try {
        //事务3:如果抛出异常,那么回滚事务
        con.rollback();
      } catch (SQLException e1) {
        e1.printStackTrace();
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }finally {
      //关闭资源,避免出现异常
      BaseDao.close(con, ps1, null);
      BaseDao.close(null, ps2, null);
    }
  }
}

演示效果如下所示:

更多关于java相关内容感兴趣的读者可查看本站专题:《Java使用JDBC操作数据库技巧总结》、《Java+MySQL数据库程序设计总结》、《Java数据结构与算法教程》、《Java文件与目录操作技巧汇总》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java校验银行卡是否正确的核心代码

    多说无益,贴代码: /** * 校验银行卡卡号 * * @param cardId * @return */ public static boolean checkBankCard(String cardId) { char bit = getBankCardCheckCode(cardId .substring(0, cardId.length() - 1)); return cardId.charAt(cardId.length() - 1) == bit; } /** * 从不含校验位的银

  • 以银行取钱为例模拟Java多线程同步问题完整代码

    简单了解下在操作系统中进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行.首先存钱取钱的这个操作,应该是线程操作的

  • Java与Oracle实现事务(JDBC事务)实例详解

    Java与Oracle实现事务(JDBC事务)实例详解 J2EE支持JDBC事务.JTA事务和容器事务事务,这里说一下怎样实现JDBC事务. JDBC事务是由Connection对象所控制的,它提供了两种事务模式:自己主动提交和手动提交,默认是自己主动提交. 自己主动提交就是:在JDBC中.在一个连接对象Connection中.默认把每一个SQL语句的运行都当做是一个事务(即每次运行完SQL语句都会马上将操作更新到数据库). 手动提交就是:当须要一次性运行多个SQL语句,将多个SQL语句组成一个

  • 详解Java的JDBC API中事务的提交和回滚

    如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关闭自动提交和管理自己的事务: 为了提高性能 为了保持业务流程的完整性 使用分布式事务 若要控制事务,以及何时更改应用到数据库.它把单个SQL语句或一组SQL语句作为一个逻辑单元,而且如果任何语句失败,整个事务失败. 若要启用,而不是JDBC驱动程序默认使用auto-commit模式手动事务支持,使用Connection对象的的setAutoComm

  • 在Java的JDBC使用中设置事务回滚的保存点的方法

    新的JDBC3.0保存点的接口提供了额外的事务控制.他们的环境中,如Oracle的PL/ SQL中的大多数现代的DBMS支持保存点. 当设置一个保存点在事务中定义一个逻辑回滚点.如果发生错误,过去一个保存点,则可以使用rollback方法来撤消要么所有的改变或仅保存点之后所做的更改. Connection对象有两个新的方法,可帮助管理保存点: setSavepoint(String savepointName): 定义了一个新的保存点.它也返回一个Savepoint 对象. releaseSav

  • Java中JDBC事务与JTA分布式事务总结与区别

    Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务.常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现.所以本文暂不讨论容器事务.本文主要介绍J2EE开发中两个比较基本的事务:JDBC事务和JTA事务. JDBC事务 JDBC的一切行为包括事务是基于一个Connection的,在JDBC中是通过Connection对象进行事务管理.在JDBC中,

  • 深入解析Java中的JDBC事务

    事务 事务是一步或多步组成操作序列组成的逻辑执行单元,这个序列要么全部执行,要么则全部放弃执行.事务的四个特性:原子性(Atomicity).一致性(Consistency).隔离性(IsoIation)和持续性(Durability)原子性(Atomicity):事务应用最小的执行单元,不可再分.是事务中不可再分的最小逻辑执行体. 一致性(Consistency):事务的执行结果,必须使数据库的从一个一致性的状态变到另一个一致性的状态. 隔离线(IsoIation):各个事务的执行互不干扰,任

  • Java 模拟银行自助终端系统

    一. 本系统模拟银行用户使用ATM机开户.查询.存款.取款功能,要求使用java语言编程实现. 说明: 1. 对于数据输入异常,可使用java异常处理机制进行处理. 2. 评分将以功能实现与代码规范性相结合的方式进行考核. 3. 如果对项目需求有疑问,可以随时以QQ留言方式联系我进行咨询. 4. 国庆放假期间,每天都有老师在公司值班,10月4日是我在公司值班,10月7日正常上班,欢迎大家到公司来做项目. 二. 项目功能要求: 项目开始运行显示主菜单为: 银行自助终端系统 ************

  • Java事务管理学习之JDBC详解

    什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isolation)和持久性(durability)的缩写.事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效.一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态.隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见.持久性表示已提交的数据在事务

  • Java基于JDBC实现事务,银行转账及货物进出库功能示例

    本文实例讲述了Java基于JDBC实现事务,银行转账及货物进出库功能.分享给大家供大家参考,具体如下: 1. 转账业务 转账必须执行2个sql语句(update更新)都成功的情况下,提交事务,如果有一个失败,则2个都回滚事务 2. 事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACID特性. ① 原子性(atomicity).一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. ② 一致性(consistency).事务必须是使数据库从一个一致性状

  • Java基于Socket实现简单的多线程回显服务器功能示例

    本文实例讲述了Java基于Socket实现简单的多线程回显服务器功能.分享给大家供大家参考,具体如下: 需要两个类,一个是EchoServer,代表服务器.另外一个是EchoServerClient,代表客户端.代码如下: package interview; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter

  • java基于AES对称加密算法实现的加密与解密功能示例

    本文实例讲述了java基于AES对称加密算法实现的加密与解密功能.分享给大家供大家参考,具体如下: package com.soufun.com; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import

  • Java基于中介者模式实现多人聊天室功能示例

    本文实例讲述了Java基于中介者模式实现多人聊天室功能.分享给大家供大家参考,具体如下: 一 模式定义 中介者模式,用一个中介对象来封装一系列对象之间的交互,使各个对象中不需要显示地引用其他对象实例,从而降低各个对象之间的耦合度,并且可以独立地改变对象间的交互关系. 二 模式举例 1 模式分析 我们借用多人聊天室来说明这一模式 2 中介模式静态类图 3 代码示例 3.1中介者接口--IMediator package com.demo.mediator; import com.demo.coll

  • Java基于jdbc连接mysql数据库操作示例

    本文实例讲述了Java基于jdbc连接mysql数据库操作.分享给大家供大家参考,具体如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class MySQLDemo { private Connection conn = null; pri

  • java基于jdbc连接mysql数据库功能实例详解

    本文实例讲述了java基于jdbc连接mysql数据库的方法.分享给大家供大家参考,具体如下: 一.JDBC简介 Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法.JDBC也是Sun Microsystems的商标.它JDBC是面向关系型数据库的. 1.JDBC架构: JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由

  • java基于JDBC连接Oracle 11g Release2实例分析

    本文实例讲述了java基于JDBC连接Oracle 11g Release2的方法.分享给大家供大家参考.具体如下: Oracle 11g Release 2 的 JDBC 连接似乎有所不同 ,如果你收到下面的异常: Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor.

  • Java基于jdbc实现的增删改查操作示例

    本文实例讲述了Java基于jdbc实现的增删改查操作.分享给大家供大家参考,具体如下: 增删改操作: package java_web; import java.sql.DriverManager; import java.sql.SQLException; import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement; /** * jdbc CURD * @author Administrator * */ public c

  • Java基于JDBC连接数据库及显示数据操作示例

    本文实例讲述了Java基于JDBC连接数据库及显示数据操作.分享给大家供大家参考,具体如下: 1. 导入jdbc包 java要连接MySQL数据库需要用到JDBC工具(mysql-connector-java-5.1.39-bin.jar),这是一个jar包,不同的数据库对应不同的jar包,这里用的是MySQL数据库jar包,导入很简单,鼠标对项目右击 - Build Path - Configure Build Path - 右侧选Libraries - Add External JARs,选

  • java基于jdbc实现简单学生管理系统

    目录 工具类 工程目录: 运行截图: 这个是java连接mysql数据库的一个简单学生系统,通过jdbc连接数据库. 工具类 JDBCuntils. package Student; import java.io.IOException; import java.sql.*; import java.util.Properties; //数据库的工具类 public class JDBCuntils { private static String driver = ""; privat

随机推荐