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 语句改成修改语句或者删除语句即可。
ICP备案:
公安联网备案: