Java总结(随笔)——代码总结JDBC以及事务,以银行转账,查账等为例

本片文章是对上一篇文章中的事务的例子的功能扩写,用以加深理解,以及代码的熟练度:
(1)数据库表

数据:

(2)引入数据库连接jar包
(3)工具类:

package org.jdbc.util;

import java.io.File;
import java.io.FileInputStream;
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 DBUtil {

    // 私有化构造方法
    private DBUtil() {
    }

    private static String url = null;
    private static String user = null;
    private static String password = null;

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Properties pro = new Properties();
            pro.load(new FileInputStream("src/jdbc.properties"));
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 读取外部属性文件获取连接对象,需手动输入url
    public static Connection getConnection1(String url) {
        Properties pro = new Properties();
        Connection conn = null;
        InputStream input = null;
        try {
            input = new FileInputStream("E:" + File.separator
                    + "JDBC.properties");
            pro.load(input);
            conn = DriverManager.getConnection(url, pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;

    }

    // 读取工程下的配置文件,获取连接对象参数,不需手动输入url
    public static Connection getConnection2() throws SQLException {
        Connection conn = DriverManager.getConnection(url, user, password);
        return conn;
    }

    // 释放全部资源
    public static void closeAll(Connection conn, Statement stat, ResultSet rs)
            throws SQLException {
        if (conn != null) {
            conn.close();
        }
        if (stat != null) {
            stat.close();
        }
        if (rs != null) {
            rs.close();
        }
    }

    // 释放所用资源
    public static void closePart(Connection conn, Statement stat)
            throws SQLException {
        if (conn != null) {
            conn.close();
        }
        if (stat != null) {
            stat.close();
        }
    }
}

(4)编写代码:

package org.jdbc.transcation;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

import org.jdbc.util.DBUtil;

public class AccountDemo {
    // 主方法控制运行方向
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Scanner scan = new Scanner(System.in);
        System.out.println("欢迎来到模拟银行界面");
        while (true) {
            System.out.print("请输入你的选择(1 转账  2 查询    3存款 4取款 5开户 8退出):");
            int chioce;
            try {
                chioce = scan.nextInt();
                if (chioce == 1 | chioce == 2 | chioce == 3 | chioce==4 | chioce==5 |chioce == 8) {
                    switch (chioce) {
                    case 1: // 转账
                        System.out.print("请输入转出账户姓名:");
                        String fromName = br.readLine();
                        System.out.print("请输入转入账户姓名:");
                        String toName = br.readLine();
                        System.out.print("请输入转账金额:");
                        int money = scan.nextInt();
                        boolean flag = transFerMoney(fromName, toName, money);
                        if (flag) {
                            System.out.println("转账成功");
                            showBalance(toName);
                            showBalance(fromName);
                        } else {
                            System.out.println("请检查你输入的信息是否正确,请输入正确的信息,重新办理此业务,谢谢!");
                        }
                        break;
                    case 2: // 查询
                        System.out.print("请选择 (1:查询全部账户信息\t2:个人账户信息):");
                        int chioce1 = scan.nextInt();
                        if (chioce1 == 1 | chioce1 == 2) {
                            switch (chioce1) {
                            case 1: // 查询全部账户
                                selectAll();
                                break;
                            case 2: // 查询个人账户
                                System.out.print("请输入查询账户姓名:");
                                String balName = br.readLine();
                                selectPart(balName);
                                break;
                            }
                        } else {
                            System.out.println("你的选项错误,请重新输入");
                        }
                        break;
                    case 3: // 存款
                        System.out.print("请输入存款账户名:");
                        String savName = br.readLine();
                        System.out.print("请输入存款金额:");
                        int savMoney = scan.nextInt();
                        boolean isSave = saveMoney(savName, savMoney);
                        if (isSave) {
                            System.out.println("存款成功");
                            showBalance(savName);
                        } else {
                            System.out.println("你输入的账户信息有误,存款失败..");
                        }
                        break;
                    case 4: // 取款
                        System.out.print("请输入取款账户名:");
                        String draName = br.readLine();
                        System.out.print("请输入取款金额:");
                        int draMoney = scan.nextInt();
                        boolean isDraw = drawMoney(draName, draMoney);
                        if (isDraw) {
                            System.out.println("取款成功");
                            showBalance(draName);
                        } else {
                            System.out.println("你输入的账户信息有误,取款失败..");
                        }
                        break;
                    case 5: // 取款
                        System.out.print("请输入开户账户名:");
                        String opName = br.readLine();
                        System.out.print("请输入开户存款金额:");
                        int opBalance = scan.nextInt();
                        boolean isOpen = openAccount(opName, opBalance);
                        if (isOpen) {
                            System.out.println("恭喜你,开户成功");
                            System.out.println("当前账户信息:");
                            selectPart(opName);
                        } else {
                            System.out.println("Sorry,发生异常,你开户失败..");
                        }
                        break;
                    case 8: // 退出本系统
                        System.out.println("谢谢你的光临,再见!!");
                        System.exit(0);
                    }
                } else {
                    System.out.println("你的选项错误,请重新输入");
                }
            } catch (IOException e) {
                System.out.println("你有非法操作,产生异常现象:"+e.getMessage());
            }
        }

    }

    // 转钱方法
    @SuppressWarnings("resource")
    public static boolean transFerMoney(String fromName, String toName,
            int money) {
        boolean flag = false;
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs=null;
        try {
            conn = DBUtil.getConnection2();
            String sql="select * from account where name=?";
            ps=conn.prepareStatement(sql);
            ps.setString(1, fromName);
            rs=ps.executeQuery();
            boolean flag1=false;
            flag1= rs.next();
            ps.close();

            ps=conn.prepareStatement(sql);
            ps.setString(1, fromName);
            rs=ps.executeQuery();
            boolean flag2=false;
            flag2= rs.next();
            ps.close();
            if((flag1 && flag2)!=false){
                conn.setAutoCommit(false);// 取消自动提交
                String sql1 = "update account set balance=balance-? where name=?";
                String sql2 = "update account set balance=balance+? where name=?";
                ps = conn.prepareStatement(sql1);
                ps.setInt(1, money);
                ps.setString(2, fromName);// 转出
                ps.executeUpdate();
                ps.close();

                ps = conn.prepareStatement(sql2);
                ps.setInt(1, money);
                ps.setString(2, toName);// 转入
                ps.executeUpdate();
                conn.commit();// 提交事务
                flag = true;
            }else{
                System.out.println("Sorry,你输入的账户有误,不能进行转账处理");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closeAll(conn, ps,rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return flag;

    }

    // 全部账户查询方法信息
    public static void selectAll() {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection2();// 建立连接
            String sql = "select * from account";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            System.out.println("全部账户信息查询结果为:");
            System.out.println("编号\t姓名\t账户余额");
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int balance = rs.getInt("balance");
                System.out.println(id + "\t" + name + "\t" + balance);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closeAll(conn, ps, rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // 查询单人账户信息
    @SuppressWarnings("resource")
    public static void selectPart(String balName) {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection2();// 建立连接
            String sql3 = "select * from account where name=?";
            ps = conn.prepareStatement(sql3);
            ps.setString(1, balName);
            rs = ps.executeQuery();
            boolean flag = rs.next();
            if (flag == true) {
                System.out.println(balName + "账户信息查询结果为:");
                System.out.println("编号\t姓名\t账户余额");
                rs = ps.executeQuery();
                while (rs.next()) {
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    int balance = rs.getInt("balance");
                    System.out.println(id + "\t" + name + "\t" + balance);
                }
            } else {
                System.out.println("你输入的 账户信息不存在,请重新输入..");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closeAll(conn, ps, rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // 存钱方法
    public static boolean saveMoney(String saveName, int savMoney) {
        boolean flag = false;
        Connection conn = null;
        PreparedStatement ps = null;
        String sql6 = "update account set balance=balance+? where name=?";
        int count = 0;
        try {
            conn = DBUtil.getConnection2();
            ps = conn.prepareStatement(sql6);
            ps.setInt(1, savMoney);
            ps.setString(2, saveName);
            count = ps.executeUpdate();
            if (count != 0) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closePart(conn, ps);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return flag;

    }

    // 取钱方法
    public static boolean drawMoney(String drawName, int draMoney) {
        boolean flag = false;
        Connection conn = null;
        PreparedStatement ps = null;
        String sql7 = "update account set balance=balance-? where name=?";
        int count = 0;
        try {
            conn = DBUtil.getConnection2();
            ps = conn.prepareStatement(sql7);
            ps.setInt(1, draMoney);
            ps.setString(2, drawName);
            count = ps.executeUpdate();
            if (count != 0) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closePart(conn, ps);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return flag;

    }

    // 建立新的账户
    public static boolean openAccount(String opName, int opBalance) {
        boolean flag = false;
        Connection conn = null;
        PreparedStatement ps = null;
        String sql9 = "insert into account(name,balance) values(?,?)";
        int count = 0;
        try {
            conn = DBUtil.getConnection2();
            ps = conn.prepareStatement(sql9);
            ps.setString(1, opName);
            ps.setInt(2, opBalance);
            count = ps.executeUpdate();
            if (count != 0) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closePart(conn, ps);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return flag;

    }

    //显示余额方法
    @SuppressWarnings("resource")
    public static void showBalance(String showName) {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection2();// 建立连接
            String sql10 = "select balance from account where name=?";
            ps = conn.prepareStatement(sql10);
            ps.setString(1, showName);
            rs = ps.executeQuery();
                rs = ps.executeQuery();
                while (rs.next()) {
                    int shBalance = rs.getInt("balance");
                    System.out.println(showName + "账户当前 余额为:"+shBalance);
                }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closeAll(conn, ps, rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

运行结果:

欢迎来到模拟银行界面
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):2
请选择 (1:查询全部账户信息 2:个人账户信息):1
全部账户信息查询结果为:
编号  姓名  账户余额
1   项羽  35013020
2   刘邦  20002980
3   李世民 47618000
4   赵匡胤 23990000
5   朱元璋 12356000
6   嬴政  32200000
7   曹操  200000000
8   孙权  14500000
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):1
请输入转出账户姓名:李世民
请输入转入账户姓名:曹操
请输入转账金额:3000
转账成功
曹操账户当前 余额为:200003000
李世民账户当前 余额为:47615000
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):1
请输入转出账户姓名:呵呵
请输入转入账户姓名:哈哈
请输入转账金额:20000
Sorry,你输入的账户有误,不能进行转账处理
请检查你输入的信息是否正确,请输入正确的信息,重新办理此业务,谢谢!
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):2
请选择 (1:查询全部账户信息 2:个人账户信息):2
请输入查询账户姓名:刘邦
刘邦账户信息查询结果为:
编号  姓名  账户余额
2   刘邦  20002980
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):2
请选择 (1:查询全部账户信息 2:个人账户信息):3
你的选项错误,请重新输入
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):2
请选择 (1:查询全部账户信息 2:个人账户信息):2
请输入查询账户姓名:哈哈
你输入的 账户信息不存在,请重新输入..
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):3
请输入存款账户名:朱元璋
请输入存款金额:300000
存款成功
朱元璋账户当前 余额为:12656000
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):3
请输入存款账户名:呵呵
请输入存款金额:3300
你输入的账户信息有误,存款失败..
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):4
请输入取款账户名:曹操
请输入取款金额:250
取款成功
曹操账户当前 余额为:200002750
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):
4
请输入取款账户名:哈哈
请输入取款金额:200
你输入的账户信息有误,取款失败..
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):5
请输入开户账户名:李渊
请输入开户存款金额:300000000
恭喜你,开户成功
当前账户信息:
李渊账户信息查询结果为:
编号  姓名  账户余额
9   李渊  300000000
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):2
请选择 (1:查询全部账户信息 2:个人账户信息):1
全部账户信息查询结果为:
编号  姓名  账户余额
1   项羽  35013020
2   刘邦  20002980
3   李世民 47615000
4   赵匡胤 23990000
5   朱元璋 12656000
6   嬴政  32200000
7   曹操  200002750
8   孙权  14500000
9   李渊  300000000
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):6
你的选项错误,请重新输入
请输入你的选择(1 转账    2 查询    3存款 4取款 5开户 8退出):8
谢谢你的光临,再见!!

原文地址:http://blog.51cto.com/13501268/2128948

时间: 2024-10-12 01:04:01

Java总结(随笔)——代码总结JDBC以及事务,以银行转账,查账等为例的相关文章

java技巧--提高代码运行效率

java技巧--提高代码运行效率 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资源的并发访问 第二,控制实例的产生,以达到节约资源的目的 第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信 - 2.尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic变量所引用,那么gc通常是不会回收这个对象所占有的

Java中JDBC的事务问题

事务 l  事务的四大特性:ACID: l  mysql中操作事务 l  jdbc中操作事务 事务概述 为了方便演示事务,我们需要创建一个account表: CREATE TABLE account(          id INT PRIMARY KEY AUTO_INCREMENT,          NAME VARCHAR(30),          balance NUMERIC(10.2) );   INSERT INTO account(NAME,balance) VALUES('

[疯狂Java]JDBC:事务管理、中间点、批量更新

1. 数据库事务的概念: 1) 事务的目的就是为了保证数据库中数据的完整性: 2) 设想一个银行转账的过程,如果分两步,第一步是A的账户-1000,第二步是B的账户+1000,这两个动作必须是连贯的,如果中间断开(出现故障等)比如第一步执行完之后发生异常而终止了操作,那么A就白扣了1000,而B的账户也没有钱增加,这就发生了非常严重的错误: !!以上这个案例可以看出: a. 这两步必须是连贯的,一起合成的,应该作为一个整体逻辑执行单元来执行: b. 如果两步顺利执行完毕那么数据就是完整的,如果中

JDBC编程-事务编程(四)

事务的概念 事务的概念在我看来是指的是一组sql序列,这个序列是一块执行的单位,要么全部执行,要不全部执行,这样可以很好的对数据库进行并发控制. 因为数据库是多个用户都可以同时操作的,如果多个用户同时操作一个数据,就容易造成数据的不一致,所以事务作为并发控制的一个基本单位很有必要. 事务的特性 1.原子性:事务是一个完整的整体,所有的操作和数据都是一个整体. 2.一致性:事务的操作是一致性的. 3.隔离性:事务之间的操作是相互隔离的. 4.持久性:事务的操作是持久的,即使出现了错误也会完成. 事

JDBC高级-事务

(一)什么是事务 事务:是数据库的概念,逻辑上的一组操作,组成这级操作的各个单元,要么全部成功,要么全部失败. 主要是针对批量的insert.update.delete语句 (二)事务的作用 保证多条SQL的数据变更,要么全部成功,要么全部失败. 在实际业务场景里,通常会遇到一些特殊的业务:这些业务需要由多条SQL操作来一起完成.如果没有事务,那么每执行一条SQL,数据变更会立即生效:但是如果在执行过程中,某一条SQL执行失败或者出现了异常,前边的SQL变更已经生效,但是后边的SQL就不执行了,

JDBC 控制事务(MySQL为例)

事务 一个包含多个步骤的业务操作.如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败. 对事务的操作 开启事务 提交事务 回滚事务 使用Connection对象来管理事务 java.sql.Connection接口是一个数据库连接对象.它与特定数据库的连接(会话). 执行SQL语句并在连接的上下文中返回结果. 开启事务 setAutoCommit(boolean autoCommit) // 调用该方法设置参数为false,即开启事务 提交事务 commit() // 当所有sq

利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口: 1.public Connection getConnection()   获得数据库的连接 2.public boolean updateByPreparedStatement(String sql, List<Object>params)throws SQLException  更新数据库

Java解惑 之 MySQL与JDBC编程

一.JDBC的常用接口和类: 1.DriverManager:主要用于管理JDBC驱动的服务类.在程序中使用该类的主要功能是获取Connection对象,该类包含如下方法: public static synchronized Connection getConnection(String url, String user, String password)  throws  SQLException:该方法获取数据库的连接. 2.Connection:代表数据库连接对象,而每一个Connect

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决方案

昨天整理桌面的时候将桌面的一堆文件移动到F盘去了,结果导致原来建的一些项目名称全部出现红色感叹号,打开一看,原来是因为我把hibernate的那些jar包移走了,导致user library里那些jar在原来的路径里找不到了,所以出现红色感叹号,在写新的项目的时候就不能把原来写的羡慕copy过来改了,只好重新新建了个java project,然后重新导包,编好代码运行一下,报了如下错误:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver