执行SQL语句
应用程序通过执行SQL语句来操作数据库。本章节通过示例介绍CREATE TABLE、INSERT、UPDATE、SELECT等操作。
- 执行普通SQL语句:创建表。
- 执行批量插入处理语句:批量插入数据。
- 执行预处理更新语句:更新数据。
- 执行查询语句:返回ResultSet。
执行普通SQL语句
前置条件:已连接数据库,连接对象为conn。
执行普通SQL语句,创建customer_t1表的步骤如下:
- 调用Connection接口的createStatement()方法创建语句对象stmt。
1Statement stmt = conn.createStatement();
- 调用Statement接口的executeUpdate()方法执行SQL语句。
1int rc = stmt.executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32))");
- 调用Statement接口的close()方法关闭语句对象stmt。
1stmt.close();
执行批量插入处理语句
创建预处理语句后执行批量插入处理,数据库只创建一次执行计划,节省了语句的编译和优化时间。
前置条件:已通过执行普通SQL语句创建customer_t1表。
执行预处理语句,批量插入数据的步骤如下:
- 调用Connection接口的prepareStatement()方法创建预处理语句对象pst。
1PreparedStatement pst = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?,?)");
- 针对每条数据调用对应接口设置参数,以及调用addBatch()将SQL语句添加到批处理中。
1 2 3 4 5
for (int i = 0; i < 3; i++) { pst.setInt(1, i); pst.setString(2, "data " + i); pst.addBatch(); }
- 调用PreparedStatement接口的executeBatch()方法执行批量插入处理。
1pst.executeBatch();
- 调用PreparedStatement接口的close()方法关闭预处理语句对象pst。
1pst.close();
在数据库批处理操作中,应遵循以下关键原则以确保性能:
- 持续执行原则
- 批处理程序应当保持持续执行,避免中途终止。
- 异常终止会显著影响数据库整体性能。
- 事务管理优化
- 必须禁用自动提交功能。
conn.setAutoCommit(false);
- 采用分批提交策略而非单行提交。
- 需要根据数据量和系统资源确定合适的批量大小。
- 必须禁用自动提交功能。
执行预处理更新语句
预处理语句是只编译和优化一次,可以通过设置不同的参数值多次使用。由于已经预先编译好,后续使用会减少执行时间。因此,如果多次执行一条语句,请选择使用预处理语句。
前置条件:已通过执行批量插入处理语句向customer_t1表中插入数据。
执行预处理SQL语句对数据进行更新的步骤如下:
- 调用Connection接口的prepareStatement()方法创建预编译语句对象pstmt。
1PreparedStatement pstmt = conn.prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1");
- 调用PreparedStatement接口的setString()方法设置参数。
1pstmt.setString(1, "new Data");
- 调用PreparedStatement接口的executeUpdate()方法执行预处理SQL语句。
1int rowcount = pstmt.executeUpdate();
- 调用PreparedStatement接口的close()方法关闭预处理语句对象pstmt。
1pstmt.close();
prepareStatement设置绑定参数后,最终会构建成一个B报文或U报文,在下一步执行SQL语句时发给服务端。B报文或U报文有最大长度限制(不能超过1023MB),如果一次绑定数据过大,可能因报文过长导致异常。因此prepareStatement设置绑定参数时需要注意评估和控制绑定数据的大小,避免出现超出报文上限要求的现象。
执行查询语句
前置条件:已执行预处理更新语句。
执行查询语句的步骤如下:
- 调用Connection接口的createStatement()方法创建语句对象stmts。
1Statement stmts = conn.createStatement();
- 调用Statement接口的executeQuery()方法执行SQL查询语句,并返回ResultSet。
1ResultSet rs = stmts.executeQuery("SELECT * FROM customer_t1");