将ResultSet转换为私有字符串的最快方法?

时间:2016-02-16 20:33:32

标签: java

我有一个每次动作发生时运行的类,例如,我登录并运行User类。该类传递ResultSet,其中包含该特定用户的信息。

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

public User(ResultSet resultSet) throws SQLException {
    this.username = resultSet.getString("username");
    this.firstname = resultSet.getString("firstname");
    // etc etc.
}

这是有效的,但由于我在那里有大约二十几个元素,这将成为一个很长的列表。

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

我想知道是否有更快,也许更优雅的方式来解决这样的事情。

感谢。

3 个答案:

答案 0 :(得分:2)

您可以为从数据库中检索的每种信息类型创建一个类。您为用户信息创建了一个User类。除非您使用Hibernate之类的ORM,否则数据库表不会创建Java对象的快捷方式。

答案 1 :(得分:0)

我最近一直在研究一种简单的工具。它接受Map<String, Object>和类,并返回此类的实例。请查看my repository示例。如果您使用Maven,则只需添加依赖项:

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

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

答案 2 :(得分:0)

没有什么可以帮助你完成类似的事情。 有几种方法可以做到这一点

  1. 如果您愿意花时间和精力配置和设置框架并根据需要更新对象,那么使用ORM将是最佳选择。
  2. 使用Java反射和ResultSetMetaData将resultSet直接映射到Objects将是另一种选择。这些内容http://oprsteny.com/?p=900
  3. 如果你有幸让对象的字段名称与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));
    
                    }
                }
            }