概述
- 在这里,jdbc是java database connection的缩写
- 我们在Java连接数据库时,一般有六个步骤:
1.加载驱动程序类;2.建立连接;3.创建语句;4.执行语句;5.处理结果;6.释放资源
我们把查询方法进行封装的目的是定义一个查询方法,能够实现对不同SQL语句做出对应的结果
下面我们来看这样一段代码,并对代码进行分析,代码执行的先后顺序用小写字母表示:
package jdbc;
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 Select {
public static void select(String sql,IRowMapper rowMapper) {
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
try {
Class.forName("com.mysql.jdbc.Driver");//d.加载驱动程序类
connection=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root");//e.建立连接
statement=connection.createStatement();//f.创建语句
resultSet=statement.executeQuery(sql);//g.执行语句
rowMapper.rowMapper(resultSet);//h.在这里为rowMapper对象调用IRowMapper接口的实现类RowMapper重写后的rowMapper方法,在这里为一个多态,此时程序运行转向main方法中的内部类中的重写后的roeMapper方法
}catch (Exception e) {
e.printStackTrace();
}finally {//k.释放资源
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();
}
}
}
}//l.select方法执行完毕,回到main方法中的执行过程
public static void main(String[] args) {
class RowMapper implements IRowMapper{
@Override
public void rowMapper(ResultSet resultSet) {
try {
while(resultSet.next()) {//i.遍历结果,此时java中的“指针”刚开始指向空,resultSet.next()表示指向空的下一个,如果不为空,则就输出查询到的该元素的所有信息
String id=resultSet.getString("id");
String name=resultSet.getString("name");
System.out.println(id);
System.out.println("name");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}//j.内部类中的rowMapper方法执行完毕,这时候程序执行回到select方法
String sql="select *from student";//a.sql中存的是字符串的地址
IRowMapper rowMapper = new RowMapper();//b.这里的rowMapper是一个上转型对象,存的是RowMapper新对象的地址,在这里我们创建的RowMapper实际上为IRowMappe接口的实现类
select(sql,rowMapper ); //c、开始调用select方法,执行过程切换到select方法,传入sql语句字符串地址,和IRowMapper实现类创建的对象的地址
} //因为main方法结束,则整个程序结束
}
- 下面我们来看这样一段代码;
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test1 {
public static ResultSet select(String sql) {
Connection connection = null;
Statement statement = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root");
statement = connection.createStatement();
rs = statement.executeQuery(sql);
while(rs.next()) {
String id = rs.getString("id");
String address = rs.getString("address");
System.out.println(id);
System.out.println(address);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (rs!=null) {
try {
rs.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) {
select("select * from student");
}
}
此时的sql中有
并且此时代码的运行结果为:
但是这样的方法有一个弊端,就是这样写代码的话,具有单一性,只能输出id和address,不能实现对不同sql语句有不同输出结果的功能。
- 还有一种代码的方式,也是值得我们从中思考的:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test2 {
public static ResultSet select(String sql) {
Connection connection = null;
Statement statement = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root");
statement = connection.createStatement();
rs = statement.executeQuery(sql);
return rs;
} catch (Exception e) {
e.printStackTrace();
}finally {
if (rs!=null) {
try {
rs.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) {
ResultSet resultSet=select("select * from student");
try {
while(resultSet.next()) {
String id = resultSet.getString("id");
String address = resultSet.getString("address");
System.out.println(id);
System.out.println(address);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这时候在main方法中的,try-catch中的代码块是不执行的,因为在resultSet调用select方法时,再执行前面的select方法时,执行到finally时,就把资源释放了,此时while语句及下面的代码块就不执行了。
最后
以上就是怕黑毛豆为你收集整理的详述jdbc查询方法的执行过程的全部内容,希望文章能够帮你解决详述jdbc查询方法的执行过程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复