1

学习java。当我在 java 中使用查询进行 jdbc 调用时,如何存储该记录。我已经看到它们被更高级的编码器存储在哈希集合中,但我不确定如何使用 java 集合框架来存储记录并遍历它们。有没有人有一个简单的代码示例,他们可以分享和解释用于存储结果集记录(如哈希图)?

先感谢您。对不起菜鸟问题。

4

4 回答 4

1

您的问题被标记为春季问题;所以我要给你一个春天的答案。以下是涉及的部分:

  • 你的 java 对象
  • 一个 RowMapper 类
  • ResultSetExtractor 类
  • 您的查询
  • 一个 Jdbc 模板

将结果集数据存储在哈希图中以及所有相关代码以可靠地获取该数据可能会变得混乱。使用 spring 的数据提取器范例来隐藏将 java 对象与数据库匹配的混乱细节,然后您可以像往常一样继续编写 java,就好像您的应用程序根本没有连接到数据库一样。

JdbcTemplate是 Spring 提供给您的一个类,您可以对其进行配置,允许您在数据库上执行查询。使用 spring,您不必编写 jdbctemplate,它为您提供,但您确实需要编写其他部分,它看起来像这样:

我的 java 对象

public class Shoe {
 int size;
 String color;
 String id;

}

抽鞋机

public class ShoeExtractor implements ResultSetExtractor {

public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
    Shoe s = new Shoe();
    // setting object's values to result set's values
    s.setSize(rs.getInt(1));
    s.setColor(rs.getString(2));
    s.setId(rs.getString(3));
    return s;
}

行映射器

public class ShoeRowMapper implements RowMapper {

    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
        ShoeExtractor shoeExtractor = new ShoeExtractor ();
        return shoeExtractor.extractData(rs);
    }
}

在你的“主要”

@Resource
private JdbcTemplate jdbcTemplate;

StringBuffer statement = new StringBuffer();
statement.append("select size, color, id from shoes");

List<Shoe> shoes = jdbcTemplate.query(statement.toString(), new ShoeRowMapper ()):
于 2013-05-15T18:31:12.640 回答
1

如果您使用的是框架,那么您必须遵守该框架的 ORM 规则。如果您正在滚动自己的类并自己进行 JDBC 调用,那么您可以提供自己的简单“框架”,如下所示:

  • 数据库中的每个表都是一个类
  • 表中的每一列都是类的实例字段
  • 您可以编写一个通用查询方法,将您的数据作为对象列表返回
  • 使用工厂生成您希望为您使用的查询创建的对象

这是此范例的一个简单示例:

我有一个数据库客户端,所以我将编写一个类来表示数据模型。此类是使用 JavaFX 属性编写的,因此可以在 GUI 中表示元素。

public class Client extends DB {

private IntegerProperty id =         new SimpleIntegerProperty();
private StringProperty  lastName =   new SimpleStringProperty();
private StringProperty  firstName =  new SimpleStringProperty();

public final int getID() {return this.id.get(); }
void setID(int id) { this.id.set(id); }
public final IntegerProperty idProperty() { return this.id; }

public final String getLastName() { return this.lastName.get(); }
public final void setLastName(String ln) { this.lastName.set(ln); }
public final StringProperty lastNameProperty() { return this.lastName; }

public final String getFirstName() { return this.firstName.get(); }
public final void setFirstName(String fn) { this.firstName.set(fn); }
public final StringProperty firstNameProperty() { return this.firstName; }

Client(ResultSet jrs) {

    try {
        this.id.set(jrs.getInt(DB.CLI_FIELD_ID));
        this.lastName.set(jrs.getString(DB.CLI_FIELD_LAST));
        this.firstName.set(jrs.getString(DB.CLI_FIELD_FIRST));

    } catch (SQLException ex) {
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        System.exit(1);
    }
}

static class ClientFactory implements Callback<ResultSet,Client> {

    @Override
    public Client call(ResultSet jrs) {
        return new Client(jrs);
    }
}

这个类包含三样东西:

  1. 类的实例字段的 JavaFX bean 定义,以便它们可以与 JavaFX 框架提供的 GUI 控件一起使用。

  2. 一个构造函数,它使用包含在作为参数传递给构造函数的 ResultSet 的当前指示行中的数据来初始化 Client 类的实例。

  3. 一个嵌套的静态类,提供用于创建新客户端对象的工厂。这很简单。工厂所做的一切就是通过将 ResultSet 行传递给它来调用 Client 的构造函数。请注意,该类实现了 Callback 接口,以表明该工厂希望接收一个Resultset 类型的参数,并将返回一个Client 类型的结果。为此,我选择使用 Callback 接口,但程序员可以为工厂使用他自己的类似接口。

为了使这个自制的框架工作,可以使用类似于以下的自制查询方法。此方法允许程序员使用 long 类型的单个参数进行查询,但它可以很容易地抽象为允许使用提供的参数列表构建查询:

static <E> ObservableList<E> doGenericQuery(long param,
        String sql, Callback<ResultSet,E> factory) {

    Connection con = null;
    ObservableList<E> queryList = FXCollections.<E>observableArrayList();

    try {
        con = MyDataBase.getConnection(); // provide your own connection here
        PreparedStatement ps = con.PreparedStatement(sql);

        ps.setLong(1, param);

        ResultSet jrs = ps.executeQuery();

        while (jrs.next()) {
            queryList.<E>add(factory.<ResultSet,E>call(jrs));
        }

    } catch (SQLException e) {
        Logger.getLogger(DB.class.getName()).log(Level.SEVERE, null, e);

    } finally {            
        if (jrs != null) try { jrs.close(); } catch (SQLException e) { }
    }

    return queryList; 
}

这个通用方法查询您的数据库并将 ResultSet 转换为基于您的数据模型表类之一的对象列表(这里是 ObservableList,因为同样是 JavaFX)。关键是泛型方法调用:

queryList.<E>add(factory.<ResultSet,E>call(jrs));

它使用您的一个数据模型类(E 类)的工厂来使用 ResultSet 中当前指示的数据行为该 E 类构建一个对象。

以这种方式构建数据库应用程序有利有弊:它可能比依赖于 ORM 框架的性能更高,但它还需要您完成所有数据库到对象映射的步骤。它使您摆脱对框架的依赖,但您必须编写更多代码,尤其是样板代码。

如果您的应用程序很简单,或者您的数据库不太复杂,您可能希望以类似的方式自行开发自己的“框架”。

于 2013-05-15T19:55:30.300 回答
0

在 java 中,为每个结果或每个结果的子集创建一个类是惯用的。例如

patientResultSet => patientEntityObject

将其存储在 Collection中并不习惯。原因是,很难对其进行检查以找出如何获得所需的字段。

于 2013-05-15T17:34:42.160 回答
0

通常您必须自己将结果集数据映射到某种类中。这称为对象关系映射(ORM,我假设您使用的是结构化数据库)。您可以按照以前的答案或现有的 api/产品(例如 jpa/hibernate)中所示自己做

于 2013-05-15T17:36:20.023 回答