Java数据库领域新探

Java数据库领域新探

Java DB是一款依托Apache Derby构建的关系型数据库管理系统(RDBMS),它完完全全由Java编写,支持标准的SQL语法。Java DB是Java开发者常用的数据库工具之一,尤其契合嵌入式应用的开发场景。

1. Java DB的核心要义

  • 数据库(Database) :是存储数据的载体,以表的形式对数据进行组织。在Java DB里,一个数据库能够包含多个表,每个表用来存储特定类型的数据。举个例子,一个电商相关的数据库可能包含用户表(用于存储用户信息)、订单表(用于存储订单信息)以及商品表(用于存储商品信息)。
  • 表(Table) :是数据库中存储数据的基本单元,由行和列构成。每一列都有一个名称和对应的数据类型,用以界定该列能够存储的数据种类。例如,一个用户表可能有如下结构:CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100))。其中,id为主键,nameemail为普通列。
  • 行(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("成功连接到数据库。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在该示例中:

  • 数据库URL为jdbc:derby://localhost:1527/myDatabase;create=true。其中,jdbc:derby是Java DB的JDBC协议,localhost是数据库服务器的地址,1527是Java DB的默认服务端口,myDatabase是数据库名称,create=true表示若数据库不存在则进行创建。
  • 使用DriverManager.getConnection()方法来建立连接,传入数据库URL、用户名和密码。
2.2 创建表

创建表是数据库操作的基础。以下是一个创建表的示例代码:

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("表创建成功。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在该示例中:

  • 使用Statement对象来执行SQL语句。CREATE TABLE语句用于创建一个名为users的表,其中包含idnameemail三个列。
  • stmt.executeUpdate(sql)方法用于执行SQL语句,以创建表。
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 + " 行数据已插入。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在该示例中:

  • 使用PreparedStatement对象来执行SQL插入语句。PreparedStatement是一种预编译的SQL语句,能够提升性能并防止SQL注入攻击。
  • 使用pstmt.setInt()pstmt.setString()等方法来设置SQL语句中的参数值。
  • pstmt.executeUpdate()方法用于执行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对象来执行SQL查询语句。
  • pstmt.executeQuery()方法用于执行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 + " 行数据已更新。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在该示例中:

  • 使用PreparedStatement对象来执行SQL更新语句。
  • 使用pstmt.setString()pstmt.setInt()等方法来设置SQL语句中的参数值。
  • pstmt.executeUpdate()方法用于执行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 + " 行数据已删除。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在该示例中:

  • 使用PreparedStatement对象来执行SQL删除语句。
  • 使用pstmt.setInt(1, 1)来设置SQL语句中的参数值,表示删除id1的用户。
  • pstmt.executeUpdate()方法用于执行SQL删除语句,返回受影响的行数。

3. Java DB的其他功能

3.1 索引(Index)

索引是一种特殊的数据库对象,用于提升查询性能。在Java DB中,可以通过SQL语句来创建索引。以下是一个创建索引的示例代码:

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("索引创建成功。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在该示例中:

  • 使用CREATE INDEX语句创建了一个名为idx_name的索引,该索引基于users表的name列。
  • 索引能够协助数据库更快地查找name列中的数据,从而提升查询性能。
3.2 视图(View)

视图是一种虚拟表,其内容由SQL查询来定义。视图能够简化复杂的SQL操作,隐藏数据的复杂性。以下是一个创建视图的示例代码:

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("视图创建成功。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在该示例中:

  • 使用CREATE VIEW语句创建了一个名为user_summary的视图,该视图只包含users表的idname列。
  • 查询视图时,能够像查询普通表一样查询视图。
3.3 存储过程(Stored Procedure)

存储过程是一组预编译的SQL语句,能够提升数据库操作的效率和安全性。以下是一个创建存储过程的示例代码:

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("存储过程创建成功。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在该示例中:

  • 使用CREATE PROCEDURE语句创建了一个名为insert_user的存储过程,该存储过程接受三个参数:p_idp_namep_email
  • 存储过程内部执行了一个INSERT语句,将传入的参数插入到users表中。
3.4 调用存储过程

创建存储过程后,可以通过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("通过存储过程插入了用户。");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在该示例中:

  • 使用CallableStatement对象来调用存储过程。
  • 使用cstmt.setInt()cstmt.setString()等方法来设置存储过程的参数值。
  • cstmt.execute()方法用于执行存储过程。
3.5 事务(Transaction)

事务是一组操作的集合,这些操作要么全部成功,要么全部失败。在Java DB中,可以通过JDBC来控制事务。以下是一个使用事务的示例代码:

```java
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("事务提交成功。");
        } catch (SQLException e) {
            conn.rollback(); // 回滚事务
            System.out.println("事务已回滚。");
            e.printStackTrace();
        }
    } catch (SQLException
版权声明:程序员胖胖胖虎阿 发表于 2025年7月23日 上午10:10。
转载请注明:Java数据库领域新探 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...