MySQL_(Java)【事物操做】使用JDBC模擬銀行轉帳向數據庫發起修改請求

 

 

  MySQL_(Java)使用JDBC向數據庫發起查詢請求  傳送門html

  MySQL_(Java)使用JDBC向數據庫中插入(insert)數據  傳送門java

  MySQL_(Java)使用JDBC向數據庫中刪除(delete)數據  傳送門mysql

  MySQL_(Java)使用JDBC向數據庫中修改(update)數據  傳送門sql

 

  MySQL_(Java)【鏈接池】簡單在JDBCUtils.java中建立鏈接池  傳送門數據庫

 

數據庫中事務:ide

  咱們以前分享數據庫的數據操做,無外乎對數據庫的數據進行增、刪、改、查。就好比咱們去買東西,通常都是先付錢,賣家收到錢再發貨。這個用數據庫來表示就是,第一步:從用戶的帳戶中減去一部分金額。第二步,再把減去的金額添加到商家的帳戶上。優化

  可是萬一遇到特殊的狀況,你成功的完成了第一步,從用戶的數據庫中扣除了錢,這時候忽然停電,系統出現了故障,沒有完成第二步。這就尷尬了,用戶的錢少了,商家也沒收到錢。編碼

  爲了應對這種狀況的發生,數據庫就出現了一個功能事務,事務就是一組由 SQL 語句組成的業務邏輯,當事務內的全部 SQL語句都成功的執行,整個事務纔算成功,不然就是失敗。失敗意味着整個的數據操做沒有意義,就要把數據恢復到執行事務操做以前的狀態。url

 

  Learnspa

    1、未添加事務且普通轉帳正常 

    2、在扣款和收款操做之間添加一個隱式異常

    3、添加事物

 

數據庫表結構:

    

 

1、未添加事務且普通轉帳正常   

  由a向b轉帳1000元

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC01 {

    public static void main(String[] args) throws SQLException  {
        transferAccount("a","b",1000);
    }

    public static void selectAll() throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //數據庫的鏈接
            con = JDBCUtils.getConnection();
            
            //數據庫的增刪改查
            stmt = con.createStatement();
            //返回一個結果集
            rs =stmt.executeQuery("select * from garytb");
            
            while(rs.next()) {
                //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
                System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
            }
        
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

    //校驗用戶
    public static boolean  selectByUernamePassword(String username,String password) throws SQLException {
        Connection con=null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
            con = DriverManager.getConnection(url,"root","123456");
            stmt =con.createStatement();
            String sql = "select * from garytb where username = '"+username+"' and password = '"+password+"'";
            //System.out.println(sql);
            rs = stmt.executeQuery(sql);
            
            if(rs.next()) {
                return true;
            }else {
                return false;
            }
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(rs!=null)
                rs.close();
            if(stmt!=null)
                stmt.close();
            if(con!=null)
                con.close();
        }
        
        return false;
    }

    public static boolean selectByUP2(String username,String password) throws SQLException{
        Connection con=null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
            con = DriverManager.getConnection(url,"root","123456");
            
            String sql = "select * from garytb where username = ? and password = ?";
            PreparedStatement pstmt = con.prepareStatement(sql);
            //添加參數
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            //進行查詢
            rs = pstmt.executeQuery();
                
            if(rs.next()) {
                return true;
            }else {
                return false;
            }
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(rs!=null)
                rs.close();
            if(stmt!=null)
                stmt.close();
            if(con!=null)
                con.close();
        }
        
        return false;
    }

    //pageNumber是頁數,第幾頁,pageCount是每頁顯示多少個數據
    public static void selectUserByPage(int pageNumber,int pageCount) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
                Connection con = null;
                PreparedStatement stmt = null;
                ResultSet rs = null;
                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    
                    //String url ="jdbc:mysql://localhost:3306/garysql";
                    //指定編碼查詢數據庫
                    String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
                    String user = "root";
                    String password = "123456";
                    //創建和數據庫的鏈接
                    con = DriverManager.getConnection(url,user,password);
                    
                    stmt = con.prepareStatement("select * from garytb limit ?,?");
                    stmt.setInt(1, (pageNumber-1)*pageCount );
                    stmt.setInt(2, pageCount);
                    
                    rs = stmt.executeQuery();
                    
                    while(rs.next()) {
                        //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
                        System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
                    }
                
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    if(rs!=null)
                        rs.close();
                    if(stmt!=null)
                        stmt.close();
                    if(con!=null)
                        con.close();
                }
    }

    //crud: create read update delete
    //插入語句
    public static void insert(String username,String password) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            String sql = "insert into garytb(username,password) values(?,?)";
            stmt = con.prepareStatement(sql);
            stmt.setString(1, username);
            stmt.setString(2, password);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("插入成功"+username);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    //刪除語句
    public static void delete(int id) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "delete from garytb where id = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, id);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            if(result>0) {
                System.out.println("刪除成功");
            }else {
                System.out.println("刪除失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    //修改語句
    public static void update(int id,String newPassword) throws SQLException {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "update garytb set password = ? where id = ?";
            stmt = con.prepareStatement(sql);
            stmt.setString(1, newPassword);
            stmt.setInt(2, id);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            if(result>0) {
                System.out.println("修改爲功");
            }else {
                System.out.println("修改失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

    //事物操做
    //由username1向username2轉帳金額
    public static void transferAccount(String username1,String username2,int money) throws SQLException {
        Connection con = null;
        PreparedStatement stmt1 = null;
        PreparedStatement stmt2 = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "update garytb set balance = balance - ? where username = ?";
            stmt1 = con.prepareStatement(sql);
            stmt1.setInt(1, money);
            stmt1.setString(2, username1);
            stmt1.executeUpdate();// 返回值表明收到影響的行數
            
            sql = "update garytb set balance = balance + ? where username = ?";
            stmt2 = con.prepareStatement(sql);
            stmt2.setInt(1, money);
            stmt2.setString(2, username2);
            stmt2.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("操做成功!!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt1, con);
        }
    }
    
}
JDBC01.java

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
    
    private static final String connectionURL = "jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
    private static final String username = "root";
    private static final String password = "123";
    
    //建立數據庫的鏈接
    public static Connection getConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            return   DriverManager.getConnection(connectionURL,username,password);
        } catch (Exception e) {
            
            e.printStackTrace();
        }
        return null;
    }
    
    //關閉數據庫的鏈接
    public static void close(ResultSet rs,Statement stmt,Connection con) throws SQLException {
        if(rs!=null)
            rs.close();
        if(stmt!=null)
            stmt.close();
        if(con!=null)
            con.close();
    }
}
JDBCUtils.java

 

  轉帳資源操做【資源關閉】優化版

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC01 {

    public static void main(String[] args) throws SQLException  {
        transferAccount("a","b",1000);
    }

    public static void selectAll() throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //數據庫的鏈接
            con = JDBCUtils.getConnection();
            
            //數據庫的增刪改查
            stmt = con.createStatement();
            //返回一個結果集
            rs =stmt.executeQuery("select * from garytb");
            
            while(rs.next()) {
                //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
                System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
            }
        
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

    //校驗用戶
    public static boolean  selectByUernamePassword(String username,String password) throws SQLException {
        Connection con=null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
            con = DriverManager.getConnection(url,"root","123456");
            stmt =con.createStatement();
            String sql = "select * from garytb where username = '"+username+"' and password = '"+password+"'";
            //System.out.println(sql);
            rs = stmt.executeQuery(sql);
            
            if(rs.next()) {
                return true;
            }else {
                return false;
            }
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(rs!=null)
                rs.close();
            if(stmt!=null)
                stmt.close();
            if(con!=null)
                con.close();
        }
        
        return false;
    }

    public static boolean selectByUP2(String username,String password) throws SQLException{
        Connection con=null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
            con = DriverManager.getConnection(url,"root","123456");
            
            String sql = "select * from garytb where username = ? and password = ?";
            PreparedStatement pstmt = con.prepareStatement(sql);
            //添加參數
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            //進行查詢
            rs = pstmt.executeQuery();
                
            if(rs.next()) {
                return true;
            }else {
                return false;
            }
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(rs!=null)
                rs.close();
            if(stmt!=null)
                stmt.close();
            if(con!=null)
                con.close();
        }
        
        return false;
    }

    //pageNumber是頁數,第幾頁,pageCount是每頁顯示多少個數據
    public static void selectUserByPage(int pageNumber,int pageCount) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
                Connection con = null;
                PreparedStatement stmt = null;
                ResultSet rs = null;
                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    
                    //String url ="jdbc:mysql://localhost:3306/garysql";
                    //指定編碼查詢數據庫
                    String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
                    String user = "root";
                    String password = "123456";
                    //創建和數據庫的鏈接
                    con = DriverManager.getConnection(url,user,password);
                    
                    stmt = con.prepareStatement("select * from garytb limit ?,?");
                    stmt.setInt(1, (pageNumber-1)*pageCount );
                    stmt.setInt(2, pageCount);
                    
                    rs = stmt.executeQuery();
                    
                    while(rs.next()) {
                        //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
                        System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
                    }
                
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    if(rs!=null)
                        rs.close();
                    if(stmt!=null)
                        stmt.close();
                    if(con!=null)
                        con.close();
                }
    }

    //crud: create read update delete
    //插入語句
    public static void insert(String username,String password) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            String sql = "insert into garytb(username,password) values(?,?)";
            stmt = con.prepareStatement(sql);
            stmt.setString(1, username);
            stmt.setString(2, password);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("插入成功"+username);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    //刪除語句
    public static void delete(int id) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "delete from garytb where id = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, id);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            if(result>0) {
                System.out.println("刪除成功");
            }else {
                System.out.println("刪除失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    //修改語句
    public static void update(int id,String newPassword) throws SQLException {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "update garytb set password = ? where id = ?";
            stmt = con.prepareStatement(sql);
            stmt.setString(1, newPassword);
            stmt.setInt(2, id);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            if(result>0) {
                System.out.println("修改爲功");
            }else {
                System.out.println("修改失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

    //事物操做
    //由username1向username2轉帳金額
    public static void transferAccount(String username1,String username2,int money) throws SQLException {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "update garytb set balance = balance - ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username1);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            
            sql = "update garytb set balance = balance + ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username2);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("操做成功!!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    
}
JDBC01.java

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class JDBCUtils {
    
    private static final String connectionURL = "jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
    private static final String username = "root";
    private static final String password = "123";
    
    private static ArrayList<Connection> conList = new ArrayList<Connection>();
    
    static {
        for(int i =0;i<5;i++) {
            Connection con = createConnection();
            conList.add(con);
        }
    }
    
    public static Connection getConnection() {
        if(conList.isEmpty()==false) {
            Connection con = conList.get(0);
            conList.remove(con);
            return con;
        }else {
            return createConnection();
        }
    }
    
    
    private static Connection createConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            return DriverManager.getConnection(connectionURL, username, password);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return null;
    }
    
    public static void close(ResultSet rs,Statement stmt,Connection con) {
        closeResultSet(rs);
        closeStatement(stmt);
        closeConnection(con);
    }
    public static void close(Statement stmt1,Statement stmt2,Connection con) {
        closeStatement(stmt1);
        closeStatement(stmt2);
        closeConnection(con);
    }
    
    
    private static void closeResultSet(ResultSet rs ) {
        try {
            if(rs!=null)rs.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private static void closeStatement(Statement stmt) {
        try {
            if(stmt!=null)
                stmt.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private static void closeConnection(Connection con) {
//        try {
//            if(con!=null)con.close();
//        } catch (SQLException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
        conList.add(con);
    }
}
JDBCUtils.java

 

    //由username1向username2轉帳金額
    public static void transferAccount(String username1,String username2,int money) throws SQLException {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "update garytb set balance = balance - ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username1);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            
            sql = "update garytb set balance = balance + ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username2);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("操做成功!!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

 

 

2、在扣款和收款操做之間添加一個隱式異常

  當程序運行到異常代碼塊時,程序不會往下繼續執行,所以a方1000元已扣除但b方未收到1000元款項

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC01 {

    public static void main(String[] args) throws SQLException  {
        transferAccount("a","b",1000);
    }

    public static void selectAll() throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //數據庫的鏈接
            con = JDBCUtils.getConnection();
            
            //數據庫的增刪改查
            stmt = con.createStatement();
            //返回一個結果集
            rs =stmt.executeQuery("select * from garytb");
            
            while(rs.next()) {
                //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
                System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
            }
        
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

    //校驗用戶
    public static boolean  selectByUernamePassword(String username,String password) throws SQLException {
        Connection con=null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
            con = DriverManager.getConnection(url,"root","123456");
            stmt =con.createStatement();
            String sql = "select * from garytb where username = '"+username+"' and password = '"+password+"'";
            //System.out.println(sql);
            rs = stmt.executeQuery(sql);
            
            if(rs.next()) {
                return true;
            }else {
                return false;
            }
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(rs!=null)
                rs.close();
            if(stmt!=null)
                stmt.close();
            if(con!=null)
                con.close();
        }
        
        return false;
    }

    public static boolean selectByUP2(String username,String password) throws SQLException{
        Connection con=null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
            con = DriverManager.getConnection(url,"root","123456");
            
            String sql = "select * from garytb where username = ? and password = ?";
            PreparedStatement pstmt = con.prepareStatement(sql);
            //添加參數
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            //進行查詢
            rs = pstmt.executeQuery();
                
            if(rs.next()) {
                return true;
            }else {
                return false;
            }
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(rs!=null)
                rs.close();
            if(stmt!=null)
                stmt.close();
            if(con!=null)
                con.close();
        }
        
        return false;
    }

    //pageNumber是頁數,第幾頁,pageCount是每頁顯示多少個數據
    public static void selectUserByPage(int pageNumber,int pageCount) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
                Connection con = null;
                PreparedStatement stmt = null;
                ResultSet rs = null;
                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    
                    //String url ="jdbc:mysql://localhost:3306/garysql";
                    //指定編碼查詢數據庫
                    String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
                    String user = "root";
                    String password = "123456";
                    //創建和數據庫的鏈接
                    con = DriverManager.getConnection(url,user,password);
                    
                    stmt = con.prepareStatement("select * from garytb limit ?,?");
                    stmt.setInt(1, (pageNumber-1)*pageCount );
                    stmt.setInt(2, pageCount);
                    
                    rs = stmt.executeQuery();
                    
                    while(rs.next()) {
                        //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
                        System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
                    }
                
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    if(rs!=null)
                        rs.close();
                    if(stmt!=null)
                        stmt.close();
                    if(con!=null)
                        con.close();
                }
    }

    //crud: create read update delete
    //插入語句
    public static void insert(String username,String password) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            String sql = "insert into garytb(username,password) values(?,?)";
            stmt = con.prepareStatement(sql);
            stmt.setString(1, username);
            stmt.setString(2, password);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("插入成功"+username);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    //刪除語句
    public static void delete(int id) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "delete from garytb where id = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, id);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            if(result>0) {
                System.out.println("刪除成功");
            }else {
                System.out.println("刪除失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    //修改語句
    public static void update(int id,String newPassword) throws SQLException {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "update garytb set password = ? where id = ?";
            stmt = con.prepareStatement(sql);
            stmt.setString(1, newPassword);
            stmt.setInt(2, id);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            if(result>0) {
                System.out.println("修改爲功");
            }else {
                System.out.println("修改失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

    //事物操做
    //由username1向username2轉帳金額
    public static void transferAccount(String username1,String username2,int money)  {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "update garytb set balance = balance - ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username1);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            
            //顯示異常throw new Exception("出現錯誤");
            //隱示異常 空指針異常
            String s = null;
            s.charAt(2);
            
            sql = "update garytb set balance = balance + ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username2);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("操做成功!!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    
}
JDBC01.java

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class JDBCUtils {
    
    private static final String connectionURL = "jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
    private static final String username = "root";
    private static final String password = "123";
    
    private static ArrayList<Connection> conList = new ArrayList<Connection>();
    
    static {
        for(int i =0;i<5;i++) {
            Connection con = createConnection();
            conList.add(con);
        }
    }
    
    public static Connection getConnection() {
        if(conList.isEmpty()==false) {
            Connection con = conList.get(0);
            conList.remove(con);
            return con;
        }else {
            return createConnection();
        }
    }
    
    
    private static Connection createConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            return DriverManager.getConnection(connectionURL, username, password);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return null;
    }
    
    public static void close(ResultSet rs,Statement stmt,Connection con) {
        closeResultSet(rs);
        closeStatement(stmt);
        closeConnection(con);
    }
    public static void close(Statement stmt1,Statement stmt2,Connection con) {
        closeStatement(stmt1);
        closeStatement(stmt2);
        closeConnection(con);
    }
    
    
    private static void closeResultSet(ResultSet rs ) {
        try {
            if(rs!=null)rs.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private static void closeStatement(Statement stmt) {
        try {
            if(stmt!=null)
                stmt.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private static void closeConnection(Connection con) {
//        try {
//            if(con!=null)con.close();
//        } catch (SQLException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
        conList.add(con);
    }
}
JDBCUtils.java

 

    //由username1向username2轉帳金額
    public static void transferAccount(String username1,String username2,int money)  {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "update garytb set balance = balance - ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username1);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            
            //顯示異常throw new Exception("出現錯誤");
            //隱示異常 空指針異常
            String s = null;
            s.charAt(2);
            
            sql = "update garytb set balance = balance + ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username2);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("操做成功!!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

 

 

3、添加事物  

  一旦事物之間出現異常,則不會提交事物給數據庫

  //開啓事物 是否自動提交
  con.setAutoCommit(false);

  //當事物中全部事物都完成了纔會提交
  con.commit();

 

  當a向b轉帳1000元后出現異常,b未收到1000元,這一系列操做處於同一事物中,此事物有異常不會提交給程序

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC01 {

    public static void main(String[] args) throws SQLException  {
        transferAccount("a","b",1000);
    }

    public static void selectAll() throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //數據庫的鏈接
            con = JDBCUtils.getConnection();
            
            //數據庫的增刪改查
            stmt = con.createStatement();
            //返回一個結果集
            rs =stmt.executeQuery("select * from garytb");
            
            while(rs.next()) {
                //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
                System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
            }
        
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

    //校驗用戶
    public static boolean  selectByUernamePassword(String username,String password) throws SQLException {
        Connection con=null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
            con = DriverManager.getConnection(url,"root","123456");
            stmt =con.createStatement();
            String sql = "select * from garytb where username = '"+username+"' and password = '"+password+"'";
            //System.out.println(sql);
            rs = stmt.executeQuery(sql);
            
            if(rs.next()) {
                return true;
            }else {
                return false;
            }
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(rs!=null)
                rs.close();
            if(stmt!=null)
                stmt.close();
            if(con!=null)
                con.close();
        }
        
        return false;
    }

    public static boolean selectByUP2(String username,String password) throws SQLException{
        Connection con=null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
            con = DriverManager.getConnection(url,"root","123456");
            
            String sql = "select * from garytb where username = ? and password = ?";
            PreparedStatement pstmt = con.prepareStatement(sql);
            //添加參數
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            //進行查詢
            rs = pstmt.executeQuery();
                
            if(rs.next()) {
                return true;
            }else {
                return false;
            }
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(rs!=null)
                rs.close();
            if(stmt!=null)
                stmt.close();
            if(con!=null)
                con.close();
        }
        
        return false;
    }

    //pageNumber是頁數,第幾頁,pageCount是每頁顯示多少個數據
    public static void selectUserByPage(int pageNumber,int pageCount) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
                Connection con = null;
                PreparedStatement stmt = null;
                ResultSet rs = null;
                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    
                    //String url ="jdbc:mysql://localhost:3306/garysql";
                    //指定編碼查詢數據庫
                    String url ="jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
                    String user = "root";
                    String password = "123456";
                    //創建和數據庫的鏈接
                    con = DriverManager.getConnection(url,user,password);
                    
                    stmt = con.prepareStatement("select * from garytb limit ?,?");
                    stmt.setInt(1, (pageNumber-1)*pageCount );
                    stmt.setInt(2, pageCount);
                    
                    rs = stmt.executeQuery();
                    
                    while(rs.next()) {
                        //System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getString(3));
                        System.out.println(rs.getString("id")+","+rs.getString("username")+","+rs.getString("password"));
                    }
                
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    if(rs!=null)
                        rs.close();
                    if(stmt!=null)
                        stmt.close();
                    if(con!=null)
                        con.close();
                }
    }

    //crud: create read update delete
    //插入語句
    public static void insert(String username,String password) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            String sql = "insert into garytb(username,password) values(?,?)";
            stmt = con.prepareStatement(sql);
            stmt.setString(1, username);
            stmt.setString(2, password);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("插入成功"+username);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    //刪除語句
    public static void delete(int id) throws SQLException {
        //註冊驅動    使用驅動鏈接數據庫
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "delete from garytb where id = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, id);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            if(result>0) {
                System.out.println("刪除成功");
            }else {
                System.out.println("刪除失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    //修改語句
    public static void update(int id,String newPassword) throws SQLException {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            String sql = "update garytb set password = ? where id = ?";
            stmt = con.prepareStatement(sql);
            stmt.setString(1, newPassword);
            stmt.setInt(2, id);
            int result =stmt.executeUpdate();// 返回值表明收到影響的行數
            if(result>0) {
                System.out.println("修改爲功");
            }else {
                System.out.println("修改失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }

    //事物操做
    //由username1向username2轉帳金額
    public static void transferAccount(String username1,String username2,int money)  {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            //開啓事物 是否自動提交
            con.setAutoCommit(false);
            
            String sql = "update garytb set balance = balance - ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username1);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            
            //顯示異常throw new Exception("出現錯誤");
            //隱示異常 空指針異常
            
            
            sql = "update garytb set balance = balance + ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username2);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("操做成功!!");
            
            //提交事務
            //當事物中全部事物都完成了纔會提交
            con.commit();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
    
}
JDBC01.java

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class JDBCUtils {
    
    private static final String connectionURL = "jdbc:mysql://localhost:3306/garysql?useUnicode=true&characterEncoding=UTF8&useSSL=false";
    private static final String username = "root";
    private static final String password = "123";
    
    private static ArrayList<Connection> conList = new ArrayList<Connection>();
    
    static {
        for(int i =0;i<5;i++) {
            Connection con = createConnection();
            conList.add(con);
        }
    }
    
    public static Connection getConnection() {
        if(conList.isEmpty()==false) {
            Connection con = conList.get(0);
            conList.remove(con);
            return con;
        }else {
            return createConnection();
        }
    }
    
    
    private static Connection createConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            return DriverManager.getConnection(connectionURL, username, password);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return null;
    }
    
    public static void close(ResultSet rs,Statement stmt,Connection con) {
        closeResultSet(rs);
        closeStatement(stmt);
        closeConnection(con);
    }
    public static void close(Statement stmt1,Statement stmt2,Connection con) {
        closeStatement(stmt1);
        closeStatement(stmt2);
        closeConnection(con);
    }
    
    
    private static void closeResultSet(ResultSet rs ) {
        try {
            if(rs!=null)rs.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private static void closeStatement(Statement stmt) {
        try {
            if(stmt!=null)
                stmt.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    private static void closeConnection(Connection con) {
//        try {
//            if(con!=null)con.close();
//        } catch (SQLException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
        conList.add(con);
    }
}

    
JDBCUtils.java

 

//事物操做
    //由username1向username2轉帳金額
    public static void transferAccount(String username1,String username2,int money)  {
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = JDBCUtils.getConnection();
            
            //開啓事物 是否自動提交
            con.setAutoCommit(false);
            
            String sql = "update garytb set balance = balance - ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username1);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            
            //顯示異常throw new Exception("出現錯誤");
            //隱示異常 空指針異常
            
            
            sql = "update garytb set balance = balance + ? where username = ?";
            stmt = con.prepareStatement(sql);
            stmt.setInt(1, money);
            stmt.setString(2, username2);
            stmt.executeUpdate();// 返回值表明收到影響的行數
            System.out.println("操做成功!!");
            
            //提交事務
            //當事物中全部事物都完成了纔會提交
            con.commit();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, con);
        }
    }
相關文章
相關標籤/搜索