gpt4 book ai didi

java - 如何使用类参数分解 dao

转载 作者:行者123 更新时间:2023-11-30 04:54:37 26 4
gpt4 key购买 nike

我想创建一个返回 dao 实例的工厂,具体取决于 Class clazz

团队成员、场景和设备是我的模型类。

我的 DAO 看起来像这样:

public class JDBCTeammemberDAO implements JdbcDAO<Teammember>

我的工厂看起来像这样:

public class DAOFactory {

JdbcDAO createDAO(Class clazz) {
if(clazz.equals(Teammember.class)) {
return new JDBCTeammemberDAO();
}
if(clazz.equals(Scene.class)) {
return new JDBCSceneDAO();
}
if(clazz.equals(Equipment.class)) {
return new JDBCEquipmentDAO();
}
return null;

}
}

我正在考虑 switch 和多态性,但我不知道如何实现。

基本上我想找到实现“SomeClass Implements JdbcDAO”

我的第一个方法是:

String name = clazz.getName().substring(6); // model.Teammember
Class<?> forName;
try {
forName = Class.forName("dao.jdbc.JDBC" + name + "DAO");
return (JdbcDAO) forName.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}

但我觉得用 String 方法处理这个问题不太好。此外,如果我有不同的 Model 和 Dao 名称(例如: JDBCMemberDAO 而不是 JDBCTeammemberDAO),它就不起作用

最佳答案

我遇到了类似的情况,并决定使用 Dao 注册表来处理该问题。使用 @Perception 提到的通用 dao 模式:

public interface JdbcDAO<T> {
T find(Long id) ;
T create(T entity);
T update(T entity);
void delete(T entity);
}

public class JdbcDAOImpl<T> {
this.clazz = clazz;
DaoRegistry.register (clazz, this);
}

然后你就可以拥有你的

   public class JDBCTeammemberDAO extend JdbcDAOImpl<TeamMember> {
public class JDBCTeammemberDAO () {
super(TeamMember.class);
}
}

DaoRegistry 看起来像这样:

public class DaoRegistry {
private Map<Class, JdbcDAO> daoMap;

public synchronized void register (Class type, JdbcDao dao) {
if (!daoMap.containsKey(type))
daoMap.put (type, dao);
else
logger.error ("Something is really wrong because you are creating another dao for this class.", e);

}

public JdbcDAO get(Class type) {return daoMap.get(type);
}

这只是个玩笑,您需要确保它是线程安全的。希望这会有所帮助。

关于java - 如何使用类参数分解 dao,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8943304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com