jdbc dao 工具类mysql_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. 首先创建一个数据表或者两个数据表,这里为了演示清楚创建两个数据表

e695e50ff557f54f1f57cacc530be8bd.png

c720fbe1de6efdcebc556210b2463388.png

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

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);

}

}

}

演示效果如下所示:

39ceaeb7be88c5b98bb1db11440553b1.gif

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

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

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

相关文章

冒险岛单机版mysql_冒险岛单机版

这款《冒险岛单机版》经验是盛大冒险岛的100倍?最新盛大地图及BOSS,甚至包括盛大没有地图BOSS及现金装备,地图包括新加坡,马来西亚,台湾,可口可乐城,闹鬼宅邸,暹罗等等?。25驾坐骑&#xff0c…

python与html5搭建聊天室_html5 websocket 新版协议聊天室 服务端(python版)

网上找了很多代码都是旧版协议的,研究了很久终于弄清楚了 现在发个用新版协议写的服务端代码出来(这个代码是从网上旧版协议改过来的)最要就是握手协议和发送接受字符的方式变了# incodingutf-8import socketimport structimport hashlibimport threading,randomimp…

mysql数据库开发笔记_MySQL数据库生成数据库说明文档

在半年多前为一个MySQL数据库生成过数据库说明文档,今天要重新生成一份,但是发现完全不记得当时是怎么生成的,只能在网上搜索重来一遍,所以今天特意把这个过程记录一下。一、安装使用MySQL数据库表结构导出器DBExportDoc V1.0 For…

java 字符串缓冲区_详解Java中字符串缓冲区StringBuffer类的使用

StringBuffer 是一个线程安全的可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。StringBuilder 也是继承于AbstractStringBuilder的子类;但是,StringBuilder和StringBuffer不同,前者是非线程安全的&#…

rabbitmq java文档_RabbitMQ文档翻译——Hello World!(上)

文章主要翻译自RabbitMQ官方文档,主要是为了练习英语翻译,顺便学习一下RabbitMQ😶其中也记录了一些爬过的坑IntroductionRabbitMQ is a message broker. The principal idea is pretty simple: it accepts and forwards messages. You can th…

java string 包含http_Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件)...

一、HttpPost上传文件public static String getSuffix(final MultipartFile file){if(file null || file.getSize() 0){return null;}String fileName file.getOriginalFilename();return fileName.substring(fileName.lastIndexOf(".")1);}public static JSONObj…

java倒计时跳出窗口_java倒计时弹出框

直接使用java语言写出一个运行时的弹出框倒计时:package test.dagong.testDecreaseDate;import java.awt.Container;import java.awt.FlowLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.sw…

jpa mysql存储过程_Jpa调用存储过程及参数

public List findAllEntityListBySearch(Long inputInfoId, int flag) throws Exception {List infoviewListnew ArrayList<>();EntityManager em emf.createEntityManager();try {StoredProcedureQuery storedProcedure em.createStoredProcedureQuery("存储名称&…

python从mongodb里取出数据进行可视化_python3 mongoDB数据库的安装配置与可视化

python3 mongoDB数据库的安装配置与可视化。前天说是要学习如何使用mongoDB的链接与安装。安装环境&#xff1a; wind10 还是盗版的 磁盘分析&#xff1a;只有一个C盘&#xff0c;步骤&#xff1a;1 . 下载这里下载了对应的msi文件&#xff0c;貌似.zip文件没有了2 我默认把mon…

idea 注入mapper报错报红的几种解决方案

文章目录 前言方法1&#xff1a;为 Autowired 注解设置required false方法2&#xff1a;用 Resource 替换 Autowired方法3&#xff1a;在Mapper接口上加上Repository注解方法4&#xff1a;用Lombok方法5&#xff1a;把IDEA的警告关闭掉方法6&#xff1a;不用管他 前言 相信大…

java 调用对象的方法_JAVA调用对象方法的执行过程

JAVA调用对象方法的执行过程&#xff1a;①.编译器查看对象的声明类型和方法名。假设调用x.f(parameter), 且隐式参数x声明为C类型的对象&#xff0c;有可能在C对象中存在多个参数类型和参数个数不同的f的方法{例如&#xff1a;f(int)、f(int,String)和f(String)}&#xff0c;…

java类默认权限_Java 访问权限控制以及类初始化顺序

一. Package在一个项目中&#xff0c;不可以有相同的两个包名package语句必须是文件中除注释外第一句程序代码&#xff0c;否则不能通过编译。二. Java访问权限概述类成员&#xff1a;对于一个类&#xff0c;其成员(包括成员变量和成员方法)能否被其他类所访问&#xff0c;取决…

java http头 字符串转日期_springboot~DTO字符字段与日期字段的转换问题

不会自动转换string与date主要是这个意思&#xff0c;前端提交的JSON里&#xff0c;日期是一个字符串&#xff0c;而对应后端的实体里&#xff0c;它是一个Date的日期&#xff0c;这两个在默认情况下是不能自动转换的&#xff0c;我们先看一下实体实体public class UserDTO {pr…

java super extends_Java继承和super的用法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼继承的关键字:extends格式如下: class 子类名 extends父类名{...}例如学生是继承人类这一父类的.class student extends person{...}如果一个类的声明没有使用关键字extends,则这个类默认是继承Object类的.Object是所有类的父类.Ob…

比较abc大小的java_比较abc大小java

比较abc大小java[2021-02-09 04:04:20] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff1a;《PH…

海天食品的java开发工作如何_再三个月就秋招了,我想找一份java开发工作,现在应该怎么准备一下?...

在找工作之前&#xff0c;大家都要做一些准备工作&#xff0c;java开发也是如此掌握核心JavaSE首先&#xff0c;从核心Java(JavaSE)开始学习&#xff0c;尽可能地掌握它。你应该了解和掌握一些基本概念&#xff0c;如循环&#xff0c;数组&#xff0c;运算符等等。此外&#xf…

java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

最近比较闲&#xff0c;一直在抽空回顾一些java方面的技术应用。今天没什么事做&#xff0c;基于udp协议&#xff0c;写了一个非常简单的聊天室程序。现在的工作&#xff0c;很少用到socket&#xff0c;也算是对java网络编程方面的一个简单回忆。先看一下效果&#xff1a;实现的…

java9 反应编程_Java9第四篇-Reactive Stream API响应式编程

file我计划在后续的一段时间内&#xff0c;写一系列关于java 9的文章&#xff0c;虽然java 9 不像Java 8或者Java 11那样的核心java版本&#xff0c;但是还是有很多的特性值得关注。期待您能关注我&#xff0c;我将把java 9 写成一系列的文章&#xff0c;大概十篇左右。Java 9的…

bb10系统支持java吗_黑莓BB10怎么样 BlackBerry 10系统好用吗?

曾几何时黑莓Blackberry OS是一款十分受用户欢迎的手机系统&#xff0c;不过随着手机系统市场已经被苹果iOS、谷歌安卓、微软Windows Phone三分天下&#xff0c;致使曾经的黑莓帝国逐渐沦陷&#xff0c;体验和性能都已经明显跟不上iOS与安卓等系统的脚步了&#xff0c;也因为如…

java中兴参与实参相同_中兴通讯_传输SDH试题(含答案)

中兴传输SDH试题一、单项选择题(每小题2分&#xff0c;共30分)1、在SDH系统中, RSOH指(A)。A.再生段开销B.复用段开销C.再生段通道开销D.复用段通道开销2.、同步数字体系SDH具有(A)帧结构。A.块状B.串行C.链形D.三维3、管理指针单元的作用是(A)。A、用来指示信息净负荷的第一个…