【JDBC】第一节 详述JDBC执行过程

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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值