比如:
解读:
BeanListHandler
实现类的ResultSetHandler
接口的泛型设置为List<T>
,是因为它用于将ResultSet结果集中的多行数据转换成Java对象,并将这些对象存储在List集合中返回。
实现类设置自己的泛型,实现接口时定义实现接口的泛型类型参数
实现类需要返回List<T>
,但是接口的handle
抽象方法的返回类型是接口的泛型类型。
只需要在实现接口时把接口的泛型定义为List<T>
,那么接口的handle
抽象方法的返回类型就是List<T>
接口
/**
* 模板方法模式,把要变化的放到子类中实现,把固定重复的放到父类中反复调用
* 实现ResultSetHandler<List<T>>,这样handler返回类型为List
* 同时handler负责接收数据
* 创建一个抽象方法handleRow负责让子类重写并调用子类对应的单行处理器
*
* @param <T>
*/
public abstract class AbstractListHandler<T> implements ResultSetHandler<List<T>> {
@Override
public List<T> handler(ResultSet resultSet) throws SQLException {
// 创建集合用于接收数据
List<T> list = new ArrayList<>();
// 遍历结果集
while (resultSet.next()) {
// 调用子类实现的单行查询的抽象方法,将数据传入集合中
list.add(handleRow(resultSet));
}
return list;
}
/**
* 单行查询的抽象方法提供给子类实现
* @param resultSet
* @return
* @throws SQLException
*/
public abstract T handleRow(ResultSet resultSet) throws SQLException;
}