Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在abstractDAO中使用特定的行映射器_Java_Spring_Jdbc_Abstract Class_Spring Jdbc - Fatal编程技术网

Java 如何在abstractDAO中使用特定的行映射器

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

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)引发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);
  }
}