#执行SQL语句

创建Statement对象后,可以使用executeQuery、executeUpdate或execute方法向YashanDB发送SQL语句。应根据SQL语句的返回结果选择对应方法。

常用SQL执行方法如下表所示。

方法 适用场景 返回值
executeQuery(String sql) 执行返回单个结果集的查询语句。 查询结果ResultSet。
executeUpdate(String sql) 执行INSERT、UPDATE或DELETE语句。 受影响的行数。
execute(String sql) 执行DDL语句,或者返回结果类型不确定的SQL语句。 第一个执行结果为ResultSet时返回true,否则返回false。

Note:

execute()返回false不表示SQL执行失败,只表示第一个执行结果不是ResultSet。SQL执行失败时,JDBC驱动会抛出SQLException。

# 执行DDL语句

下面示例使用execute()创建customer表:

String sql =
        "CREATE TABLE customer "
                + "(id INTEGER PRIMARY KEY, name VARCHAR(32))";

try (Statement statement = connection.createStatement()) {
    // 执行建表语句。
    statement.execute(sql);
}

# 插入数据

使用executeUpdate()执行INSERT语句。返回值表示插入的行数。

String sql =
        "INSERT INTO customer (id, name) VALUES (1, 'Alice')";

try (Statement statement = connection.createStatement()) {
    // 执行插入并获取插入行数。
    int insertedRows = statement.executeUpdate(sql);
    System.out.println("Inserted rows: " + insertedRows);
}

示例执行成功时,输出如下:

Inserted rows: 1

# 查询数据

使用executeQuery()执行SELECT语句。该方法返回ResultSet,调用next()可以逐行读取查询结果。

String sql = "SELECT id, name FROM customer ORDER BY id";

try (Statement statement = connection.createStatement();
     ResultSet resultSet = statement.executeQuery(sql)) {
    // 遍历查询结果。
    while (resultSet.next()) {
        int id = resultSet.getInt("id");
        String name = resultSet.getString("name");
        System.out.println("id: " + id + ", name: " + name);
    }
}

示例执行成功时,输出如下:

id: 1, name: Alice

结果集的读取方法请参考使用ResultSet对象。

# 更新数据

使用executeUpdate()执行UPDATE语句。返回值表示更新的行数,可以用于判断是否存在满足条件的数据。

String sql =
        "UPDATE customer SET name = 'Carol' WHERE id = 1";

try (Statement statement = connection.createStatement()) {
    // 执行更新并获取更新行数。
    int updatedRows = statement.executeUpdate(sql);
    System.out.println("Updated rows: " + updatedRows);
}

示例执行成功时,输出如下:

Updated rows: 1

# 删除数据

使用executeUpdate()执行DELETE语句。返回值表示删除的行数。

String sql = "DELETE FROM customer WHERE id = 1";

try (Statement statement = connection.createStatement()) {
    // 执行删除并获取删除行数。
    int deletedRows = statement.executeUpdate(sql);
    System.out.println("Deleted rows: " + deletedRows);
}

示例执行成功时,输出如下:

Deleted rows: 1

# 完整示例

下面示例依次创建表、插入数据、查询数据、更新数据和删除数据。示例执行完成后会删除创建的表。

package quickstart;

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 ExecuteSqlExample {
    // 数据库连接参数。
    private static final String URL =
            "jdbc:yasdb://192.168.1.2:1688/yasdb";
    private static final String USER = "username";
    private static final String PASSWORD = "passwd";
    private static final String TABLE_NAME =
            "customer";

    public static void main(String[] args) throws SQLException {
        // 设置登录用户名和密码。
        Properties properties = new Properties();
        properties.setProperty("user", USER);
        properties.setProperty("password", PASSWORD);

        try (Connection connection =
                     DriverManager.getConnection(URL, properties)) {
            boolean tableCreated = false;

            try {
                // 创建示例表。
                try (Statement statement =
                             connection.createStatement()) {
                    String sql = "CREATE TABLE " + TABLE_NAME
                            + " (id INTEGER PRIMARY KEY, "
                            + "name VARCHAR(32))";
                    statement.execute(sql);
                    tableCreated = true;
                    System.out.println("Table created");
                }

                // 插入一行数据。
                try (Statement statement =
                             connection.createStatement()) {
                    String sql = "INSERT INTO " + TABLE_NAME
                            + " (id, name) VALUES (1, 'Alice')";
                    int insertedRows = statement.executeUpdate(sql);
                    System.out.println(
                            "Inserted rows: " + insertedRows);
                }

                // 查询并输出数据。
                try (Statement statement =
                             connection.createStatement();
                     ResultSet resultSet = statement.executeQuery(
                             "SELECT id, name FROM " + TABLE_NAME
                                     + " ORDER BY id")) {
                    while (resultSet.next()) {
                        System.out.println(
                                "id: " + resultSet.getInt("id")
                                        + ", name: "
                                        + resultSet.getString("name"));
                    }
                }

                // 更新数据。
                try (Statement statement =
                             connection.createStatement()) {
                    String sql = "UPDATE " + TABLE_NAME
                            + " SET name = 'Carol' WHERE id = 1";
                    int updatedRows = statement.executeUpdate(sql);
                    System.out.println(
                            "Updated rows: " + updatedRows);
                }

                // 删除数据。
                try (Statement statement =
                             connection.createStatement()) {
                    String sql = "DELETE FROM " + TABLE_NAME
                            + " WHERE id = 1";
                    int deletedRows = statement.executeUpdate(sql);
                    System.out.println(
                            "Deleted rows: " + deletedRows);
                }
            } finally {
                // 删除示例表,避免残留测试对象。
                if (tableCreated) {
                    try (Statement statement =
                                 connection.createStatement()) {
                        statement.execute(
                                "DROP TABLE " + TABLE_NAME);
                        System.out.println("Table dropped");
                    }
                }
            }
        }
    }
}

示例执行成功时,输出如下:

Table created
Inserted rows: 1
id: 1, name: Alice
Updated rows: 1
Deleted rows: 1
Table dropped

# 使用建议

  • Statement适用于不包含外部输入的固定SQL语句。SQL中包含用户输入或其他外部参数时,应使用PreparedStatement绑定参数,不得直接拼接输入值。
  • 使用executeUpdate()执行数据变更后,应检查受影响的行数是否符合业务预期。
  • 使用try-with-resources及时关闭ResultSet和Statement。资源关闭方法请参考断开数据库连接。
  • 本章示例使用连接的默认自动提交设置。需要将多条SQL语句作为一个事务执行时,请参考处理事务。
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流