将JDBC中的查询操作封装为一个方法

 首先我们先在MySQL数据库中建立一个表,并存储一些简单的数据进去:

以下是JDBC中的查询操作: 

package sql;

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 void main(String[] args) {
		Statement statement=null;
		Connection connection=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("select * from student");
			while(rs.next()) {//循环每执行一次,获取一行数据
				String id=rs.getString("id");
				String address=rs.getString("address");
				System.out.println("id:"+id+",address:"+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();
				} 
			}
		}
	}
}

一.第一种方式

将以上的操作放在一个方法中,然后在main方法中传入一段SQL语句来调用该方法,就像如下代码:

package sql;

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 void select(String sql) {
		Statement statement=null;
		Connection connection=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:"+id+",address:"+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();
				} 
			}
		}
	}
	
	public static void main(String[] args) {
		select("select * from student");
	}
}

该方式是可以执行的,但是该方法只能查看test数据库中的student表里的数据,因为你所查看的字段名都已经被方法给写死了,20到24行中id、address都是student表中才有的数据,局限性太大了。

二.第二种方式

要想使用该封装后的方法还可以查看test数据库中的其他表,就需要将方法中要查看的字段名提到调用语句中去,以下便是封装该方法的第二种方式。

可以看到该方式的核心在于自定义一个IRowMapper接口作为枢纽双向将JDBC的方法与内部类RowMapper连接起来,下面我们对该段代码的执行情况详细分析以下:

1.第72行,创建一个String类对象,将操作MySQL数据库的指令的字符串的地址传入sql变量中。

2.第73行,该处为一个对象上转型,由于内部类RowMapper是接口IRowMapper的实现类,所以创建一个内部类对象,将其地址传入IRowMapper的变量rowMapper中。

3.第74行,调用JDBC方法select,将MySQL数据库的操作语句sql,上转型对象rowMapper传入方法中。

4.接下来进入JDBC查询方法中:第20行,用Class.forName加载驱动类。

5.第21行,用驱动器调用getConnection方法建立与MySQL数据库的连接。

6.第22行,statement是Statement类对象,用来存放一条由createStatement方法创建的语句的。

7.第23行,ResultSet类对象rs可以看成是一个存放数据的集合,用statement调用executeQuery方法查看数据库中的数据,传入参数sql以确定查看的是test数据库中的哪一个表中的那些数据,然后将这些数据传入集合rs中。

8.第24行,该处为多态的使用,因为传入的参数rowmapper是IRowMapper类型,但是该变量指向的是该接口的实现类,也就是内部类RowMapper的对象,所以表层上调用的是接口的rowMapper方法,实则调用的是实现类重写过的rowMapper方法。

9.接下来进入实现类重写的rowMapper方法中:第60行,在重写的rowMapper方法中,传入进来的参数是select方法中的集合rs,所以为了查看其中的数据,再用while循环对其进行遍历,并在循环体中将数据打印出来以供查看。

10.第68行,结束try-catch异常处理,结束rowMapper方法,返回select方法中。

11.第27行,用finally代码块对方法中的connection,statement,rs变量释放资源,这里要注意一点就是释放的顺序必须要是定义顺序的逆序。

12.第51行,释放完资源后,select方法结束,执行过程返回给main方法。

13.第77行,main方法结束。

package sql;

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 rs=null;
		try {
			Class.forName("com.mysql.jdbc.Driver");//4
			connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","root");//5
			statement = connection.createStatement();//6
			rs=statement.executeQuery(sql);//7
			rowmapper.rowMapper(rs);//8
		} catch (Exception e) {
			e.printStackTrace();
		}finally {//11
			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();
				} 
			}
		}//12
	}
	
	public static void main(String[] args) {
		class RowMapper implements IRowMapper{

			@Override
			public void rowMapper(ResultSet resultSet) {
				try {
					while(resultSet.next()) {//9
						String id=resultSet.getString("id");
						String address=resultSet.getString("address");
						System.out.println(id);
						System.out.println(address);
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}//10
			}
			
		}
		String sql="select * from student";//1
		IRowMapper rowMapper = new RowMapper();//2
		
		select(sql,rowMapper);//3
	}
}//13

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值