java db數據庫連接與操作功能
Java DB 是一個基于 Apache Derby 的關系數據庫管理系統(tǒng)(RDBMS),它完全用 Java 編寫,支持標準的 SQL 語法。Java DB 是 Java 開發(fā)者常用的數據庫工具之一,尤其適合嵌入式應用開發(fā)。
1. Java DB 的核心概念
- 數據庫(Database) :是存儲數據的容器,它以表的形式組織數據。在 Java DB 中,一個數據庫可以包含多個表,每個表存儲特定類型的數據。例如,一個電商數據庫可能包含用戶表(存儲用戶信息)、訂單表(存儲訂單信息)和商品表(存儲商品信息)。
- 表(Table) :是數據庫中存儲數據的基本單位,由行和列組成。每一列都有一個名稱和數據類型,用于定義該列可以存儲的數據種類。例如,一個用戶表可能有以下結構:
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100))。其中,id是主鍵,name和email是普通列。 - 行(Row) :是表中的一個記錄,表示一組相關數據。例如,在用戶表中,一行可能表示一個用戶的信息,如
INSERT INTO users VALUES (1, 'Alice', 'alice@example.com')。 - 列(Column) :是表中的一個字段,用于存儲某種類型的數據。例如,
name列用于存儲用戶的名字,email列用于存儲用戶的電子郵件地址。 - 主鍵(Primary Key) :是表中用于唯一標識一行的列或列組合。主鍵的值必須是唯一的,且不能為
NULL。例如,在用戶表中,id列被定義為主鍵,確保每個用戶都有一個唯一的標識。 - 外鍵(Foreign Key) :是表中的一個列或列組合,用于建立表與表之間的關系。外鍵的值必須是另一個表的主鍵值或
NULL。例如,在訂單表中,可以有一個user_id列作為外鍵,指向用戶表的id列,表示訂單屬于哪個用戶。
2. Java DB 的連接與操作
2.1 連接數據庫
在 Java 中,使用 Java DB 時需要通過 JDBC(Java Database Connectivity)來連接數據庫。以下是一個連接 Java DB 數據庫的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JavaDBConnection {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true"; // 數據庫 URL
String username = "root"; // 數據庫用戶名
String password = "password"; // 數據庫密碼
try (Connection conn = DriverManager.getConnection(url, username, password)) {
System.out.println("Connected to the database successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 數據庫 URL 是
jdbc:derby://localhost:1527/myDatabase;create=true。其中,jdbc:derby是 Java DB 的 JDBC 協(xié)議,localhost是數據庫服務器的地址,1527是默認的 Java DB 服務端口,myDatabase是數據庫名稱,create=true表示如果數據庫不存在則創(chuàng)建它。 - 使用
DriverManager.getConnection()方法建立連接,傳入數據庫 URL、用戶名和密碼。
2.2 創(chuàng)建表
創(chuàng)建表是數據庫操作的基礎。以下是一個創(chuàng)建表的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateTable {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement()) {
String sql = "CREATE TABLE users (" +
"id INT PRIMARY KEY," +
"name VARCHAR(50)," +
"email VARCHAR(100)" +
")";
stmt.executeUpdate(sql);
System.out.println("Table created successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
Statement對象執(zhí)行 SQL 語句。CREATE TABLE語句用于創(chuàng)建一個名為users的表,其中包含id、name和email三個列。 stmt.executeUpdate(sql)方法用于執(zhí)行 SQL 語句,創(chuàng)建表。
2.3 插入數據
插入數據是將數據添加到表中的操作。以下是一個插入數據的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class InsertData {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 1);
pstmt.setString(2, "Alice");
pstmt.setString(3, "alice@example.com");
int rowsAffected = pstmt.executeUpdate();
System.out.println(rowsAffected + " row(s) inserted.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
PreparedStatement對象來執(zhí)行 SQL 插入語句。PreparedStatement是一種預編譯的 SQL 語句,可以提高性能并防止 SQL 注入攻擊。 - 使用
pstmt.setInt()、pstmt.setString()等方法設置 SQL 語句中的參數值。 pstmt.executeUpdate()方法用于執(zhí)行 SQL 插入語句,返回受影響的行數。
2.4 查詢數據
查詢數據是從表中檢索數據的操作。以下是一個查詢數據的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class QueryData {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
String sql = "SELECT * FROM users";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
PreparedStatement對象執(zhí)行 SQL 查詢語句。 pstmt.executeQuery()方法用于執(zhí)行 SQL 查詢語句,返回一個ResultSet對象。- 使用
ResultSet對象的next()方法遍歷查詢結果,rs.getInt()、rs.getString()等方法獲取每一列的值。
2.5 更新數據
更新數據是修改表中已存在數據的操作。以下是一個更新數據的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UpdateData {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
String sql = "UPDATE users SET email = ? WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "alice_new@example.com");
pstmt.setInt(2, 1);
int rowsAffected = pstmt.executeUpdate();
System.out.println(rowsAffected + " row(s) updated.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
PreparedStatement對象執(zhí)行 SQL 更新語句。 - 使用
pstmt.setString()、pstmt.setInt()等方法設置 SQL 語句中的參數值。 pstmt.executeUpdate()方法用于執(zhí)行 SQL 更新語句,返回受影響的行數。
2.6 刪除數據
刪除數據是從表中移除數據的操作。以下是一個刪除數據的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DeleteData {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
String sql = "DELETE FROM users WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 1); // 假設刪除 id 為 1 的用戶
int rowsAffected = pstmt.executeUpdate();
System.out.println(rowsAffected + " row(s) deleted.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
PreparedStatement對象執(zhí)行 SQL 刪除語句。 - 使用
pstmt.setInt(1, 1)設置 SQL 語句中的參數值,表示刪除id為1的用戶。 pstmt.executeUpdate()方法用于執(zhí)行 SQL 刪除語句,返回受影響的行數。
3. Java DB 的其他功能
3.1 索引(Index)
索引是一種特殊的數據庫對象,用于提高查詢性能。在 Java DB 中,可以通過 SQL 語句創(chuàng)建索引。以下是一個創(chuàng)建索引的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateIndex {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement()) {
String sql = "CREATE INDEX idx_name ON users (name)";
stmt.executeUpdate(sql);
System.out.println("Index created successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
CREATE INDEX語句創(chuàng)建了一個名為idx_name的索引,該索引基于users表的name列。 - 索引可以幫助數據庫更快地查找
name列中的數據,從而提高查詢性能。
3.2 視圖(View)
視圖是一種虛擬表,其內容由 SQL 查詢定義。視圖可以簡化復雜的 SQL 操作,隱藏數據的復雜性。以下是一個創(chuàng)建視圖的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateView {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement()) {
String sql = "CREATE VIEW user_summary AS SELECT id, name FROM users";
stmt.executeUpdate(sql);
System.out.println("View created successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
CREATE VIEW語句創(chuàng)建了一個名為user_summary的視圖,該視圖只包含users表的id和name列。 - 查詢視圖時,可以像查詢普通表一樣查詢視圖。
3.3 存儲過程(Stored Procedure)
存儲過程是一組預編譯的 SQL 語句,可以提高數據庫操作的效率和安全性。以下是一個創(chuàng)建存儲過程的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateProcedure {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement()) {
String sql = "CREATE PROCEDURE insert_user (IN p_id INT, IN p_name VARCHAR(50), IN p_email VARCHAR(100)) " +
"LANGUAGE SQL " +
"BEGIN " +
"INSERT INTO users (id, name, email) VALUES (p_id, p_name, p_email); " +
"END";
stmt.executeUpdate(sql);
System.out.println("Stored procedure created successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
CREATE PROCEDURE語句創(chuàng)建了一個名為insert_user的存儲過程,該存儲過程接受三個參數:p_id、p_name和p_email。 - 存儲過程內部執(zhí)行了一個
INSERT語句,將傳入的參數插入到users表中。
3.4 調用存儲過程
創(chuàng)建存儲過程后,可以通過 JDBC 調用它。以下是一個調用存儲過程的示例代碼:
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CallProcedure {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
String sql = "{CALL insert_user(?, ?, ?)}";
try (CallableStatement cstmt = conn.prepareCall(sql)) {
cstmt.setInt(1, 2);
cstmt.setString(2, "Bob");
cstmt.setString(3, "bob@example.com");
cstmt.execute();
System.out.println("User inserted using stored procedure.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
CallableStatement對象調用存儲過程。 - 使用
cstmt.setInt()、cstmt.setString()等方法設置存儲過程的參數值。 cstmt.execute()方法用于執(zhí)行存儲過程。
3.5 事務(Transaction)
事務是一組操作的集合,這些操作要么全部成功,要么全部失敗。在 Java DB 中,可以通過 JDBC 控制事務。以下是一個使用事務的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TransactionExample {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password)) {
conn.setAutoCommit(false); // 禁用自動提交
String sql1 = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";
String sql2 = "UPDATE users SET email = ? WHERE id = ?";
try (PreparedStatement pstmt1 = conn.prepareStatement(sql1);
PreparedStatement pstmt2 = conn.prepareStatement(sql2)) {
pstmt1.setInt(1, 3);
pstmt1.setString(2, "Charlie");
pstmt1.setString(3, "charlie@example.com");
pstmt1.executeUpdate();
pstmt2.setString(1, "charlie_new@example.com");
pstmt2.setInt(2, 3);
pstmt2.executeUpdate();
conn.commit(); // 提交事務
System.out.println("Transaction committed successfully.");
} catch (SQLException e) {
conn.rollback(); // 回滾事務
System.out.println("Transaction rolled back.");
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
conn.setAutoCommit(false)禁用自動提交,手動控制事務。 - 執(zhí)行兩條 SQL 語句:插入一個用戶和更新該用戶的電子郵件地址。
- 如果兩條語句都成功執(zhí)行,則調用
conn.commit()提交事務;如果發(fā)生異常,則調用conn.rollback()回滾事務。
4. Java DB 的一些高級功能
4.1 數據庫觸發(fā)器(Trigger)
觸發(fā)器是一種特殊的存儲過程,它在特定的數據庫事件(如插入、更新或刪除操作)發(fā)生時自動執(zhí)行。以下是一個創(chuàng)建觸發(fā)器的示例代碼:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateTrigger {
public static void main(String[] args) {
String url = "jdbc:derby://localhost:1527/myDatabase;create=true";
String username = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement()) {
String sql = "CREATE TRIGGER update_email_trigger " +
"AFTER UPDATE OF email ON users " +
"FOR EACH ROW " +
"BEGIN " +
"CALL update_email_log(OLD.email, NEW.email); " +
"END";
stmt.executeUpdate(sql);
System.out.println("Trigger created successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
CREATE TRIGGER語句創(chuàng)建了一個名為update_email_trigger的觸發(fā)器。 - 該觸發(fā)器在
users表的email列發(fā)生更新操作時觸發(fā)。 - 觸發(fā)器內部調用了一個名為
update_email_log的存儲過程,將舊的電子郵件地址和新的電子郵件地址作為參數傳遞。
4.2 數據庫連接池(Connection Pool)
數據庫連接池是一種資源管理技術,用于提高數據庫連接的性能和可伸縮性。在 Java 中,可以使用第三方庫(如 Apache DBCP 或 HikariCP)來實現數據庫連接池。以下是一個使用 Apache DBCP 的示例代碼:
import org.apache.commons.dbcp2.BasicDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ConnectionPoolExample {
public static void main(String[] args) {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.apache.derby.jdbc.ClientDriver");
dataSource.setUrl("jdbc:derby://localhost:1527/myDatabase");
dataSource.setUsername("root");
dataSource.setPassword("password");
try (Connection conn = dataSource.getConnection()) {
String sql = "SELECT * FROM users";
try (PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在這個示例中:
- 使用
BasicDataSource創(chuàng)建了一個數據庫連接池。 - 設置了數據庫驅動程序類名、數據庫 URL、用戶名和密碼。
- 從連接池中獲取連接,執(zhí)行 SQL 查詢語句。
5. Java DB 的一些實用工具
5.1 ij 工具
ij 是 Java DB 自帶的一個命令行工具,用于執(zhí)行 SQL 語句。以下是使用 ij 工具的一些示例:
- 啟動 ij 工具:
ij
- 連接到數據庫:
CONNECT 'jdbc:derby://localhost:1527/myDatabase;user=root;password=password';
- 執(zhí)行 SQL 查詢語句:
SELECT * FROM users;
- 退出 ij 工具:
EXIT;
5.2 網絡服務器模式
Java DB 支持網絡服務器模式,允許遠程客戶端連接到數據庫。以下是啟動 Java DB 網絡服務器的示例代碼:
java -jar derbyrun.jar server start
在啟動網絡服務器后,可以使用 JDBC 連接到數據庫,如前面的示例代碼所示。
6. Java DB 的一些注意事項
- 數據庫性能優(yōu)化 :在使用 Java DB 時,需要注意數據庫性能優(yōu)化。例如,合理使用索引、避免全表掃描、優(yōu)化 SQL 查詢語句等。
- 數據備份與恢復 :定期備份數據庫是防止數據丟失的重要措施。Java DB 提供了備份和恢復數據庫的功能,可以通過 SQL 語句或工具進行備份和恢復。
- 安全性 :在使用 Java DB 時,需要注意安全性。例如,使用強密碼、限制數據庫訪問權限、防止 SQL 注入攻擊等。
到此這篇關于java db數據庫連接與操作功能的文章就介紹到這了,更多相關java db連接內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot采用AJAX實現異步發(fā)布帖子詳解
Ajax是一種web應用技術,可以借助客戶端腳本(javascript)與服務端應用進行異步通訊,獲取服務端數據以后,可以進行局部刷新,進而提高數據的響應和渲染速度。所有的Ajax請求都會基于DOM(HTML元素)事件,通過XHR(XMLHttpRequest)對象實現與服務端異步通訊局部更新2022-08-08
idea2020.1最新版永久破解/pycharm也可用(步驟詳解)
這篇文章主要介紹了idea2020.1最新版永久破解/pycharm也可用,本文給大家分享簡單實現步驟,通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

