处理Java中CRUD操作等重复任务的最佳方法是什么?

时间:2015-06-08 20:48:57

标签: java crud

我正在尝试编写类和方法来最小化重复性任务。

例如,我打算用Java编写一个通用的DAO(数据库访问对象)类,它可以通过输入inputdata来完成基本的crud操作。

例如,以下是我刚开始编写的方法,它接受Bean作为参数并构造插入查询。

public boolean insert(Object object) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SQLException, InvalidDataException {
String tableName = object.getClass().getSimpleName().toLowerCase() + "s";

Field[] fields = object.getClass().getDeclaredFields();

ArrayList<String> columnNames = new ArrayList<>();
for (Field field : fields) {
    String fieldName = field.getName();
    Method method = object.getClass().getMethod("get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1));
    if ("id".equalsIgnoreCase(fieldName)) {
    continue;
    }
    if (method.invoke(object) != null || "created".equalsIgnoreCase(fieldName) || "modified".equalsIgnoreCase(fieldName)) {
    columnNames.add(General.toUnderscore(fieldName));
    }
}

String sqlQuery = generateInsertSQLQuery(tableName, columnNames);
System.out.println(sqlQuery);

PreparedStatement ps = this.conn.prepareStatement(sqlQuery);


int index = 1;
for (Field field : fields) {
    String fieldName = field.getName();
    Method method = object.getClass().getMethod("get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1));
    if ("created".equalsIgnoreCase(fieldName) || "modified".equalsIgnoreCase(fieldName)) {
    ps.setDate(index++, new java.sql.Date((new java.util.Date()).getTime()));
    } else {
    if (method.invoke(object) != null) {
        if (field.getType() == String.class) {
        ps.setString(index++, (String) method.invoke(object));
        } else if (field.getType() == Integer.class) {
        ps.setInt(index++, (Integer) method.invoke(object));
        }  else if (field.getType() == Long.class) {
        ps.setLong(index++, (Long) method.invoke(object));
        } else if (field.getType() == java.util.Date.class) {
        java.sql.Date date = new java.sql.Date(((java.util.Date) method.invoke(object)).getTime());
        ps.setDate(index++, date);
        }
    }
    }
}
ps.executeUpdate();
return true;
}

bean是一个非常标准的类,带有getter和setter。我的问题是,这是处理Java中的事情的正确方法吗?

是否有任何已经完成此项目的热门资源?

请引导我提供宝贵的意见。

3 个答案:

答案 0 :(得分:1)

查看Spring数据:http://projects.spring.io/spring-data/ 通常不是这样的问题,你应该问“我怎么能在春天做?” Spring已经超越了一切 - 尤其是ORM。它使大多数繁琐的编程任务都是声明性的,

答案 1 :(得分:1)

我建议Spring Framework使用Spring Data JPA项目。

http://projects.spring.io/spring-data-jpa/

您可以使用正确的JPA注释注释任何JavaBean。然后创建一个扩展Spring CrudRepository的接口。一些配置并添加Hibernate或EclipseLink依赖项。准备!

http://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html

一个很好的教程:

http://spring.io/guides/gs/accessing-data-jpa

答案 2 :(得分:0)

Hibernate和Java Persistence API(基于hibernate)对你来说这反映很棘手。