Java 如何在abstractDAO中使用特定的行映射器
A型绘图机Java 如何在abstractDAO中使用特定的行映射器,java,spring,jdbc,abstract-class,spring-jdbc,Java,Spring,Jdbc,Abstract Class,Spring Jdbc,A型绘图机 public class TradeMapper { public void map(Trade trade, ResultSet rs, int rowNum) throws SQLException { //common trade type setting } } 公共类TypeMapper扩展TradeMapper实现行映射器{ @凌驾 public Trade mapRow(结果集rs,int rowNum)引发SQLExcept
public class TradeMapper {
public void map(Trade trade, ResultSet rs, int rowNum) throws SQLException {
//common trade type setting
}
}
公共类TypeMapper扩展TradeMapper实现行映射器{
@凌驾
public Trade mapRow(结果集rs,int rowNum)引发SQLException{
贸易=新贸易();
地图(贸易、遥感、rowNum);
退货贸易;
}
}
B型绘图机
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;
}
}
公共类TypeBMapper扩展TradeMapper实现行映射器{
公共类型B映射行(结果集rs,int rowNum)引发SQLException{
贸易=新类型B();
super.map(trade、rs、rowNum);
B类B=(B类)贸易;
类型B.setSomethingABC(rs.getBigDecimal(“ABC”));
typeB.setSomethingABCDEF(rs.getString(“ABCDEF”);
返回类型B;
}
}
TypeBDAO
类必须使用TypeBMapper
,但在我的AbstractDAO
类中,我将其设置为TypeAMapper
。确保我的TypeBDAO
使用具有特定设置的TypeBMapper
的最佳方法是什么
我可以改进这个结构吗?我正在使用Java8
我的
TypeB
模型扩展了Trade
在AbstractDAO
类中添加额外的抽象方法,如getRowMapper()
只需在派生类中提供不同的实现:
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;
}
}
@覆盖
公共列表findOne(最终int事件ID){
返回jdbcTemplate.query(getOneQuery(),新对象[]{eventId},getRowMapper());
}
使用构造函数自动关联适当的类型
由于TypeBDAO
需要使用TypeBMapper
,TypeBDAO
只在其构造函数中接受该特定类型:
@Override
public List<Trade> findOne(final int eventId) {
return jdbcTemplate.query(getOneQuery(), new Object[]{eventId}, getRowMapper());
}
但是构造函数只是委托给super,super接受接口。然后,这些方法可以使用映射器,而不是尝试创建新实例
public class TypeBDAO extends AbstractDAO {
@Autowired
public void (TypeBMapper mapper) {
super(mapper);
}
}
公共抽象类AbstractDAO实现IFindDAO{
私有最终行映射器映射器;
公共抽象DAO(行映射器映射器){
this.mapper=mapper;
}
@凌驾
公共列表findOne(最终int事件ID){
返回jdbcTemplate.query(getOneQuery(),新对象[]{eventId},映射器);
}
}
这假设有合适的Spring托管bean可用,并且映射器是线程安全的
public class TypeBDAO extends AbstractDAO {
@Autowired
public void (TypeBMapper mapper) {
super(mapper);
}
}
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);
}
}