JDBC中.executeUpdate()|.executeQuery()的疑问

问题梗概

import java.sql.*;
public class DB_initial {
    /**
     * 基本参数初始化
     */
    //数据库位置
    public static final String URL = "jdbc:mysql://127.0.0.1:3306/" +
            "new_schema?useUnicode=true&characterEncoding=utf-8";
    //数据库账号、密码
    public static final String USER = "root";
    public static final String PASSWORD = "root";

    /**
     * 获取数据库连接
     */
    //Connection对象:连接
    public Connection getconnect() throws ClassNotFoundException, SQLException {

        //创建连接对象
        //DriverManager:用于管理一组 JDBC 驱动程序的基本服务。
        Connection ct = DriverManager.getConnection(URL,USER,PASSWORD);

        return ct;
    }

    /**
     * 关闭数据库连接
     */
    //JDBC是由一系列连接(Connection)、SQL语句(Statement)和结果集(ResultSet)构成的
    public void close(Connection ct, PreparedStatement stmt, ResultSet rs){
        try {
            if (rs!=null && stmt!=null && ct!=null) {//防止抛npe
                rs.close();
                stmt.close();
                ct.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查询方法
     */
    public ResultSet inquire(String sql,Object... params){
        Connection ct = null;
        PreparedStatement pst = null;

        try {
            //获取连接对象
            ct = getconnect();

            //执行对象
            pst = ct.prepareStatement(sql);
            if(params != null) {
                for (int i = 0; i < params.length; i++) {
                    pst.setObject(i + 1, params[i]);//参数绑定
                }
            }

            //执行sql语句
            ResultSet rs = pst.executeQuery();
            return rs;

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(ct,pst,null);
        }


        return null;
    }

    /**
     * 增删改方法
     */
    public int updata(String sql,Object... params){//考虑为什么是int类型?
        Connection ct = null;
        PreparedStatement ps = null;

        try {
            //连接对象
            ct = getconnect();

            //执行对象
            ps = ct.prepareStatement(sql);

            if (params!=null){
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i+1, params[i]);//参数绑定
                }
            }

            int rs = ps.executeUpdate();

            return rs;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(ct,ps,null);
        }

        return 0;
    }

}

JDBC查询操作返回的是JDBC结果集对象(ResultSet),增删改返回受影响的行数

个人理解

JDBC查询操作目的只是查询而并不会修改数据,故它只需要将查询结果存到结果集对象中然后返回结果集对象,而对于增删改操作因为数据会被修改,所以需要返回受到影响的行数

疑惑

老师在上课曾说过“DQL的概念是从DML中提取出来的”,而jdbc中也确实将这两个分别实现.(.executeUpdate()|.executeQuery())
想问一下对于这两个方法jdbc为什么要分别返回结果集对象(ResultSet)和int,而不是捏成void方法直接实现增删改查?

阅读 1.4k
1 个回答

说一下个人的理解。我们操作数据库,对于查询类的,必然是需要返回查询结果的。如果定义成void,这个结果就无法返回。

update的时候返回影响的行数,是便于某些场景下,需要做进一步处理,或者反馈给用户。比如,我删除一条记录。如果返回1就说明记录确实成功删除了。如果定义成void,就只知道删了,但删了多少行,就不知道了。