每个多个表具有相同结构的一个DAO

时间:2011-04-22 14:07:11

标签: java spring jdbc dao spring-jdbc

我正在使用Spring和Oracle DB,并且由于需要在包含相同列的单独表中存储不同的XML文件,我想使用单个DAO来对这些表进行操作。我是Spring的新手,所以我问这种方法是否可行,如果可行,那么它是如何完成的。

1 个答案:

答案 0 :(得分:2)

您可以使用Spring JDBCJdbcTemplate轻松完成。

  • 创建一个抽象的实体基类

    public abstract class YourBaseEntityClass {
        private String fooProperty;
        private Long barProperty;
        // + getters and setters
    }
    
  • 创建通用DAO接口

    public interface Dao<T> {
        T get(Long id);
        // you'll probably want more methods here :-)
    }
    
  • 创建通用抽象RowMapper

    public abstract class GenericRowMapper<T extends YourBaseEntityClass>
    implements RowMapper<T> {
    
        public T mapRow(final ResultSet rs, final int rowNum)
        throws SQLException {
            final T entity = instantiateEntityClass();
            entity.setFooProperty(rs.getString("foo"));
            entity.setBarProperty(rs.getLong("bar"));
            return entity;
        }
    
        protected abstract T instantiateEntityClass();
    
    }
    
  • 创建通用DAO实现

    public class GenericJdbcDao<T> implements Dao<T> {
    
        private String tableName;
        public void setTableName(final String tableName) {
            this.tableName = tableName;
        }
    
        private JdbcTemplate jdbcTemplate;
        public void setJdbcTemplate(final JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        private RowMapper<T> rowMapper;
        public void setRowMapper(final RowMapper<T> rowMapper) {
            this.rowMapper = rowMapper;
        }
    
        public T get(final Long id) {
            return jdbcTemplate.queryForObject(
                // please don't do it like this, this is just a quick example
                "select * from " + tableName + " where id=" + id, rowMapper);
        }
    }
    

现在,对于每种特定的实体类型,您需要:

  1. 子类YourBaseEntityClass
  2. 子类GenericRowMapper,以便创建新的实体类型
  3. 使用Spring,使用正确的表名和rowmapper
  4. 配置新的GenericDao实例

    就是这样!