MySQL_(Java)【连接池】使用DBCP简单模拟银行转账事物
dbcp下载 传送门
Commons Pool下载 传送门
Commons log下载 传送门
MySQL_(Java)【事物操作】使用JDBC模拟银行转账向数据库发起修改请求 传送门
MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池 传送门
DBCP(DataBase Connection Pool):数据库连接池,是Java数据库连接池的一种,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开【百度百科】
模拟银行由a向b转账1000元操作,使用事物+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); } } }
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(); } } }
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); } }
(如需转载学习,请标明出处)