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