首页 > 编程笔记 > Java笔记 阅读:9

JDBC Statement接口的用法(附带实例)

Statement 接口是 Java 执行数据库操作的一个重要接口。如果需要使用这个接口,就必须先跟数据库建立连接。然后可以使用这个接口向数据库发送并执行静态 SQL 语句,然后返回其生成的结果。

所谓静态 SQL 语句,是指在执行 Statement 接口的 executeUpdate()、executeQuery() 等方法时,作为参数的 SQL 语句的内容是固定不变的,也就是 SQL 语句中没有任何参数。

Statement 接口中定义了如下表所示的常用方法:

表:Statement 接口的常用方法
方法 方法描述
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 语句改成修改语句或者删除语句即可。

相关文章