我是靠谱客的博主 怕黑毛豆,最近开发中收集的这篇文章主要介绍详述jdbc查询方法的执行过程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 在这里,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查询方法的执行过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部