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); } } }
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(); } }
轉帳資源操做【資源關閉】優化版
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); } } }
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); } }
//由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); } } }
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); } }
//由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); } } }
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); } }
//事物操做 //由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); } }