在 Java 中处理 CRUD 操作等重复性任务的最佳方法是什么?
What's the best way to handle recurring tasks like CRUD operations in Java?
我正在尝试编写 classes 和方法来最大程度地减少重复性任务。
例如,我打算在 Java 中编写一个通用的 DAO(数据库访问对象)class,它可以通过接受输入数据来执行基本的 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 是一个非常标准的 class,带有 getter 和 setter。我的问题是,这是处理 Java 中事情的正确方法吗?
是否有任何流行的资源已经实现了这一点?
请为我提供宝贵的意见。
Hibernate 和 Java 持久性 API(基于 hibernate)对您来说这种反射很棘手。
查看Spring数据:http://projects.spring.io/spring-data/
通常,您应该问 "How can I do it in Spring?" Spring 而不是这样的问题,这已经是一切之上的一个级别 - 特别是 ORM。它使大多数繁琐的编程任务都具有声明性,
我会推荐 Spring 框架和 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
一个很好的教程:
我正在尝试编写 classes 和方法来最大程度地减少重复性任务。
例如,我打算在 Java 中编写一个通用的 DAO(数据库访问对象)class,它可以通过接受输入数据来执行基本的 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 是一个非常标准的 class,带有 getter 和 setter。我的问题是,这是处理 Java 中事情的正确方法吗?
是否有任何流行的资源已经实现了这一点?
请为我提供宝贵的意见。
Hibernate 和 Java 持久性 API(基于 hibernate)对您来说这种反射很棘手。
查看Spring数据:http://projects.spring.io/spring-data/ 通常,您应该问 "How can I do it in Spring?" Spring 而不是这样的问题,这已经是一切之上的一个级别 - 特别是 ORM。它使大多数繁琐的编程任务都具有声明性,
我会推荐 Spring 框架和 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
一个很好的教程: