执行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语句
预编译语句是只编译和优化一次,然后可以通过设置不同的参数值多次使用。由于已经预先编译好,后续使用会减少执行时间。因此,如果多次执行一条语句,请选择使用预编译语句。可以按以下步骤执行:
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(); } } }
执行上述代码,返回结果如下图所示。
执行 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();
执行以上代码块,返回结果如下图所示。
插入多行:
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();
执行以上代码块,返回结果如下图所示。
更新数据
更新数据的代码示例如下。
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();
执行上述代码块,返回结果如下图所示。
删除数据
删除数据的代码示例如下。
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();
执行上述代码块,返回结果如下图所示。
创建或修改数据库对象
要创建、更改或者删除一个类似表或者视图这样的数据库对象, 可以使用
execute()
方法。
execute()
方法不返回结果。例如DROP表:
Statement stmt = conn.createStatement(); stmt.execute("DROP TABLE IF EXISTS fruit_tbl"); stmt.close();