package JDBC.utils; /** * JDBC工具類.簡化JDBC編程 * @author Max_Hu * */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtil { //工具類的構造方法都是私有的, //由於其中的方法都是靜態的,不須要new對象,直接用類名調用 private DBUtil() {} static { //靜態代碼塊在類加載時執行,並只執行一次 //註冊驅動只須要走一次 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 獲取數據庫鏈接對象 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","333"); } /** * 釋放資源 * @param conn * @param st * @param rs */ public static void close(Connection conn,Statement st, ResultSet rs) { try { if(rs!=null) { rs.close(); } } catch (Exception e) { e.printStackTrace(); } try { if(st!=null) { st.close(); } } catch (Exception e) { e.printStackTrace(); }try { if(conn!=null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } } }
作模糊查詢並驗證工具類是否好用
模糊查詢時,傳值傳模糊字符,而不是在預編譯語句中模糊處理java
package JDBC; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import JDBC.utils.DBUtil; public class fuzzy_query { public static void main(String[] args) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { //獲取鏈接 conn=DBUtil.getConnection(); //獲取預編譯的數據庫操做對象 String sql="select ename from emp where ename like ?"; ps=conn.prepareStatement(sql); ps.setString(1, "_A%"); rs=ps.executeQuery(); while(rs.next()) { System.out.println(rs.getString("ename")); } } catch (Exception e) { e.printStackTrace(); }finally { //釋放資源 DBUtil.close(conn, ps, rs); } } }
行級鎖(悲觀鎖)在select語句後面添加for update
悲觀鎖:事務必須排隊,數據鎖住了,不容許併發
樂觀鎖:支持併發,事務不須要排隊,但須要一個版本號node
建立兩個類
該類用來鎖定記錄mysql
package JDBC; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import JDBC.utils.DBUtil; /** * 開啓一個事務,專門進行查詢,使用悲觀鎖鎖住相關記錄 * * @author Max_Hu * */ public class row_locking { public static void main(String[] args) { Connection connection = null; PreparedStatement ps = null; ResultSet rs = null; try { connection = DBUtil.getConnection(); // 開啓事務 connection.setAutoCommit(false); String sql = "select ename,job,sal from emp where job=? for update"; ps = connection.prepareStatement(sql); ps.setString(1, "MANAGER"); rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getString("ename") + "," + rs.getString("job") + "," + rs.getDouble("sal")); } // 提交事務(事務結束) //在提交語句打斷點進行Debug,而後執行第二個程序 connection.commit(); } catch (SQLException e) { if (connection != null) { try { // 回滾事務(事務結束) connection.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } e.printStackTrace(); } finally { DBUtil.close(connection, ps, rs); } } }
第二個類,用來修改被鎖住的記錄
在第一個類debug沒有結束的時候,該類不能修改被鎖住的數據,
當第一個類debug結束的時候,該程序才正常執行sql
package JDBC; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.swing.border.EmptyBorder; import JDBC.utils.DBUtil; /** * 負責修改被鎖定的記錄 * * @author Max_Hu * */ public class row_locking02 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; try { conn = DBUtil.getConnection(); conn.setAutoCommit(false); String sql = "update emp set sal=sal*1.1 where job=?"; ps = conn.prepareStatement(sql); ps.setString(1, "MANAGER"); int count = ps.executeUpdate(); System.out.println(count); conn.commit(); } catch (SQLException e) { if (conn != null) { try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } e.printStackTrace(); } finally { DBUtil.close(conn, ps, null); } } }