如何在abstractDAO中使用特定的rowmapper

时间:2018-03-08 16:54:12

标签: java spring jdbc abstract-class spring-jdbc

grid-template-columns: 1fr 300px 640px 1fr;

我有一个像上面那样的抽象DAO类。我有几个DAO实现处理我支持的不同类型,每个类型返回自己的public abstract class AbstractDAO<T> implements IFindDAO { @Autowired private JdbcTemplate jdbcTemplate; @Override public List<Trade> findOne(final int eventId) { return jdbcTemplate.query(getOneQuery(), new Object[]{eventId}, new TypeAMapper()); } @Override public List<Event> getAll() { return jdbcTemplate.queryForList(getAllQuery(), Event.class); } protected abstract String getOneQuery(); protected abstract String getAllQuery(); } getOneQuery()版本。

我有如下RowMappers:

getAllQuery()

TypeA Mapper

public class TradeMapper {

    public void map(Trade trade, ResultSet rs, int rowNum) throws SQLException {
        //common trade type setting
    }

}   

TypeB Mapper

public class TypeAMapper extends TradeMapper implements RowMapper<Trade> {

    @Override
    public Trade mapRow(ResultSet rs, int rowNum) throws SQLException {

        Trade trade = new Trade();

        map(trade, rs, rowNum);

        return trade;
    }

}

public class TypeBMapper extends TradeMapper implements RowMapper<Trade> { public TypeB mapRow(ResultSet rs, int rowNum) throws SQLException { Trade trade = new TypeB(); super.map(trade, rs, rowNum); TypeB typeB = (TypeB) trade; typeB.setSomethingABC(rs.getBigDecimal("ABC")); typeB.setSomethingABCDEF(rs.getString("ABCDEF")); return typeB; } } 课程必须使用TypeBDAO,但在我的TypeBMapper课程中,我将其设为AbstractDAO。确保我的TypeAMapper使用具有特定设置的TypeBDAO的最佳方法是什么。

我可以改善这种结构吗?我正在使用java 8

我的TypeBMapper模型扩展了TypeB

2 个答案:

答案 0 :(得分:1)

AbstractDAO课程中添加其他抽象方法,例如getRowMapper() 并在派生类中提供不同的实现:

@Override
public List<Trade> findOne(final int eventId) {
    return jdbcTemplate.query(getOneQuery(), new Object[]{eventId}, getRowMapper());
}

答案 1 :(得分:0)

使用构造函数自动装配相应的类型。

由于TypeBDAO需要使用TypeBMapperTypeBDAO只接受其构造函数中的特定类型:

public class TypeBDAO extends AbstractDAO {
   @Autowired
   public void (TypeBMapper mapper) {
       super(mapper);
   }
}

但是构造函数只是委托给super,它接受接口。然后,这些方法可以使用映射器而不是尝试创建新实例。

public abstract class AbstractDAO<T> implements IFindDAO {
    private final RowMapper<T> mapper;

    public AbstractDAO(RowMapper<T> mapper) {
        this.mapper = mapper;
    }

    @Override
    public List<Trade> findOne(final int eventId) {
        return jdbcTemplate.query(getOneQuery(), new Object[]{eventId}, mapper);
  }
}

这假设有适当的Spring托管bean可用,并且映射器是线程安全的。