首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java JDBC 操作 SQL Server 完整教程:驅動配置、連接池與 CRUD 實戰

     編輯:Java 相關知識

JDBC 是 Java 訪問關係數據庫的標準 API。本文以 SQL Server 為例,從驅動下載、連接建立、CRUD 操作到資源管理,提供完整可運行的實戰代碼。

環境準備

  1. 下載 Microsoft JDBC Driver for SQL Server (mssql-jdbc-x.x.x.jre8.jar)
  2. 項目導入:Build Path → Add External JARs 選中驅動包
  3. 數據庫建表示例:
    CREATE DATABASE java_conn_test;
    USE java_conn_test;
    CREATE TABLE tb_User (
        UserId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
        UserName NVARCHAR(50),
        UserPwd NVARCHAR(50)
    );

核心類設計

1. 連接管理類

public class SelectQuery {
    private Connection conn;
    
    public Connection getConnection() {
        try {
            // 1. 加載驅動(JDBC 4.0+ 可省略,SPI 自動發現)
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            System.out.println("驅動加載成功");
            
            // 2. 建立連接
            String url = "jdbc:sqlserver://localhost:1433;DatabaseName=java_conn_test";
            conn = DriverManager.getConnection(url, "sa", "123456");
            
            if (conn != null) System.out.println("數據庫連接成功");
            else System.out.println("數據庫連接失敗");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
}

2. CRUD 操作類

public class StartMain {
    private static Connection conn;
    
    public static void main(String[] args) {
        conn = new SelectQuery().getConnection();
        GetInsert(); GetSelect(); GetUpdate(); GetSelect(); GetDelete(); GetSelect();
    }
    
    // INSERT
    public static void GetInsert() {
        if (conn == null) return;
        String sql = "INSERT INTO tb_User (UserName, UserPwd, UserId) VALUES ('name_" 
            + (int)(Math.random()*5000) + "','pwd_" + (int)(Math.random()*5000) + "', NEWID())";
        executeUpdate(sql, "添加");
    }
    
    // SELECT
    public static void GetSelect() {
        if (conn == null) return;
        String sql = "SELECT * FROM tb_User";
        try (PreparedStatement ps = conn.prepareStatement(sql);
             ResultSet rs = ps.executeQuery()) {
            while (rs.next()) {
                System.out.println(rs.getString("UserName") + "\t" 
                    + rs.getString("UserPwd") + "\t" + rs.getString("UserId"));
            }
            System.out.println("查詢成功");
        } catch (Exception e) { System.out.println("查詢失敗"); e.printStackTrace(); }
    }
    
    // UPDATE
    public static void GetUpdate() {
        if (conn == null) return;
        String sql = "UPDATE tb_User SET UserPwd=UserPwd+'xxxxxxxx' WHERE UserId='指定UUID'";
        executeUpdate(sql, "修改");
    }
    
    // DELETE
    public static void GetDelete() {
        if (conn == null) return;
        String sql = "DELETE FROM tb_User WHERE UserId!='指定UUID'";
        executeUpdate(sql, "刪除");
    }
    
    // 通用增刪改
    private static void executeUpdate(String sql, String op) {
        try (Statement stmt = conn.createStatement()) {
            int result = stmt.executeUpdate(sql);
            System.out.println(result > 0 ? op + "成功" : op + "失敗");
        } catch (Exception e) { 
            System.out.println(op + "失敗"); e.printStackTrace(); 
        }
    }
}

關鍵最佳實踐

1. 防止 SQL 注入:使用 PreparedStatement

// 錯誤:拼接 SQL
String sql = "SELECT * FROM user WHERE name = '" + name + "'";

// 正確:參數化查詢
String sql = "SELECT * FROM user WHERE name = ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setString(1, name);
    ResultSet rs = ps.executeQuery();
}

2. 資源自動關閉:try-with-resources (JDK 7+)

try (Connection conn = DriverManager.getConnection(url, user, pwd);
     PreparedStatement ps = conn.prepareStatement(sql);
     ResultSet rs = ps.executeQuery()) {
    // 使用資源
} // 自動按逆序關閉 rs → ps → conn

3. 生產環境必須:連接池

頻繁創建/銷毀連接極其低效。推薦 HikariCP(Spring Boot 2 默認)、Druid、DBCP2。

// HikariCP 示例
HikariConfig config = new HikariConfig();
config.setJdbcUrl(url);
config.setUsername(user);
config.setPassword(pwd);
config.setMaximumPoolSize(20);
DataSource ds = new HikariDataSource(config);

// 使用
try (Connection conn = ds.getConnection()) { ... }

4. 事務控制

conn.setAutoCommit(false);
try {
    // 多條 SQL
    conn.commit();
} catch (Exception e) {
    conn.rollback();
    throw e;
} finally {
    conn.setAutoCommit(true);
}

運行結果示例


驅動加載成功
數據庫連接成功
-----------INSERT------------
添加成功
-----------SELECT------------
name_1234    pwd_1234    UUID...
查詢成功
-----------UPDATE------------
修改成功!
-----------SELECT------------
name_1234    pwd_1234xxxxxxxx    UUID...
查詢成功
-----------DELETE------------
刪除成功!
-----------SELECT------------
查詢成功

常見問題

異常原因解決
ClassNotFoundException驅動包未導入Build Path 添加 JAR
Connection refusedSQL Server 未啟用 TCP/IP 或端口錯誤SQL Server Configuration Manager 啟用 TCP/IP,確認 1433 端口
Login failed用戶名密碼錯誤/未啟用混合驗證檢查 sa 密碼、啟用 SQL Server 驗證模式
SSL handshake failed高版本驅動默認要求加密URL 添加 ;encrypt=true;trustServerCertificate=true 或配置證書

總結

JDBC 是持久層基石。實戰中:驅動 SPI 自動加載、PreparedStatement 防注入、try-with-resources 管資源、連接池提性能、事務保一致性。上層框架(MyBatis、JPA、JdbcTemplate)本質皆是對 JDBC 的封裝,理解底層細節能寫出更高效、更安全的數據訪問代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved