1

我正在编写我的第一个 java/DB/web 应用程序。我是 java/javascript/css/html 的新手,所以这个项目对我来说是一次学习经历。该应用程序将在网页中显示来自数据库的结果,还允许用户从网页编辑/添加信息到数据库。

我用的是spring,程序的大体流程如下:Web Page -> some javascript -> Reference Rest Service -> Reference Service -> DAO -> DTO -> DB

问题是应用程序当前对每个查询都有不同的 DAO 和 DTO。我想简化程序,以便有一个可以处理所有查询的 DAO 和 DTO。

我正在尝试创建一个可以处理 2 到 10 个不同插槽的 DTO,我希望每个插槽都有一个名称而不是与之关联的数字。我也相信插槽的名称应该由数据库的返回来设置。然后我需要一种可靠的方法将数据映射到 DAO 中的行。我将发布一些简单的示例代码来展示我正在使用的内容。

@Repository
public class DecisionLevelDaoImpl implements DecisionLevelDao {

private JdbcTemplate jdbcTemplate;

@Autowired
public DecisionLevelDaoImpl(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}
private static String FIND_ACTIVE_DECISION_LEVEL = DaoHelper
        .loadResourceToString("queries/DecisionLevel_FindActive.sql");
@Override
public List<DecisionLevelDTO> findActiveDecisionLevel() {
    return jdbcTemplate.query(FIND_ACTIVE_DECISION_LEVEL, new DecisionLevelDTORowMapper());
}
private class DecisionLevelDTORowMapper implements RowMapper<DecisionLevelDTO> {
    @Override
    public DecisionLevelDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
        String levelCd = rs.getString("LevelCd");
        String levelName = rs.getString("LevelName");
        String levelInstruct = rs.getString("LevelInstruct");
        String active = (rs.getBoolean("active") ? "Y" : "N");
        String printOrder = Integer.toString(rs.getInt("PrintOrder"));
        String lastUpdUser = rs.getString("LastUpdUser");
        return new DecisionLevelDTO (levelCd, levelName,
                   levelInstruct, active, printOrder,lastUpdUser);
    }
}

这是 DTO:

import org.codehaus.jackson.annotate.JsonProperty;

public class DecisionLevelDTO {

@JsonProperty("levelCd")
private String levelCd;
@JsonProperty("levelName")
private String levelName;
@JsonProperty("levelInstruct")
private String levelInstruct;
@JsonProperty("active")
private String active;
@JsonProperty("printOrder")
private String printOrder;
@JsonProperty("lastUpdUser")
private String lastUpdUser;

public DecisionLevelDTO () { }
public DecisionLevelDTO (String levelCd, String levelName,
        String levelInstruct, String active, String printOrder,
        String lastUpdUser) {
    super();
    this.levelCd = levelCd;
    this.levelName = levelName;
    this.levelInstruct = levelInstruct;
    this.active = active;
    this.printOrder = printOrder;
    this.lastUpdUser = lastUpdUser;
}

目前大约有 25 个 Dao 和 25 个 DTO。这似乎非常重复,我很想找到一种更易于维护的方法。

我不是在寻找任何人来编写我的代码,我这样做是为了学习,所以免费代码根本对我没有帮助。我看到的所有教程都有一个 DAO 和一个 DTO,它们从单个查询返回结果。

抱歉,如果这是此类问题的错误论坛。

4

1 回答 1

1

我现在明白你的意思了。您可以做的是为 DML 和 DQL 查询创建单独的通用方法。

这些方法将接受查询和一个ResultSet(在 DQL 的情况下)或PreparedStatement(在 DML 的情况下)。同样,您可以根据需要将 DML 划分为 Update/Delete/INsert。

现在,当您收到查询时,您知道查询的作用。因此,将ResultSetPreparedStatement设置为适用,并将查询与它一起传递并获取结果。
如果不清楚,请告诉我。

于 2013-03-22T06:08:06.647 回答