MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物

 

 

  dbcp下载  传送门

  Commons Pool下载  传送门

  Commons log下载  传送门

 

  MySQL_(Java)【事物操作】使用JDBC模拟银行转账向数据库发起修改请求  传送门

  MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池  传送门

 

  DBCP(DataBase Connection Pool):数据库连接池,是Java数据库连接池的一种,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开百度百科

 

  模拟银行由a向b转账1000元操作,使用事物+DBCP连接池

 

MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物

  

MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物
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 stmt1 = null;
        PreparedStatement stmt2 = null;
        ResultSet rs = null;
        try {
            con = DBCPDataSource.getConnection();
            
            //开启事物 是否自动提交
            con.setAutoCommit(false);
            
            String sql = "update garytb set balance = balance - ? where username = ?";
            stmt1 = con.prepareStatement(sql);
            stmt1.setInt(1, money);
            stmt1.setString(2, username1);
            stmt1.executeUpdate();// 返回值代表收到影响的行数
            
            //显示异常throw new Exception("出现错误");
            //隐示异常 空指针异常
            //String s = null;
            //s.charAt(2);
            
            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("操作成功!!");
            
            //提交事务
            //当事物中所有事物都完成了才会提交
            con.commit();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCPDataSource.close(stmt2, stmt1, con);
        }
    }
    
}
JDBC01.java

 

MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物
import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp2.BasicDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBCPDataSource {
    
    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 = "123456";
    
    private static BasicDataSource ds;
    
    //静态代码块:当整个程序执行的时候,优先加载静态代码块
    static {
        //初始化dbcp数据源
        ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl(connectionURL);
        ds.setUsername(username);
        ds.setPassword(password);
        
        //初始化连接池5个
        ds.setInitialSize(5);
        //连接池最多个数20个
        ds.setMaxTotal(20);
        //最小的空闲连接
        ds.setMinIdle(3);
    }
    
    public static Connection getConnection()  {
        try {
            //通过dbcp得到的连接,不需要归还,直接close就可以
            return ds.getConnection();
        } catch (SQLException 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();//这里会把链接归还给dbcp连接池,并不是真正的断开链接
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
}
DBCPDataSource.java

 

  a向b转账事物方法

//事物操作
    //由username1向username2转账金额
    public static void transferAccount(String username1,String username2,int money)  {
        Connection con = null;
        PreparedStatement stmt1 = null;
        PreparedStatement stmt2 = null;
        ResultSet rs = null;
        try {
            con = DBCPDataSource.getConnection();
            
            //开启事物 是否自动提交
            con.setAutoCommit(false);
            
            String sql = "update garytb set balance = balance - ? where username = ?";
            stmt1 = con.prepareStatement(sql);
            stmt1.setInt(1, money);
            stmt1.setString(2, username1);
            stmt1.executeUpdate();// 返回值代表收到影响的行数
            
            //显示异常throw new Exception("出现错误");
            //隐示异常 空指针异常
            //String s = null;
            //s.charAt(2);
            
            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("操作成功!!");
            
            //提交事务
            //当事物中所有事物都完成了才会提交
            con.commit();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBCPDataSource.close(stmt2, stmt1, con);
        }
    }

 

上一篇:IOS面试攻略


下一篇:10、JDBC-DBCP