


package day02;import java.sql.Connection;import java.sql.PReparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import org.junit.Test;import smis.unit.JdbcUnit;public class SwTest { @Test public void testNoSW() throws Exception { // 查詢是否有錢 String sql = "SELECT * FROM account WHERE name = ? and balance >= ?"; Connection conn = JdbcUnit.getConn(); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, "張無忌"); ps.setInt(2, 1000); ResultSet rs = ps.executeQuery(); if (!rs.next()) { throw new RuntimeException("親,你的余額不足!"); } // 扣除張無忌的1000 sql = "UPDATE account SET balance = balance - ? WHERE name = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, 1000); ps.setString(2, "張無忌"); ps.executeUpdate(); // 趙敏增加1000 sql = "UPDATE account SET balance = balance + ? WHERE name = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, 1000); ps.setString(2, "趙敏"); ps.executeUpdate(); JdbcUnit.close(conn, ps, rs); } @Test public void testSW() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 查詢是否有錢 String sql = "SELECT * FROM account WHERE name = ? and balance >= ?"; conn = JdbcUnit.getConn(); //取消事務的自動提交 conn.setAutoCommit(false); ps = conn.prepareStatement(sql); ps.setString(1, "張無忌"); ps.setInt(2, 1000); rs = ps.executeQuery(); if (!rs.next()) { throw new RuntimeException("親,你的余額不足!"); } // 扣除張無忌的1000 sql = "UPDATE account SET balance = balance - ? WHERE name = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, 1000); ps.setString(2, "張無忌"); ps.executeUpdate(); // 趙敏增加1000 sql = "UPDATE account SET balance = balance + ? WHERE name = ?"; ps = conn.prepareStatement(sql); ps.setInt(1, 1000); ps.setString(2, "趙敏"); ps.executeUpdate(); //提交事務 conn.commit(); } catch (Exception e) { e.printStackTrace(); try { //回滾事務 conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } finally { JdbcUnit.close(conn, ps, rs); } }}批處理操作
package day02._02_batch;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Statement;import org.junit.Test;import smis.unit.JdbcUnit;public class BatchTest { /** * @param args */ @Test //InnoDB 4443 //MyISAM 1220 public void testInsertByStatementBatch() throws Exception{ Connection conn = JdbcUnit.getConn(); Statement st = conn.createStatement(); long begin = System.currentTimeMillis(); for(int i=1;i<=1000;i++){ String sql = "INSERT INTO t_student (age) VALUES ("+i+")"; st.addBatch(sql); if(i%200==0){ st.executeBatch();//執(zhí)行批量語句 st.clearBatch();//清理批處理中的緩存 } } System.out.println(System.currentTimeMillis() - begin); JdbcUnit.close(conn, st, null); } //InnoDB 5308 //MyISAM 2570 public static void main(String[] args) throws Exception { String sql = "INSERT INTO t_student (age) VALUES (?)"; Connection conn = JdbcUnit.getConn(); PreparedStatement ps = conn.prepareStatement(sql); long begin = System.currentTimeMillis(); for(int i =0;i<=1000;i++){ ps.setInt(1, i); ps.addBatch(); if(i%200 == 0){ ps.executeBatch(); ps.clearBatch(); ps.clearParameters(); // 這里和上面的Statement不一樣,需要清理參數(shù) } } System.out.println(System.currentTimeMillis() - begin); JdbcUnit.close(conn, ps, null); } }不知道為什么使用PreparedStatement Junit不行,于是乎直接main吧!
獲取自動生成的主鍵
在注冊頁面的時候,一開始只需要賬戶和密碼,點擊注冊后會讓你更新資料,這個時候就需要獲取自動生成的主鍵了
連接池思想
為什么必須使用數(shù)據(jù)庫連接池:
普通的JDBC數(shù)據(jù)庫連接(Connectiond對象)使用 DriverManager來獲取,每次向數(shù)據(jù)庫建立連接的時候都要將 Connection 加載到內(nèi)存中,再驗證用戶名和密碼(得花費0.05s~1s的時間),數(shù)據(jù)庫的連接是比較昂貴的(創(chuàng)建的成本比較大)。
需要數(shù)據(jù)庫連接的時候,就向數(shù)據(jù)庫要求一個,執(zhí)行完成后再斷開連接。這樣的方式將會消耗大量的資源和時間。
數(shù)據(jù)庫的連接資源并沒有得到很好的重復利用.若同時有幾百人甚至幾千人在線,頻繁的進行數(shù)據(jù)庫連接操作將占用很多的系統(tǒng)資源,嚴重的甚至會造成服務器的崩潰
dbcp連接池
新聞熱點
疑難解答