VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

执行SQL语句

本章主要介绍通过 JDBC 在 Vastbase G100 数据库中执行 SQL 语句的方法与代码示例。

执行普通 SQL 语句

应用程序通过执行SQL语句来操作数据库的数据(不用传递参数的语句),需要按以下步骤执行:

1、调用Connection的createStatement方法创建语句对象。

Connection conn = DriverManager.getConnection("url","user","password");
Statement stmt = conn.createStatement();

2、调用Statement的executeUpdate方法执行SQL语句。

int rc = stmt.executeUpdate("DROP TABLE IF EXISTS fruit_tbl;"                 +
                            "CREATE TABLE fruit_tbl(fruit_id INTEGER, "       +
                                                   "fruit_name VARCHAR(32),"  +
                                                   "fruit_period INTEGER,"    + 
                                                   "fruit_email VARCHAR(64))");
  • 数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,如果其中有一个语句失败,那么整个请求都将会被回滚。

  • 事务块中不支持 vacuum 操作。

  • 使用Statement执行多语句时应以 ; 作为各语句间的分隔符。存储过程、函数、匿名块不支持多语句执行。

  • / 可用作创建单个存储过程、函数、匿名块的结束符。

3、关闭语句对象。

stmt.close();

代码示例

以下代码示例展示了连接 Vastbase G100 数据库,并创建 fruit_tbl 表的方法。

import java.sql.*;

public class demo {
    /* 定义连接对象 */
    static Connection conn = null;
    /* 定义 DM JDBC 驱动串 */
    static String cname = "org.postgresql.Driver";
    /* 定义 DM URL 连接串 */
    static String url = "jdbc:vastbase://172.16.105.55:5432/postgres?loggerLevel=OFF";
    /* 定义连接用户名 */
    static String username = "vastbase";
    /* 定义连接用户口令 */
    static String passwd = "Vbase@admin";
    /* 定义 SQL 语句执行对象 */
    static Statement stmt = null;
    static PreparedStatement pstmt = null;
    /* 定义结果集对象 */
    static ResultSet rest = null;
    public static void main(String[] args) {
        try {
            /* 初始化连接 */
            Class.forName(cname);
            conn = DriverManager.getConnection(url, username, passwd);

            /* 创建语句对象 */
            stmt = conn.createStatement();

            int rc = stmt.executeUpdate("DROP TABLE IF EXISTS fruit_tbl;"                 +
                                        "CREATE TABLE fruit_tbl(fruit_id INTEGER, "       +
                                                               "fruit_name VARCHAR(32),"  +
                                                               "fruit_period INTEGER,"    +
                                                               "fruit_email VARCHAR(64))");

            if(rc != 0){
                System.out.println("[FAIL] fail to create table.\n");
            }else{
                System.out.println("[SUCCESS] create table successfully.\n");
            }

            /* 关闭语句对象 */
            stmt.close();
            
            /* 关闭连接 */
            conn.close();
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

运行上述代码,返回结果如下图所示。

执行普通SQL代码结果

执行预编译SQL语句

预编译语句是只编译和优化一次,然后可以通过设置不同的参数值多次使用。由于已经预先编译好,后续使用会减少执行时间。因此,如果多次执行一条语句,请选择使用预编译语句。可以按以下步骤执行:

1、调用Connection的prepareStatement方法创建预编译语句对象。

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO fruit_tbl VALUES (?, ?, ?, ?)");

2、调用PreparedStatement的setInt、setString等方式设置传入的参数

int fid = 1;
String fname = "apple";

pstmt.setInt(1,fid++);
pstmt.setString(2, fname);
pstmt.setShort(3,(short) 20);
pstmt.setString(4,fname + "@Vastbase.com.cn");

3、调用PreparedStatement的executeUpdate方法执行预编译SQL语句。

int rc = pstmt.executeUpdate();

4、调用PreparedStatement的close方法关闭预编译语句对象。

pstmt.close();

代码示例

以下示例展示了向 fruit_tbl 插入一行数据的方式,插入的数据可在代码中进行传参控制。

import java.sql.*;

public class demo {
    /* 定义连接对象 */
    static Connection conn = null;
    /* 定义 DM JDBC 驱动串 */
    static String cname = "org.postgresql.Driver";
    /* 定义 DM URL 连接串 */
    static String url = "jdbc:vastbase://172.16.105.55:5432/postgres?loggerLevel=OFF";
    /* 定义连接用户名 */
    static String username = "vastbase";
    /* 定义连接用户口令 */
    static String passwd = "Vbase@admin";
    /* 定义 SQL 语句执行对象 */
    static Statement stmt = null;
    static PreparedStatement pstmt = null;
    /* 定义结果集对象 */
    static ResultSet rest = null;
    public static void main(String[] args) {
        try {

            /* 初始化连接 */
            Class.forName(cname);
            conn = DriverManager.getConnection(url, username, passwd);

            /* 创建语句对象 */
            pstmt = conn.prepareStatement("INSERT INTO fruit_tbl VALUES (?,?,?,?)");

            int fid = 1;
            String fname = "apple";

            pstmt.setInt(1,fid++);
            pstmt.setString(2, fname);
            pstmt.setShort(3,(short) 20);
            pstmt.setString(4,fname + "@Vastbase.com.cn");

            int rc = pstmt.executeUpdate();

            if(rc != 1){
                System.out.println("[FAIL] fail to insert into table.\n");
            }else{
                System.out.println("[SUCCESS] insert into table successfully.\n");
            }

            /* 关闭预编译语句对象 */
            pstmt.close();

            /* 关闭连接 */
            conn.close();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

执行上述代码,返回结果如下图所示。

运行预编译SQL

执行 DML 语句

要更改数据(执行 INSERT、UPDATE 或 DELETE),可以使用 executeUpdate()方法。

executeUpdate() 方法不返回 ResultSet,它返回的是 INSERT、UPDATE 或 DELETE语句影响的行数。

插入数据

  • 插入单行:

    PreparedStatement stmt = conn.prepareStatement("INSERT INTO fruit_tbl(fruit_id," +
                                                                "fruit_name,fruit_period,fruit_email) " +
                                                                "values(?,?,?,?)");
    int fid = 2;
    String fname = "banana";
    
    stmt.setInt(1, fid);
    stmt.setString(2, fname);
    stmt.setShort(3,(short) 10);
    stmt.setString(4,fname + "@Vastbase.com.cn");
    
    int rowsInserted = stmt.executeUpdate();
    if(rowsInserted > 1){
    System.out.println("[SUCCESS] " + rowsInserted+ " rows inserted.\n");
    }
    else if(rowsInserted == 1){
        System.out.println("[SUCCESS] " + rowsInserted + " row inserted.\n");
    }
    else {
        System.out.println("[FAIL] No rows inserted.\n");
    }
    stmt.close();
    

执行以上代码块,返回结果如下图所示。

executeInsert

  • 插入多行:

    PreparedStatement stmt = conn.prepareStatement("INSERT INTO fruit_tbl(fruit_id," +
    PreparedStatement stmt = conn.prepareStatement("INSERT INTO fruit_tbl(fruit_id," +
                    "fruit_name,fruit_period,fruit_email) " +
                    "values(?,?,?,?)");
    
            int fid = 2;
            String fname = "banana";
    
            stmt.setInt(1, fid++);
            stmt.setString(2, fname);
            stmt.setShort(3,(short) 10);
            stmt.setString(4,fname + "@Vastbase.com.cn");
            stmt.addBatch();
    
            fname = "peach";
    
            stmt.setInt(1, fid++);
            stmt.setString(2, fname);
            stmt.setShort(3,(short) 10);
            stmt.setString(4,fname + "@Vastbase.com.cn");
            stmt.addBatch();
    
            int[] rowsInserted = stmt.executeBatch();
            if(rowsInserted.length > 1){
                System.out.println("[SUCCESS] " + rowsInserted.length + " rows inserted.\n");
            }
            else if(rowsInserted.length == 1){
                System.out.println("[SUCCESS] " + rowsInserted.length + " row inserted.\n");
            }
            else {
                System.out.println("[FAIL] No rows inserted.\n");
            }
            stmt.close();
    

    执行以上代码块,返回结果如下图所示。

    executeBatch执行结果

更新数据

更新数据的代码示例如下。

int fid = 1;
pstmt = conn.prepareStatement("UPDATE fruit_tbl SET fruit_name ='grape' WHERE fruit_id = ?");
pstmt.setInt(1, fid);
int rc = pstmt.executeUpdate();
if(rc != 0) {
    System.out.println("[SUCCESS] " + rc + " rows updated.\n");
}
else{
    System.out.println("[FAIL] No rows updated.\n");
}
pstmt.close();

执行上述代码块,返回结果如下图所示。

UpdateExample

删除数据

删除数据的代码示例如下。

int fid = 2;
PreparedStatement pstmt = conn.prepareStatement("DELETE FROM fruit_tbl WHERE fruit_id = ?");
pstmt.setInt(1, fid);
int rc = pstmt.executeUpdate();
if(rc != 0) {
    System.out.println("[SUCCESS] " + rc + " rows deleted.\n");
}
else{
    System.out.println("[FAIL] No rows deleted.\n");
}
pstmt.close();

执行上述代码块,返回结果如下图所示。

DeleteExample

创建或修改数据库对象

要创建、更改或者删除一个类似表或者视图这样的数据库对象, 可以使用 execute() 方法。

execute() 方法不返回结果。

例如DROP表:

Statement stmt = conn.createStatement();
stmt.execute("DROP TABLE IF EXISTS fruit_tbl");
stmt.close();