Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将ResultSet获取到私有字符串的最快方法?_Java - Fatal编程技术网

Java 将ResultSet获取到私有字符串的最快方法?

Java 将ResultSet获取到私有字符串的最快方法?,java,Java,我有一个类,它在每次操作发生时都会运行,例如,我登录并运行User类。该类被传递一个包含该特定用户信息的ResultSet 现在我要做的是得到结果并将它们分割成“类变量”(我相信它们被称为字段)。我尝试了以下方法: public User(ResultSet resultSet) throws SQLException { this.username = resultSet.getString("username"); this.firstname = resultSet.get

我有一个类,它在每次操作发生时都会运行,例如,我登录并运行User类。该类被传递一个包含该特定用户信息的
ResultSet

现在我要做的是得到结果并将它们分割成“类变量”(我相信它们被称为字段)。我尝试了以下方法:

public User(ResultSet resultSet) throws SQLException {
    this.username = resultSet.getString("username");
    this.firstname = resultSet.getString("firstname");
    // etc etc.
}
这是可行的,但因为我有大约24个元素在里面,这将成为一个很长的列表

我还想到了一个方法,在这个方法中,我会查看结果,然后检查它是否是字符串。如果是,则将其分配给一个名称与键对应的变量,但这将把我的问题减少一半,因为我仍然需要声明所有这些变量

我想知道是否有一种更快,也许更优雅的方法来处理这样的事情


谢谢。

您可以为从数据库检索到的每种类型的信息创建一个类。您为用户信息创建了一个用户类。数据库表创建Java对象没有捷径,除非使用类似ORM的工具。

我最近一直在开发一个简单的工具来实现这一点。它接受一个
映射和一个类,并返回该类的一个实例。请看下面的例子。如果使用Maven,只需添加一个依赖项:

<dependency>
    <groupId>uk.co.jpawlak</groupId>
    <artifactId>map-to-object-converter</artifactId>
    <version>1.1</version>
</dependency>

uk.co.jpawlak
映射到对象转换器
1.1

当然,这需要您首先将
ResultSet
转换为
Map
,但是这非常简单,您只需编写一次代码。

没有现成的工具可以帮助您完成类似的任务。 有两种方法可以做到这一点

  • 如果您愿意花时间和精力配置和设置框架,并根据需要更新对象,那么使用ORM将是最佳选择
  • 使用Java反射和ResultSetMetaData将resultSet直接映射到对象是另一种选择。类似这样的东西
  • 如果您足够幸运,能够使对象的字段名与sql列名完全匹配(如示例中所示),您可以编写如下代码

    import java.lang.reflect.Field;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException; 
     ...    
    private void getUserDetails(ResultSet resultSet) throws SQLException, NoSuchFieldException, 
        SecurityException, IllegalArgumentException,  IllegalAccessException {
    
                ResultSetMetaData rsmd = resultSet.getMetaData();
                while (resultSet.next()) {
                    int i = rsmd.getColumnCount();
                    while (i-- > 0) {
                        // *this* being the user object
                        String colName = rsmd.getColumnName(i);
                        Field field = this.getClass().getDeclaredField(colName);
                        field.set(this, resultSet.getObject(colName));
    
                    }
                }
            }
    

    不知道你想做什么。您试图解决的性能问题是什么?听起来好像您试图在成功登录后收集用户信息。“这是对的吗?”安德烈亚斯:对不起,我把问题的格式弄错了一点。现在更清楚了吗?我建议您将局部变量
    set
    更改为类似
    resultSet
    rs
    的其他变量,因为
    set
    非常混乱。如果我理解正确,您可以为从数据库检索到的每种类型的信息创建一个类。您为用户信息创建了一个用户类。除非您使用类似Hibernate的ORM,否则数据库表没有创建Java对象的快捷方式。