JDBC技術(三)

JDBC技術(一):
https://blog.csdn.net/Veer_c/article/details/103845176
JDBC技術(二):
https://blog.csdn.net/Veer_c/article/details/103879890
JDBC技術(三):
https://blog.csdn.net/Veer_c/article/details/103880021
JDBC技術(四):
https://blog.csdn.net/Veer_c/article/details/103882264

JDBC工具類:

在上次我們使用的工具類中,我們只能使用mysql的數據庫獲取連接,如果要做修改則會很麻煩,這就是我們將代碼寫的“太死了“,我們可以通過properties集合的方式,將代碼寫入文件中,最後將文件中內容讀取出來,這樣在以後的修改中,只需要修改文件內容就好了。

package com.jdbc.util;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtil {
    private static String url = null;
    private static String user = null;
    private static String password = null;
    private static String className = null;
    static{
        //隨着類的加載而夾在
        try {
            //使用properties這個類,將配置文件中的鍵值對加載到集合中
            Properties prop = new Properties();
            prop.load(new FileInputStream("db.properties"));
            url = prop.getProperty("url");
            user = prop.getProperty("user");
            password = prop.getProperty("password");
            className = prop.getProperty("className");
            Class.forName(className);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //獲取連接
    public static Connection getConn(){
        //註冊驅動
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;        
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
    //釋放資源
    public static void close(Connection conn,Statement stmt,ResultSet rs){
        if (conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (stmt!=null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

最後在我們的文件中,添加進去相關的數據庫連接

url=jdbc:mysql://localhost:3306/day20
user=root
password=root
className=com.mysql.jdbc.Driver

使用JDBC進行批處理

在我們之前,我們一次操作只能發送一句sql語句,如果我們要插入2000條數據的話,用IO流的話,效率也不是很高,我們可以利用sql緩衝區,一次發送多條語句到數據庫服務端來執行,這個就稱之爲批處理。
Statement : addBatch(String sql) 添加到sql緩衝區,暫時不發送,
 int exxcuteBatch() 發送批次處理命令,發送所有的緩衝區內容,
 void clearBatch() 清空所有的緩衝區內容
PreparedStatement() : void addBatch() 添加到sql緩衝區
int[] executeBatch() 執行緩衝區的所有sql語句
void clearBatch() 清空緩衝區

package com.jdbc.a_statement_preparedstatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import com.jdbc.util.JDBCUtil;
public class Test {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        //testStatement();//不使用批處理的情況下,給學生表中插入2000條數據,6230
        //testStatementBatch();//使用批處理的情況下,給學生表中插入2000條數據,6170
        //testPreparedStatement();//6240
        testPreparedStatementBatch();//6210
        long endTime = System.currentTimeMillis();
        System.out.println(endTime-startTime);
    }
    private static void testPreparedStatementBatch() {
        Connection conn = null;
        PreparedStatement stmt = null;
        try{
            conn  = JDBCUtil.getConn();
            //創建一個動態的sql語句
            String sql  = "insert into stu values(?,?);";
            stmt = conn.prepareStatement(sql);
            //型數據庫插入2000條數據,一次插入一條
            for (int i = 1; i <=2000; i++) {
                stmt.setInt(1, i);
                stmt.setString(2, "劉德華");
                stmt.addBatch();
                //判斷每20條發送一次
                if (i%20==0) {
                    stmt.executeBatch();
                    //清空緩存區
                    stmt.clearBatch();
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //釋放資源
            JDBCUtil.close(conn, stmt, null);
        }
    }
    private static void testPreparedStatement() {
        Connection conn = null;
        PreparedStatement stmt = null;
        try{
            conn  = JDBCUtil.getConn();
            //創建一個動態的sql語句
            String sql  = "insert into stu values(?,?);";
            stmt = conn.prepareStatement(sql);
            //型數據庫插入2000條數據,一次插入一條
            for (int i = 1; i <=2000; i++) {
                stmt.setInt(1, i);
                stmt.setString(2, "劉德華");
                //發送參數
                stmt.executeUpdate();
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //釋放資源
            JDBCUtil.close(conn, stmt, null);
        }
    }
    private static void testStatementBatch() {
        Connection conn  =null;
        Statement stmt = null;
        try{
            //獲取連接
            conn = JDBCUtil.getConn();
            //獲取statement對象
            stmt = conn.createStatement();
            //每次給stmt這個命令行中添加20條sql語句,一次性進行發送
            for (int i = 1; i <=2000; i++) {
                String sql  = "insert into stu values("+i+",'劉德華');";
                //將這個sql先暫時添加在stmt的命令行中
                stmt.addBatch(sql);
                if (i%20==0) {
                    //批量發送sql
                    stmt.executeBatch();
                    //清空stmt的命令行列表
                    stmt.clearBatch();
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //釋放資源
            JDBCUtil.close(conn, stmt, null);
        }
    }
    private static void testStatement() {
        Connection conn  =null;
        Statement stmt = null;
        try{
            //獲取連接
            conn = JDBCUtil.getConn();
            //獲取statement對象
            stmt = conn.createStatement();
            //給數據庫發送2000次sql語句,插入數據
            for (int i = 1; i <=2000; i++) {
                String sql  = "insert into stu values("+i+",'劉德華');";
                //給數據庫發送sql
                stmt.executeUpdate(sql);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //釋放資源
            JDBCUtil.close(conn, stmt, null);
        }
    }
}

JDBC獲取自增長值

比如有倆張表,一張員工表,一張是部門表,在部門表中出入一個新的部門後,要在員工表中也插入一個新的員工,要求同時實現,這就要用到自增長值。

package com.jdbc.c_autoincrement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import com.jdbc.util.JDBCUtil;
public class IncrementDemo {
    public static void main(String[] args) {
        //需求:在給部門表插入一條數據的同時,再給員工表中剛剛插入的該部門插入一條員工數據
        /**
         * 1.給部門表中插入一個新的部門“財務部”
         * 2.獲取財務部對應的id
         * 3.給員工表中插入一條員工數據,對應的部門就是財務部對應的id     */
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try{
            conn  =JDBCUtil.getConn();
            String sql1 = "insert into dept(deptName) values(?)";
            String sql2 = "insert into employee(name,deptId) values(?,?);";
            //先給部門表中插入一條數據
            //PreparedStatement prepareStatement(String sql,int autoGeneratedKeys)
            stmt  = conn.prepareStatement(sql1, Statement.RETURN_GENERATED_KEYS);
            stmt.setString(1, "財務部");
            stmt.executeUpdate();
            //獲取自增長的鍵值
            //ResultSet getGeneratedKeys()
            rs = stmt.getGeneratedKeys();//rs就是一個自增站的鍵的一個結果集
            int deptId = 0;
            while (rs.next()) {
                deptId = rs.getInt(1);
            }
            //給員工表中插入一條數據
            stmt = conn.prepareStatement(sql2);
            stmt.setString(1, "岳雲鵬");
            stmt.setInt(2, deptId);
            //發送參數並執行sql
            stmt.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //釋放資源
        }
    }
}

JDBC技術(一):
https://blog.csdn.net/Veer_c/article/details/103845176
JDBC技術(二):
https://blog.csdn.net/Veer_c/article/details/103879890
JDBC技術(三):
https://blog.csdn.net/Veer_c/article/details/103880021
JDBC技術(四):
https://blog.csdn.net/Veer_c/article/details/103882264

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章