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"));
            
            //把字节流加载到集合类中,在内存中以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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。