继承和DTO对象设计

时间:2015-06-12 07:57:08

标签: java design-patterns jdbc

我正在开发一个独立的J2SE应用程序(无法添加J2EE,Hibernate,Spring等等)。我需要设计代码架构的想法。

这是我的代码:

class PersonBean {

    String name;
    int id;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }   
}


class PersonMapper{
    PersonMapper(Connection conn){

    }

    PersonBean load(ResultSet rs){
        PersonBean entity = new PersonBean();
        entity.setId(rs.getInt("id"));
        entity.setName(rs.getString("name"));
        return entity;
    }

    PersonBean findById(int id){
        String query = "SELECT * FROM Person where id = ?";

        PreparedStatment stmt = conn.getPreparedStatement(query);

        stmt.setInt(1, id);
        ResultSet rs = stmt.executeQuery();

        if (rs.next())
            return load(rs);

        else
            return null;
    }
    List<PersonBean> findByName(String name) {}
}
  1. 使用getter为每个Table(mysql表)创建实体类 和setter,将其命名为Bean.class(PersonBean.class)
  2. 为每个表创建映射器类以检索其记录 该表,并填充实体。将其命名为Mapper.class (PersonMapper.class)。
  3. 我需要做些什么才能改进这种设计?

    在对象世界中,Student对象扩展Person对象。但是在数据库中,Student和Person是两个不同的表,这导致为StudentBean和PersonBean创建两个不同的类,其中StudentBean不会扩展PersonBean。我是否需要在实体Bean对象层之上创建业务层?如果是这样如何设计?

    我不知道如何开始浏览这个,任何链接也没关系。

3 个答案:

答案 0 :(得分:1)

如果你希望能够拥有一个层次结构,你应该实现一个更好的映射器,它可以在加载Person和Student bean之间做区别。更好的方法是自己实现,类似于Hibernate或Spring的JdbcTemplate ...这将花费你一段时间。

但在此之前,我建议尝试sql2java,为您拥有的所有表格生成与您类似的结构,并且还允许您自定义它,以及数据结构是否更改,它可以重新生成。

答案 1 :(得分:0)

我选择艾伯特说的逻辑

我建议相同的,您可以使用ResultSetMetaData编程来获取所有列/伪列名称,这些名称将映射为

EMPLOYEE_NAME to employeeName setter method setEmployeeName on the fly

您可以使用Java Reflection调用setter方法,也可以使用apache BeanUtils

答案 2 :(得分:0)

无论是学习还是实际使用,

最好查看DAO生成器生成的源。 您可以学到许多好东西,并远离设计失败。

在这里查看一个:FireStorm