Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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 通用数据库方法_Java_Generics - Fatal编程技术网

Java 通用数据库方法

Java 通用数据库方法,java,generics,Java,Generics,我有一个从Drupal CMS检索数据的Java类。Drupal中最终会有相当多的内容类型,我需要将它们拉入Java和缓存中。由于Drupal的工作方式,每种内容类型都是一个单独的数据库视图 我有一个由服务层调用的方法,它返回一个特定的对象类型。然而,我担心的是,每种内容类型的这些方法都会激增 有人能建议一种更通用的方法吗?数据库方法如第二个代码示例所示。我不知道我是否也能让它变得通用,是否值得。也许我可以在第一个方法中调用一个方法,让第二个方法使用case语句 public DeliveryS

我有一个从Drupal CMS检索数据的Java类。Drupal中最终会有相当多的内容类型,我需要将它们拉入Java和缓存中。由于Drupal的工作方式,每种内容类型都是一个单独的数据库视图

我有一个由服务层调用的方法,它返回一个特定的对象类型。然而,我担心的是,每种内容类型的这些方法都会激增

有人能建议一种更通用的方法吗?数据库方法如第二个代码示例所示。我不知道我是否也能让它变得通用,是否值得。也许我可以在第一个方法中调用一个方法,让第二个方法使用case语句

public DeliverySchedule getDeliverySchedule(final String cmsKey) { //     <---- make return type (Del Schedule) generic

    String cacheKey = TYPEDS + cmsKey;
    DeliverySchedule cmsInstance = CMSObjectCache.getCachedCMSObject(cacheKey, DeliverySchedule.class);   // Make generic

    // Object not found in cache, go to database.
    if (cmsInstance == null) {
        try {
            cmsInstance = getDeliveryScheduleFromDB(cmsKey);   //  <---- How can I make this generic so I can avoid DRY?
            CMSObjectCache.putCachedCMSObject(cacheKey, new CMSObject(DeliverySchedule.class, cmsInstance));
            return cmsInstance;
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    } else {
        return cmsInstance;
    }
}

public DeliverySchedule getDeliverySchedule(最终字符串cmsKey){/通常每个表或视图都有一个DAO(DAO的接口和实现它的类)。这样,如果特定表架构发生更改,您的更改将被隔离到一个DAO类

您可以将内容类型概括为具有单个接口和实现每个内容类型接口的类。这应允许您适应通用内容类型层、特定内容类型和数据访问层的更改

我同意,它可能会转化为大量代码,但如果每个组件都与其他组件分离,那么在更改/添加组件或处理模式更改时,它会为您提供灵活性。分离和抽象在短期内可能是痛苦的,但从长远来看,往往会在整个工程团队中获得回报


我喜欢这样的问题/讨论,并且总是乐于接受建议或其他方法。

要创建类的新实例,您需要在类对象上使用反射装置。因此,您要做的是使用一个泛型类,其实例具有该类的记录。比方说,您的bean扩展了mybean

abstract class<T extends MyBean> Mapper implements T {
    abstract void map(ResultSet rs);
}

class DAO<T extends MyBean> {
    Class<Mapper<T>> theMapperClass;
    DAO(Class<T> clazz) { 
        this.theMapperClass = getMapperClassFor(clazz); 
    }

    List<T> getAList() {
        List<T> l = new ArrayList<T>();
        ResultSet rs = runTheQuery();
        while(rs.next()) {
            l.add(theMapperClaxx.newInstance().map(rs));
        }
        return l;
    }
}
抽象类映射器实现了{
抽象空洞图(结果集rs);
}
类刀{
给上层阶级分类;
DAO(类clazz){
this.theMapperClass=getMapperClassFor(clazz);
}
列表getAList(){
列表l=新的ArrayList();
ResultSet rs=runTheQuery();
while(rs.next()){
l、 添加(theMapperClaxx.newInstance().map(rs));
}
返回l;
}
}
那种事

   DAO<Foo> fooDao = new Dao<Foo>(Foo.class);
   List<Foo> l = fooDao.getAList();

   List<? extends MyBean> l = someDao.getAList();

   static <T extends Mybean> List<T> boink(Class<T> clazz) {
       DAO<T> tDao = (DAO<T>) daoMap.get(clazz);
       return tDao.getAList();
   }

   List<Foo> l = boink(Foo.class);
DAO fooDao=新的DAO(Foo.class);
List l=fooDao.getAList();
列表
   DAO<Foo> fooDao = new Dao<Foo>(Foo.class);
   List<Foo> l = fooDao.getAList();

   List<? extends MyBean> l = someDao.getAList();

   static <T extends Mybean> List<T> boink(Class<T> clazz) {
       DAO<T> tDao = (DAO<T>) daoMap.get(clazz);
       return tDao.getAList();
   }

   List<Foo> l = boink(Foo.class);