2

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

4

1 回答 1

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 配置新的 GenericDao 实例

就是这样!

于 2011-04-29T12:27:35.057 回答