zoukankan      html  css  js  c++  java
  • java连接数据库——JDBC连接数据库

    DBUtil.java   // 数据库操作文件

    package com.bjpowernode.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 static String driver ;
        private static String url    ;
        private static String uname  ;
        private static String pwd    ;
        
        static{
            
            try {
                //创建集合类对象
                Properties properties = new Properties();
                //把文件封装成字节输入流
                InputStream inStream = new FileInputStream(new File("./src/DBConfig.properties"));


    /*
    等同于     ResourceBundle isStream = ResourceBundle.getBundle("com.bjpowernode.jdbc.util.DBConfig"); //注意:DBConfig 不要添加后缀



    */
    //把字节流加载到集合类中,在内存中以key和value的格式形成 properties.load(inStream); //通过key获得value driver = properties.getProperty("driver"); url = properties.getProperty("url"); uname = properties.getProperty("uname"); pwd = properties.getProperty("pwd"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("读取配置文件失败!",e); } } //获得连接 public static Connection getConnection (){ Connection conn = null; try { //1:注册驱动 Class.forName(driver); conn = DriverManager.getConnection(url,uname,pwd); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("连接数据库失败!",e); } return conn; } //释放资源 public static void close(ResultSet rs ,Statement pstm ,Connection conn){ try{ if (rs != null){ rs.close(); } }catch(SQLException e){ e.printStackTrace(); throw new RuntimeException("rs关闭失败!",e); } try{ if (pstm != null){ pstm.close(); } }catch(SQLException e){ e.printStackTrace(); throw new RuntimeException("pstm关闭失败!",e); } try{ if (conn != null){ conn.close(); } }catch(SQLException e){ e.printStackTrace(); throw new RuntimeException("conn关闭失败!",e); } } //开启事务 public static void beginTransaction(Connection conn){ try { if(conn != null){ conn.setAutoCommit(false); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("开启事务失败!",e); } } //提交事务 public static void commit(Connection conn){ try { if(conn != null){ conn.commit(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException("提交事务失败!",e); } } //回滚事务 public static void rollback(Connection conn){ try { if(conn != null){ conn.rollback(); } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("回滚事务失败!",e); } } }

    Transfer_transaction.java  // 调用数据库文件

    package com.bjpowernode.jdbc.transfer;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import com.bjpowernode.jdbc.util.DBUtil;
    
    public class Transfer_transaction {
        public static void main(String[] args) {
            transfer("zs","ls",100);
        }
        /**
         * 
         * @param from_act  : 转出账户
         * @param to_act    :转入账户
         * @param money     : 转账金额
         */
        private static void transfer(String from_act, String to_act, double money) {
            
            /*if(转出账户的金额 >= 转账金额){
                转出账户 - 转账金额
                转入账户 + 转账金额
            }else{
                提示余额不足
            }*/
            Connection conn  = null;
            //转出账户的金额
            try {
                //事务是针对连接开启的
                conn = DBUtil.getConnection();
                //开启事务
                DBUtil.beginTransaction(conn);
                
                double from_money = getMoneyByAct(conn,from_act);
                
                if(from_money >= money){//转出账户的金额 >= 转账金额
                    //转账
                    //转出账户 - 转账金额
                    updateMoneyByAct(conn,from_money-money,from_act);
                    //转入账户的金额
                    double to_money = getMoneyByAct(conn,to_act);
                    //模拟异常
    //                Integer.parseInt("abc");
                    //转入账户+ 转账金额
                    updateMoneyByAct(conn,to_money+money,to_act);
                    //提交事务
                    DBUtil.commit(conn);
                    System.out.println("转账成功!");
                }else{//提示余额不足
                    System.out.println("余额不足!");
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("转账失败!");
                //回滚事务
                DBUtil.rollback(conn);
            }finally{
                DBUtil.close(null, null, conn);
            }
            
        }
        /**
         * 通过账户修改账户金额
         * 
         * @param money : 需要修改的金额
         * @param act   : 账户名称
         */
        private static void updateMoneyByAct(Connection conn ,double money, String act) {
            // TODO Auto-generated method stub
    //        Connection conn = null;
            PreparedStatement pstm = null;
            
            try {
    //            conn = DBUtil.getConnection();
                
                String sql = "update t_account set money = ? where act_no = ?";
                pstm = conn.prepareStatement(sql);
                
                pstm.setDouble(1, money);
                pstm.setString(2, act);
                
                pstm.executeUpdate();
                
                
                
            } catch (Exception e) {
                // TODO: handle exception
                
                throw new RuntimeException("修改金额失败",e);
            }finally{
                DBUtil.close(null, pstm, null);
            }
        }
        /**
         * 通过账户查询账户金额
         * @param act
         * @return
         */
        private static double getMoneyByAct(Connection conn ,String act) {
    //        Connection conn = null;
            PreparedStatement pstm = null;
            ResultSet rs = null;
            double from_money = 0;
            try {
                //获得连接
    //            conn = DBUtil.getConnection();
                String sql = "select money from t_account where act_no = ?";
                //创建数据库操作对象
                pstm = conn.prepareStatement(sql);
                //为占位符号赋值
                pstm.setString(1, act);
                //执行sql
                rs = pstm.executeQuery();
                /*while(rs.next()){
                    from_money = rs.getDouble("money");
                }
                if(rs.next()){
                    from_money = rs.getDouble("money");
                }
                */
                from_money = rs.next()?rs.getDouble("money"):0;
                
                
            } catch (Exception e) {
                throw new RuntimeException("查询账户余额失败!",e);
            }finally{
                DBUtil.close(rs, pstm, null);
            }
            return from_money;
        }
    }

    DBConfig.properties   //数据库配置文件

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3366/bjpowernode
    uname=root
    pwd=root
  • 相关阅读:
    BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块
    BZOJ 3131 SDOI2013 淘金 数位dp
    BZOJ 4408 FJOI2016 神秘数 可持久化线段树
    [leetcode] Reverse Linked List
    走迷宫问题总结
    [leetcode] Max Area of Island
    [leetcode] All Paths From Source to Target
    [leetcode] Arithmetic Slices
    [leetcode] Move Zeroes
    [leetcode] Linked List Cycle
  • 原文地址:https://www.cnblogs.com/chen-lhx/p/4466969.html
Copyright © 2011-2022 走看看