JDBC Statement接口的用法(附带实例)
Statement 接口是 Java 执行数据库操作的一个重要接口。如果需要使用这个接口,就必须先跟数据库建立连接。然后可以使用这个接口向数据库发送并执行静态 SQL 语句,然后返回其生成的结果。
接下来,我们先在数据库中创建一张表,名称为 students,字段如下表所示:
接着,我们通过向 students 表中添加一条数据来演示如何使用 Statement 接口(【实例 1】):
代码中,很多地方都需要获取数据库的连接并关闭连接,所以将这部分代码提到一个公共的 BaseDAO 类中,并将这个类放到 com.biancheng.net 中:
Statement 对象使用之后需要将它关闭,由于在后面的代码中也需要关闭该对象,所以需要修改一下公共类 BaseDAO 中的 closeAll() 方法。修改之后的 CloseAll() 方法如下:
接下来,重新整理例 1 的代码:
本例使用 Statement 接口来执行数据库的添加操作,如果要完成修改和删除操作,则需要使用 Statement 接口中的 executeUpdate(String sql) 方法,此时只需将 SQL 语句改成修改语句或者删除语句即可。
Statement 接口中定义了如下表所示的常用方法:所谓静态 SQL 语句,是指在执行 Statement 接口的 executeUpdate()、executeQuery() 等方法时,作为参数的 SQL 语句的内容是固定不变的,也就是 SQL 语句中没有任何参数。
方法 | 方法描述 |
---|---|
int executeUpdate(String sql) | 执行给定的 SQL 语句,这可能是 INSERT、UPDATE 或 DELETE 语句 |
ResultSet executeQuery(String sql) | 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象 |
void addBatch(String sql) | 将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中 |
int[] executeBatch() | 将一批命令提交到数据库以执行,并且所有命令都执行成功后返回一个更新计数的数组 |
void close() | 关闭数据库的连接 |
boolean execute(String sql) | 执行给定的 SQL 语句,这可能会返回多个结果 |
接下来,我们先在数据库中创建一张表,名称为 students,字段如下表所示:
字段 | 类型 | 长度 | 描述 |
---|---|---|---|
id | int | 10 | 自动增长的主键 |
name | varchar | 50 | 学生的名字 |
gender | varchar | 4 | 学生的性别 |
age | varchar | 10 | 学生的年龄 |
接着,我们通过向 students 表中添加一条数据来演示如何使用 Statement 接口(【实例 1】):
import com.biancheng.net.BaseDAO; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class Demo { public static void main(String[] args) { Connection connection = BaseDAO.getConnection(); // 获取连接 Statement statement = null; try { statement = connection.createStatement(); // 创建 Statement 对象 // 定义 SQL 语句 String sql = "insert into students(name,gender,age) values('张三','男',18)"; int i = statement.executeUpdate(sql); // 执行 SQL 语句并返回结果 System.out.println("受影响的行数:" + i); } catch (SQLException e) { e.printStackTrace(); } finally { if (statement != null) { try { statement.close(); // Statement 使用后要关闭 } catch (SQLException e) { e.printStackTrace(); } } BaseDAO.closeAll(connection); // 关闭 Connection } } }
代码中,很多地方都需要获取数据库的连接并关闭连接,所以将这部分代码提到一个公共的 BaseDAO 类中,并将这个类放到 com.biancheng.net 中:
package com.biancheng.net; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; public class BaseDAO { // 定义 MySQL 的数据库驱动程序 public static final String DRIVER = "com.mysql.jdbc.Driver"; // 数据库连接字符串 public static final String URL = "jdbc:mysql:///school?useUnicode=true&characterEncoding=utf-8"; // 数据库服务器账号 public static final String USER = "root"; // 数据库服务器密码 public static final String PSWD = "root"; // 获取连接方法 public static Connection getConnection() { Connection con = null; try { // 加载驱动类 Class.forName(DRIVER); // 获取连接 con = DriverManager.getConnection(URL, USER, PSWD); } catch (ClassNotFoundException e) { System.out.println("加载失败"); e.printStackTrace(); } catch (SQLException e) { System.out.println("连接数据库错误"); e.printStackTrace(); } return con; } // 关闭数据库对象方法 public static void closeAll(Connection con) { try { if (con != null) { con.close(); } } catch (SQLException ex) { ex.printStackTrace(); } } }程序的运行结果如下:
受影响的行数为:1
程序中先通过 BaseDAO 类的 getConnection() 方法获取 Connection 对象,然后使用 Connection 接口中的 createStatement() 方法获取 Statement 对象,接着通过 executeUpdate(String sql) 方法执行一条标准的 SQL 语句并返回对应的结果。Statement 对象使用之后需要将它关闭,由于在后面的代码中也需要关闭该对象,所以需要修改一下公共类 BaseDAO 中的 closeAll() 方法。修改之后的 CloseAll() 方法如下:
public static void closeAll(Connection con, Statement stmt) { try { if (stmt != null) { stmt.close(); // System.out.println("关闭 statement"); } if (con != null) { con.close(); // System.out.println("关闭数据库"); } } catch (SQLException ex) { ex.printStackTrace(); } }程序中 SQL 语句里列的值是固定的,如果列的值不固定,我们就需要动态地传入列的值。由于 Statement 接口执行的是静态 SQL 语句,所以在调用 executeUpdate() 方法之前,需要先将对应的 SQL 语句拼接好。
接下来,重新整理例 1 的代码:
import com.biancheng.net.BaseDAO; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class Demo1406 { public static void main(String[] args) { Connection conn = null; Statement statement = null; String name = "张三"; String gender = "女"; Integer age = 18; try { conn = BaseDAO.getConnection(); statement = conn.createStatement(); // 定义 SQL 语句并将对应的变量值拼接到 SQL 语句中 StringBuilder sqlBuffer = new StringBuilder("insert into students(name,gender,age) "); sqlBuffer.append("values('").append(name) .append("','").append(gender) .append("',").append(age).append(")"); int i = statement.executeUpdate(sqlBuffer.toString()); // 执行 SQL 语句 System.out.println("受影响的行数:" + i); } catch (SQLException e) { e.printStackTrace(); } finally { BaseDAO.closeAll(conn, statement); // 关闭 connection 和 statement } } }程序的运行结果如下:
受影响的行数为:1
程序中执行 SQL 语句使用的是 Statement 接口,该接口在执行 SQL 语句时需要使用静态 SQL 语句,因此使用 StringBuilder 类来拼接 SQL 语句。在拼接 SQL 语句时,字符串必须使用英文单引号引起来,否则就会报 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException 异常。本例使用 Statement 接口来执行数据库的添加操作,如果要完成修改和删除操作,则需要使用 Statement 接口中的 executeUpdate(String sql) 方法,此时只需将 SQL 语句改成修改语句或者删除语句即可。