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
答案 0 :(得分:1)
在AbstractDAO
课程中添加其他抽象方法,例如getRowMapper()
并在派生类中提供不同的实现:
@Override
public List<Trade> findOne(final int eventId) {
return jdbcTemplate.query(getOneQuery(), new Object[]{eventId}, getRowMapper());
}
答案 1 :(得分:0)
使用构造函数自动装配相应的类型。
由于TypeBDAO
需要使用TypeBMapper
,TypeBDAO
只接受其构造函数中的特定类型:
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可用,并且映射器是线程安全的。