我正在开发一个JavaEE项目。我正在处理的所有/大多数类都驻留在数据库中。因此,所有人都必须支持创建,编辑和删除数据库条目。 我不想使用任何框架。我计划使用传统的预处理语句执行查询。
目前,我按照以下方式实施了
public interface Entity{
public boolean create(Entity e);//executes a query with the objects fields
public boolean change(Entity e);//executes a query to update fields of the entity
public boolean delete(Entity e);//deletes the entry
public ArrayList<Entity> getAll();//retrives all the entries in the database
}
现在我的问题
提前感谢!
答案 0 :(得分:3)
您说,您正在开发 Java EE 项目 - 那么为什么不使用它提供的API?有一个简单的建议:使用JPA并且不要将准备好的语句用于Java对象的CRUD操作,也不要重新发明已经拥有的Entity
,以及EntityManager
执行您需要的所有操作。
答案 1 :(得分:2)
您尝试实现的内容称为Data Access Object接口。它实际上是一个众所周知的良好做法,但从您的界面名称判断,您希望直接使用CRUD entities方法,并且不是一个好主意。
你应该创建一个界面,比如说
public interface BookDAO{
public Book create(Book book);
public List<Book> read();
public Book update(Book book);
public Book delete(Book book);
}
使用CRUD方法。然后你可以根据你的数据库实现这样的接口,比如说
class MySqlBookDAOImpl implements BookDAO{
private Connection conn;
private Connection getConnection(){
if(conn==null)
conn = mySqlConnectionPool.getConnection();
return conn;
};
@Override
public Book create(Book book){
Connection conn = getConnection();
String query = "INSERT... "
};
@Override
public List<Book> read(){
Connection conn = getConnection();
String query = "SELECT... "
};
@Override
public Book update(Book book){
Connection conn = getConnection();
String query = "UPDATE... "
};
@Override
public Book delete(Book book){
Connection conn = getConnection();
String query = "DELETE... "
};
}
并使用正确的数据库驱动程序实现抽象方法与数据库通信(也取决于您的连接策略)。
关于你的其他两个问题:
从界面实现方法时,始终ovveride
它。您无法仅因为没有super
方法而调用super
方法。只有在extend and override来自父类的方法时才会调用super
。
DAO应该负责将查询发送到数据库,DAO将在其方法中创建它们。
为什么你不愿意使用框架或内置API?有很多好的可以帮助你做很多工作(比如JPA)。
答案 2 :(得分:1)
您应该区分实体和DAO。实体是数据,DAO与数据库交互。
例如:
public interface Entity<K extends Serializable> {
K getId();
}
public interface Dao<K extends Serializable, E extends Entity<K>> {
E create(E entity);
E update(E entity);
E delete(E entity);
E get(K id);
List<E> getAll();
}
然后,实施:
public class User implements Entity<Integer> {
private Integer id;
public User(Integer id) {
this.id = id;
}
@Override
public Integer getId() {
return id;
}
}
public class UserDao implements Dao<Integer, User> {
@Override
public User create(User entity) {
// build query
}
@Override
public User update(User entity) {
// build query
}
@Override
public User delete(User entity) {
// build query
}
@Override
public User get(Integer id) {
// build query
}
@Override
public List<User> getAll() {
// build query
}
}
例如,可以通过设置BaseDao
抽象类来改进这一点,因为DAO肯定会有公共代码。
答案 3 :(得分:1)
实际上我可以看到你错过了一个非常基本的操作,即加入对象:
public boolean read(Entity e);
您还应该重新考虑您的类名,以使其具有更相关的名称(此类的目的是什么),因为将其命名为Entity
会给出bean实体的吸引力,而不是数据访问接口层。像CommonDao
:
public interface CommonDao {
//...
}
此类可以按照Entity
类型进行扩展。
您可能还需要修改方法签名,例如:删除实体只需要其标识符。
更新您的课程也使用Java Generics,这样可以让您获得可重用性并让您的课程接受任何实体类型:
public interface CommonDao<T> {
T create(T entity);
//...
}
我强烈建议@ sp00m解决方案。