天天看點

JDBC入門八:封裝一個DbUtils工具類;以及新增、更新、删除資料;(這三個操作均采用PreparedStatement)一.封裝DbUtils工具類:二:新增、更新、删除實作 

本篇部落格還是沿用JDBC入門五:一個按部門查詢員工功能的例子這篇部落格中的接口:

本篇部落格篇幅很長,但核心内容就3點:(1)DbUtils;(2)【新增、更新、删除資料】的方法;(3)整體的包結構和類組織的套路;

目錄

一.封裝DbUtils工具類:

二:新增、更新、删除實作 

1.新增(寫操作):InsertCommand類

2.更新:UpdateCommand類

3.删除:DeleteCommand類

4.Command接口内容

5.入口類:HumanResourceApplication類

一.封裝DbUtils工具類:

【建立資料庫連接配接】和【關閉資料庫連接配接】的代碼,需要經常用到。可以把這些需要重複使用的代碼做成一個工具類,就是DbUtils工具類;

JDBC入門八:封裝一個DbUtils工具類;以及新增、更新、删除資料;(這三個操作均采用PreparedStatement)一.封裝DbUtils工具類:二:新增、更新、删除實作 

DbUtils類:這個類沒什麼好說的,看下代碼中的注釋。

package com.imooc.jdbc.common;

import java.sql.*;

public class DbUtils {

    /**
     * 建立資料庫連接配接
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public static Connection getConnection() throws SQLException, ClassNotFoundException {
        //加載并注冊JDBC驅動,和,建立資料庫連接配接會産生異常;
        // 這兒将異常抛出,而不是捕獲;在實際調用這個getConnection()方法的時候,再對這個異常捕獲
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/imooc?useSSL=false&useUincode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true", "root", "12345");
        return conn;
    }

    /**
     * 關閉資料庫連接配接
     * 注:因為關閉方法中,在關閉前都做了判斷是不是null,是以當實參是null的時候也是沒問題的。即比如新增、删除、更新操作沒有ResultSet,因為這兒ResultSet形參可以為null;是以,插叙,新增,删除,更新都可以調用這個方法;
     * @param rs:結果集對象;
     * @param stmt:執行SQL的Statement對象;這兒的形參是Statement類型,因為PrepareStatement是Statement的子接口,是以當實參是PrepareStatement類型的時候也沒問題。
     * @param conn:連接配接對象;
     */
    public  static void closeConnection(ResultSet rs, Statement stmt,Connection conn){
        try {
            if (rs != null) {  // 如果rs != null,代表rs被執行個體化了,是以這兒需要關閉一下,進行釋放;
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (stmt != null) {  // 如果rs != null,代表stmt被執行個體化了,是以這兒需要關閉一下,進行釋放;
                stmt.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (conn != null && conn.isClosed() == false) {  // conn.isClosed()==false代表這個連接配接還沒有關閉,還正在使用中;
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}
           

二:新增、更新、删除實作 

包結構:

JDBC入門八:封裝一個DbUtils工具類;以及新增、更新、删除資料;(這三個操作均采用PreparedStatement)一.封裝DbUtils工具類:二:新增、更新、删除實作 

1.新增(寫操作):InsertCommand類

        (1)新增操作需要使用PreparedStatement(因為PreparedStatement可以進行參數化設定啊);

        (2)新增使用PreparedStatement對象的executeUpdate()方法;

        (3)executeUpdate()方法傳回值:本次寫操作所影響的資料庫的行數;

        (4)和查詢不同,新增操作沒有傳回結果集;而是傳回了一個(3)中的影響資料庫的行數;

JDBC入門八:封裝一個DbUtils工具類;以及新增、更新、删除資料;(這三個操作均采用PreparedStatement)一.封裝DbUtils工具類:二:新增、更新、删除實作 

InsertCommand類:

package com.imooc.jdbc.command;

import com.imooc.jdbc.common.DbUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class InsertCommand implements Command{

    @Override
    public void execute() {
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入員工編号:");
        int eno = in.nextInt();
        System.out.println("請輸入員工姓名");
        String ename = in.next();
        System.out.println("請輸入員工薪資:");
        Float salary = in.nextFloat();
        System.out.println("請輸入隸屬部門:");
        String dname = in.next();
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = DbUtils.getConnection();
            String sql = "insert into employee(eno,ename,salary,dname) values(?,?,?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,eno);
            pstmt.setString(2,ename);
            pstmt.setFloat(3, salary);
            pstmt.setString(4, dname);
            int cnt = pstmt.executeUpdate();
            System.out.println(cnt);
            System.out.println(dname+"員工入職手續已辦理。");
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            DbUtils.closeConnection(null, pstmt, conn);
        }
    }
}
           

2.更新:UpdateCommand類

        (1)更新也是使用PreparedStatement對象的executeUpdate()方法;

        (2)executeUpdate()方法的傳回值也是本次更新操作所影響的資料庫的行數;

JDBC入門八:封裝一個DbUtils工具類;以及新增、更新、删除資料;(這三個操作均采用PreparedStatement)一.封裝DbUtils工具類:二:新增、更新、删除實作 

UpdateCommand類:

package com.imooc.jdbc.command;

import com.imooc.jdbc.common.DbUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class UpdateCommand implements Command{

    @Override
    public void execute() {
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入員工編号:");
        int eno = in.nextInt();
        System.out.println("請輸入員工薪資:");
        Float salary = in.nextFloat();
        Connection conn = null;
        PreparedStatement pstmt = null;
        Command command = null;

        try {
            conn = DbUtils.getConnection();
            String sql = "update employee set salary=? where eno=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setFloat(1,salary);
            pstmt.setInt(2,eno);
            int cnt = pstmt.executeUpdate();
            if (cnt == 1) {
                System.out.println(eno + "員工薪資調整完畢。");
            } else {
                System.out.println(eno + "員工不存在。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            DbUtils.closeConnection(null,pstmt,conn);
        }

    }
}
           

3.删除:DeleteCommand類

        (1)删除也是使用PreparedStatement對象的executeUpdate()方法;

        (2)executeUpdate()方法的傳回值也是本次删除操作所影響的資料庫的行數;可能傳回1,也可能傳回0(表示本次删除操作沒有删除任何一條資料);

JDBC入門八:封裝一個DbUtils工具類;以及新增、更新、删除資料;(這三個操作均采用PreparedStatement)一.封裝DbUtils工具類:二:新增、更新、删除實作 

DeleteCommand類:

package com.imooc.jdbc.command;

import com.imooc.jdbc.common.DbUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class DeleteCommand implements Command {

    /**
     * 删除員工
     */
    @Override
    public void execute() {
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入員工編号:");
        int eno = in.nextInt();
        Connection conn = null;
        PreparedStatement pstmt = null;
        Command command = null;

        try {
            conn = DbUtils.getConnection();
            String sql = "delete from employee where eno=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,eno);
            int cnt = pstmt.executeUpdate();
            if (cnt == 1) {
                System.out.println(eno + "員工離職成功。");
            } else {
                System.out.println(eno + "員工不存在。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            DbUtils.closeConnection(null,pstmt,conn);
        }
    }
}
           

4.Command接口内容

package com.imooc.jdbc.command;

/**
 * 操作資料庫的接口;
 */
public interface Command {
    public void execute();
}
           

5.入口類:HumanResourceApplication類

package com.imooc.jdbc.hrapp;

import com.imooc.jdbc.command.*;

import java.util.Scanner;

public class HumanResourceApplication {
    public static void main(String[] args) {
        System.out.println("1-查詢部門員工");
        System.out.println("2-辦理員工入職");
        System.out.println("3-調整薪資");
        System.out.println("4-員工離職");
        System.out.println("請選擇功能:");
        Scanner in = new Scanner(System.in);
        Integer cmd = in.nextInt();
        Command command = null;// 将接口變量定義在外邊,并初始化為null;在内部遇到不同操作的時候,再去執行個體化與之對應的類;
        switch (cmd){
            case 1: //查詢部門員工
                command = new PstmtQueryCommand();
                command.execute();
                break;
            case 2: //辦理員工入職
                command = new InsertCommand();
                command.execute();
                break;
            case 3: //調整薪資
                command = new UpdateCommand();
                command.execute();
                break;
            case 4: //員工離職
                command = new DeleteCommand();
                command.execute();
            default:
        }
    }
}