JDBC(三)封裝工具類和模糊查詢和行級鎖

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);
        }
    }
}
相關文章
相關標籤/搜索