Один DAO на несколько таблиц с одинаковой структурой - PullRequest
2 голосов
/ 22 апреля 2011

Я использую Spring и Oracle DB и из-за необходимости хранить разные XML-файлы в отдельных таблицах, содержащих одни и те же столбцы, я хотел бы использовать один DAO для операций с этими таблицами.Я новичок в Spring, поэтому я спрашиваю, возможен ли такой подход, и если да, то как это сделать.

1 Ответ

2 голосов
/ 29 апреля 2011

Вы можете сделать это очень легко с Spring JDBC JdbcTemplate .

  • Создание абстрактного базового класса сущностей

    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 настройте новый экземпляр GenericDao с правильным именем таблицы и строкой

Вот и все!

...