当前位置: 首页 > 知识库问答 >
问题:

通用行映射器JDBC

程修雅
2023-03-14

我正在尝试为JDBC创建一个通用行映射器。

因此,我的初始片段如下所示:

public class GenericRowMapper<T> implements RowMapper<T> {

    private final Class<?> clazz;

    public GenericRowMapper(T instance) {
        this.clazz = instance.getClass().getComponentType();
    }

    @Override
    public T mapRow(ResultSet rs, int rowNum) throws SQLException {
        Field[] fields = clazz.getDeclaredFields();
        for(Field f : fields){
            System.out.println("field name : " + f.getName() + " , type : " + f.getType());
        }

        try {
            return (T) clazz.getConstructor().newInstance();
        } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
    }
}

但是在构造函数中,getComponentType()返回null,因此clazz=null 我无法取得任何进展。

我做错了什么?

谢谢

共有1个答案

皇甫飞飙
2023-03-14

我做错了什么?

许多新手程序员都会犯这样的错误(有些专家也是如此!)。

您未能阅读文档。

如果这样做了,您可能已经注意到,getComponentType()的文档告诉您它返回数组的组件类型。

例如,给定类

很明显,您正在调用<代码>。getComponentType()在不表示数组类型的类上,因此,返回null。

您的代码相当混乱T是一个类型变量,因此,采用参数T instance意味着必须提供它的实际实例,即如果您有一个将行映射为字符串的行映射器,则必须提供一个没有意义的字符串。大概您实际想要的arg是类

. getDeclaredFields()只返回类定义本身中的字段,而不是任何父类(其字段与任何其他实例一样是类的任何实例的一部分)-再次,阅读文档来解决这个问题。

“打印堆栈跟踪,返回null”是非常愚蠢的异常处理。正确的“我(还)不在乎它”异常处理程序是抛出新的RuntimeException(“未处理”,e);-更短,更好。没有理由不这样做。如果需要,请修复您的IDE模板。

许多现代的java(特别是包括记录功能)有一个不可变的类,因此您不能只是“设置”一堆字段,并且不会有一个无参数的构造函数(. getConstructor()得到你,因此,. getConstructor()会失败)。相反,构造函数本身接受所有参数;因此,您对字段不感兴趣,您对构造函数的参数感兴趣。除了可能有多个,并且类不(必要地)包含参数的名称。

 类似资料:
  • 目前我有一个DAO在做这样的事情: 而映射器则执行如下操作:(简化为该问题所需的内容) 作为JsonB字段存储在Aurora中。我读过一些关于注释的文章,但由于jdbi文档不清楚,所以我不确定这是否正确。 我映射结果的方式是“标准”方式吗?还是有更好/更有效的方式? 谢谢

  • 怎么做?没有找到可以基于类型动态映射的示例。我发现这种方法在、Google中都非常方便。感谢你的帮助!

  • Java在Map接口中提供了通用支持。 语法 (Syntax) Set<T> set = new HashSet<T>(); 哪里 set - Set Interface的对象。 T - 在set声明期间传递的泛型类型参数。 描述 (Description) T是传递给通用接口Set及其实现类HashSet的类型参数。 例子 (Example) 使用您选择的任何编辑器创建以下Java程序。 pa

  • 大家晚上好,我正在尝试用controller/Service/Dao/DaoImpl/和Mapper实现一个jdbctemplate模型。。。但从模型来看,映射器需要实现RowMapper或ParameterizedRowMapper,两者都有一个不返回列表的maprow方法。当我需要一个列表时,我在映射器中实现了一个方法来获得我需要的列表。但我不知道该怎么称呼它。在customerList方法中

  • 我试图通过嵌套的数组使用JSX映射代码。 这是: 以及迄今为止我提出的代码: 这就是我得到的错误: 我做错了什么?

  • 当我尝试通过枚举将源中的字符串映射到目标中的整数时。ModelMapper失败。 来源 目的地 字符串和整数之间的映射在枚举中定义