Java中的持久化类

时间:2014-08-07 15:38:19

标签: java java-ee persistence

我正在开发一个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
}

现在我的问题

  1. 我做得对吗?
  2. 如果一个类继承了一个实现这个接口的类,那该怎么办呢?它应该覆盖或调用超级并添加更多代码来处理更多字段
  3. 我应该创建另一个实用程序类来发送查询,还是可以在同一个类中添加数据库操作?
  4. 提前感谢!

4 个答案:

答案 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解决方案。