问题梗概
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方法直接实现增删改查?
说一下个人的理解。我们操作数据库,对于查询类的,必然是需要返回查询结果的。如果定义成void,这个结果就无法返回。
update的时候返回影响的行数,是便于某些场景下,需要做进一步处理,或者反馈给用户。比如,我删除一条记录。如果返回1就说明记录确实成功删除了。如果定义成void,就只知道删了,但删了多少行,就不知道了。