executeUpdate
executeUpdate:可以执行的操作包括修改、删除、插入,这里以删除为例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DeleteRecord {
public static void main(String[] args) {
//定义一条sql语句
String sql = "delete from user_info";
//将sql语句传入updata()方法中,返回一个boolean值
if(update(sql)) {
//如果返回true则输出成功提示
System.out.println("删除数据成功!");
}
}
public static boolean update(String sql) {
//由于下面的两个代码块中都要用到Connection和Statement的对象,所以在这里先声明变量
Connection connection = null;
Statement statement = null;
//声明连接的数据库地址
String url = "jdbc:mysql://localhost:3306/mytest";
//声明数据库的用户名
String user = "root";
//声明数据库的用户密码
String password = "1234";
//由于下面的几行代码会抛出检查时异常,所以要try/catch
try {
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2、创建链接
connection = DriverManager.getConnection(url, user, password);
//3、创建sql语句
statement = connection.createStatement();
//4、执行传入的sql语句
int i = statement.executeUpdate(sql);
//5、如果执行到了这条语句,成功则返回true、失败则返回false
return i>0;
} catch (Exception e) {
e.printStackTrace();
} finally {
/*
* 6、关闭资源,无论上面执行成功或失败,都要关闭资源,所以放在finally代码块
* 如果上面没有给statement和connection赋值就执行失败的话,
* 这里如果没有判断就直接关闭资源,会报空指向异常
*/
if(statement != null) {
try {
//这里会报检查时异常所以要try/catch
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null) {
try {
//这里会报检查时异常所以要try/catch
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//如果执行到这里,就说明上面没有返回true,即执行失败,所以这里返回false
return false;
}
}
executeQuery
受上面executeUpdate的启发,可以这样写executeQuery:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class QueryClass3 {
public static ResultSet select(String sql) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost/mytest", "root", "1234");
statement = connection.createStatement();
resultSet= statement.executeQuery(sql);
return resultSet;
} catch (Exception e) {
e.printStackTrace();
}finally {
if (resultSet!=null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return null;
}
public static void main(String[] args) {
String sql = "select * from user_info";
ResultSet resultSet=select(sql);
try {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String realName = resultSet.getString("real_name");
String mobile = resultSet.getString("mobile");
String address = resultSet.getString("address");
System.out.println(id+":"+realName+":"+mobile+":"+address);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
但是执行后会发现出错了:
这里出现的异常提示不能在ResultSet关闭后操作ResultSet,再看main方法调用的select()方法中执行了resultSet.close(),关闭了资源,但是main方法接下来又执行resultSet.next(),这时由于资源已经关闭了所以就报错了。为了解决这种情况需要用到多态:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
interface IRowMapper{
void rowMapper(ResultSet resultSet);
}
public class QueryClass3 {
public static void main(String[] args) {
//声明一条sql语句
String sql = "select * from address";
//定义一个实现IRowMapper接口的内部类并重写抽象方法
class RowMapper implements IRowMapper{
@Override
public void rowMapper(ResultSet resultSet) {
//在main方法中实现IRowMapper接口的RowMapper内部类实现的接口中的抽象方法由调用者自己定义
try {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String realName = resultSet.getString("real_name");
String mobile = resultSet.getString("mobile");
String address = resultSet.getString("address");
System.out.println(id+":"+realName+":"+mobile+":"+address);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* 声明一个ResultSet类型的变量用于接收select()方法返回的ResultSet对象
* select()方法中传入刚创建的sql语句与新建的RowMapper对象
*/
ResultSet resultSet = select(sql,new RowMapper());
}
public static ResultSet select(String sql,IRowMapper rowMapper) {
//声明用户名
String user = "root";
//声明用户密码
String password = "1234";
//由于下面的两个代码块中都要用到Connection、ResultSet和Statement的对象,所以在这里先声明变量
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
//声明链接的数据库的地址
String url = "jdbc:mysql://localhost:3306/mytest";
//由于下面的语句抛出了检查时异常,所以这里要try/catch
try {
//1,加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2,创建链接
connection = DriverManager.getConnection(url, user, password);
//3,创建sql语句
statement = connection.createStatement();
//4,执行传入的sql语句
resultSet = statement.executeQuery(sql);
/*
* 5,这里的rowMapper实际是上转型对象,调用的rowMapper()方法
* 在运行时实际是实现类的方法,而实现类是在main方法中由调用者
* 自己创建的的内部类,其实现完全由调用者自定义,这样的话程序就
* 会等待该方法执行完毕后再接着向下执行,就避免了操作resultSet
* 的时候遇到resultSet已经关闭的异常情况了
*/
rowMapper.rowMapper(resultSet);
} catch (Exception e) {
e.printStackTrace();
} finally {
/*
* 6、关闭资源,无论上面执行成功或失败,都要关闭资源,
* 所以放在finally代码块
* 如果上面没有给statement、resultSet 和connection赋值就执行失败的话,
* 这里如果没有判断就直接关闭资源,会报空指向异常
*/
if(resultSet != null) {
//这里会报检查时异常所以要try/catch
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement != null) {
//这里会报检查时异常所以要try/catch
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null) {
//这里会报检查时异常所以要try/catch
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return null;
}
}