关于DButils中的query(Connection conn, String sql, ResultSetHandler<T> rsh)方法使用的解释

首先介绍该方法的功能,就是实现数据库查询功能,并返回某个封装的对象,参数conn是数据库的连接对象,参数sql是查询的sql语句,参数rsh是用来约束返回的对象。

这是query(Connection conn, String sql, ResultSetHandler<T> rsh)方法的源代码:

public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh) throws SQLException {
return this.<T>query(conn, false, sql, rsh, (Object[]) null);
}

通过源码我们可以发现他调用的是另一个重载的query方法:

该方法的源代码如下:

private <T> T query(Connection conn, boolean closeConn, String sql, ResultSetHandler<T> rsh, Object... params)
throws SQLException {
if (conn == null) {
throw new SQLException("Null connection");
}

if (sql == null) {
if (closeConn) {
close(conn);
}
throw new SQLException("Null SQL statement");
}

if (rsh == null) {
if (closeConn) {
close(conn);
}
throw new SQLException("Null ResultSetHandler");
}

PreparedStatement stmt = null;
ResultSet rs = null;
T result = null;

try {
stmt = this.prepareStatement(conn, sql);
this.fillStatement(stmt, params);
rs = this.wrap(stmt.executeQuery());
result = rsh.handle(rs);

} catch (SQLException e) {
this.rethrow(e, sql, params);

} finally {
try {
close(rs);
} finally {
close(stmt);
if (closeConn) {
close(conn);
}
}
}

return result;
}

在源代码中我标记为橙色就是代码的关键部分,该方法返回一个泛型的result对象,而该对象通过调用ResultSetHandler对象的hadle()方法获得,

我们来了解ResultSetHandler<T>,以下是ResultSetHandler<T>的源码:

public interface ResultSetHandler<T> {

/**
* Turn the <code>ResultSet</code> into an Object.
*
* @param rs The <code>ResultSet</code> to handle. It has not been touched
* before being passed to this method.
*
* @return An Object initialized with <code>ResultSet</code> data. It is
* legal for implementations to return <code>null</code> if the
* <code>ResultSet</code> contained 0 rows.
*
* @throws SQLException if a database access error occurs
*/
T handle(ResultSet rs) throws SQLException;

}

他是一个接口;所以我们要实现query(Connection conn, String sql, ResultSetHandler<T> rsh)方法的功能,就必须实现ResultSetHandler<T>中的hadle()f方法。

实现的方法有多种:

1.可以通过匿名内部类来实现该功能:如下所示,Student为一个实体类

2.直接使用ResultSetHandler<T>的实现类BeanHandler实现功能

 3.使用ResultSetHandler<T>的实现类ArrayHandler实现功能

原文地址:https://www.cnblogs.com/oyina/p/11747759.html

时间: 2024-10-16 08:07:20

关于DButils中的query(Connection conn, String sql, ResultSetHandler<T> rsh)方法使用的解释的相关文章

在jdbc基础上进阶一小步的C3p0 连接池(DBCP 不能读xml配置文件,已淘汰) 和DBUtils 中两个主要类QueryRunner和ResultSetHandler的使用

首先看C3p0这个连接池,最大优势可以自动读取默认的配置文件 <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl&

使用回调函数,简单模拟dbutils中Queryrunner的工作原理,并重写Queryrunner,使其使用起来更加简单方便

所谓回调,就是在执行某个程序时,具体的封装处理由第三方类来实现,简单一点说就是记录内部,再出来(由第三方类可以对数据进行处理),再返回去继续执行,这个过程就是回调.想要程序具有记录内部的功能就必须定义一个规范,也就是接口,即你的程序出来被其他类处理了,但你规定了还要返回原程序. 下面看一个简单的例子: /** * @描述:回调函数--记录内部,再出来返回去的过程就叫回调 * @author cxie */ public class CopyOfCallBackDemo { public stat

[JavaWeb]关于DBUtils中QueryRunner的一些解读.

前言:[本文属于原创分享文章, 转载请注明出处, 谢谢.]前面已经有文章说了DBUtils的一些特性, 这里再来详细说下QueryRunner的一些内部实现, 写的有错误的地方还恳请大家指出. QueryRunner类 QueryRunner中提供对sql语句操作的API它主要有三个方法 query() 用于执行select update() 用于执行insert/update/delete batch() 批处理 1,Query语句先来看下query的两种形式, 我们这里主要讲第一个方法, 因

[JavaWeb]关于DBUtils中QueryRunner的一些解读(转)

QueryRunner类 QueryRunner中提供对sql语句操作的API它主要有三个方法 query() 用于执行select update() 用于执行insert/update/delete batch() 批处理 1,Query语句先来看下query的两种形式, 我们这里主要讲第一个方法, 因为我们用C3P0来统一管理connection.(QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()))query(sql,Re

关于DBUtils中QueryRunner看批量删除语句batch

//批量删除 public void delBooks(String[] ids) throws SQLException { QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); Object[][] params = new Object[ids.length][];//高维确定执行sql语句的次数,低维是给?赋值 for (int i = 0; i < params.length; i++) { params[i] = n

Connection conn = DriverManager.getConnection(&quot;jdbc:odbc:bbs&quot;);

Connection conn = DriverManager.getConnection("jdbc:odbc:bbs"); 这是JDBC连接数据库的时候用的一句话,,Connection是接口,DriverManager是一个类,,getConnection()方法  是静态方法 他们之所以能用= 号连接起 因为getConnection()方法 返回的是 实现了Connection接口的类的实例 其实Connection 是类 还是接口,,正常情况下使用类声明一个变量,, 而 接

(转)Hibernate中的Query一些基本用法

/*** 添加*/public void save(Stu stu){ try { tran=this.GetSession().beginTransaction(); this.GetSession().save(stu); tran.commit(); } catch (HibernateException e) { throw e; }finally{ this.CloseSession(); }} /*** 使用HQL全查询*/public List getallbyHQL(){ Lis

SQLAlchemy中的Query方法

在SQLAlchemy中执行查询是通过session对象的query方法完成的.query方法非常灵活,你可以根据需要使用不同的查询方式查找数据,下面一一举例.1.直接通过映射类查找: #Querying user instancefor instance insession.query(User).order_by(User.id):  print instance.name,instance.fullname 这种方法只要在query方法中,将映射类作为参数,就可以查询出这个映射类代表的数据

hibernate 中的query的分页查询

//方法描述:根据会员名称和页容量分页查询代理人 public List<HbUser> findUserByPage(int page,int pageSize, String userName)   throws Exception {  Session session = sessionFactory.getCurrentSession();  StringBuffer hql = new StringBuffer("from HbUser where isDelete = 0