利用周末时间,花了近4个小时写了个‘万能’的CRUD工具类,不过要使用的话必须是用JPA来进行ORM操作。还有对象映射到数据表中时,Id字段必须是类名称的.LowerCase()+"Id"的形式,不过真的挺方便的。呵呵。水平有限,欢迎指教。
package com.evalution.model;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
public class CRUDModel {
/**
* 获取对象列表,参数是要获取的对象的类型,目前是查出数据库的所有该对象的映射记录,
* 但数据量大的话需要考虑分页等,以及查询的时候可能需要设置一些条件等
* @param obj
* @return
*/
@SuppressWarnings("unchecked")
public static List getObjectList(Object obj) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("evalution");
EntityManager em = factory.createEntityManager();
List<Object> list = null;
String className = obj.getClass().getSimpleName();
String sql = "SELECT o FROM "+className+" o order by o."+className.toLowerCase()+"Id asc";
Query query = em.createQuery(sql);
list = query.getResultList();
em.close();
factory.close();
return list;
}
/**
* 保存对象,参数是要保存的对象
* @param obj
*/
public static void addObject(Object obj){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("evalution");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
em.persist(obj);
em.getTransaction().commit();
em.close();
factory.close();
}
/**
* 更新(修改)对象,参数是新对象和原对象的Id。
* 即根据传入的Id,查处欲修改的对象,并将其修改为新传入的对象
* @param sourceObj
* @param id
* @throws SecurityException
* @throws IllegalArgumentException
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public static void updateObject(Object sourceObj, int id) throws SecurityException, IllegalArgumentException,
NoSuchMethodException, IllegalAccessException, InvocationTargetException{
EntityManagerFactory factory = Persistence.createEntityManagerFactory("evalution");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Object targetObj = em.find(sourceObj.getClass(), id);
CRUDModel.copyObjFromSourceToTarget(sourceObj,targetObj);
em.getTransaction().commit();
em.close();
factory.close();
}
/**
* 根据传入的对象类型和对象Id获取对象
* @param obj
* @param id
* @return
*/
public static Object getObjectById(Object obj,int id){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("evalution");
EntityManager em = factory.createEntityManager();
Object object = em.find(obj.getClass(), id);
em.close();
factory.close();
return object;
}
/**
* 注意该方法要求对象的主键必须为对象名的小写加Id的形式,即Object.toLowerCase()+"Id"
* @param obj
* @param id
*/
public static void deleteObject(Object obj,int id){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("evalution");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
String className = obj.getClass().getSimpleName();
Query query = em.createQuery("delete from "+className+" o where o."+className.toLowerCase()+"Id=:id");
query.setParameter("id", id);
query.executeUpdate();
em.getTransaction().commit();
em.close();
factory.close();
}
/**
* 本方法的功能是将源对象的属性值赋值给目标对象,要求源对象和目标对象是同一类型
* @param sourceObj
* @param targetObj
* @return
* @throws SecurityException
* @throws NoSuchMethodException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
@SuppressWarnings("unchecked")
public static Object copyObjFromSourceToTarget(Object sourceObj,Object targetObj) throws SecurityException,
NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
if(!sourceObj.getClass().isInstance(targetObj)){
System.out.println("两个对象不属同一类型,请核对....");
return null;
}
//获取对象的Class,并得到其拥有的方法
Class targetClass = targetObj.getClass();
Method [] taregetMethods = targetClass.getDeclaredMethods();
Class sourceClass = sourceObj.getClass();
//遍历方法数组,过滤得到所有Set方法,给目标对象赋值
for(int i = 0 ;i < taregetMethods.length;i++){
String targetMethodName = taregetMethods[i].getName();
if (targetMethodName.indexOf("set") != -1) {
System.out.println("targetMethodName:"+targetMethodName);
Method method = targetClass.getMethod(targetMethodName, taregetMethods[i].getParameterTypes());
Object paramObj = new Object();
//根据目标对象需要赋值的属性,从源对象中通过Get方法获取值
Method method2 = sourceClass.getMethod("get"+targetMethodName.substring(3, targetMethodName.length()),null);
paramObj = method2.invoke(sourceObj, null);
System.out.println("paramObj:"+paramObj);
//将获取的值赋值给目标对象
method.invoke(targetObj, paramObj);
}
}
return targetObj;
}
/**
* 根据传入的对象类型和参数列表以及起始和结束行数,获取结果集
* @param obj 对象类型
* @param map 给Sql传入的参数
* @param start 起始行
* @param end 结束行
* @return
*/
@SuppressWarnings("unchecked")
public static List getObjectListWithParam(Object obj,HashMap<String, String> map,int start,int end) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("evalution");
EntityManager em = factory.createEntityManager();
List<Object> list = null;
String className = obj.getClass().getSimpleName();
StringBuffer sql = new StringBuffer();
sql.append("SELECT o FROM "+className+" o where 1=1");
Object[] keySet = map.keySet().toArray();
for (int i = 0; i < keySet.length; i++) {
String key = (String)keySet[i];
String value = (String)map.get(key);
sql.append(" and o."+key+" = "+value);
}
sql.append(" order by o."+className.toLowerCase()+"Id asc");
System.out.println(sql.toString());
Query query = em.createQuery(sql.toString());
if(start != -1 && end != -1){
query.setFirstResult(start);
query.setMaxResults(end);
}
list = query.getResultList();
em.close();
factory.close();
return list;
}
/**
* 获取总结果集的行数
* @param obj
* @return
*/
public static int getRowCount(Object obj){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("evalution");
EntityManager em = factory.createEntityManager();
String sql = "select count(o) from "+obj.getClass().getSimpleName()+" o";
Query query = em.createQuery(sql);
Long count = (Long)query.getSingleResult();;
em.close();
factory.close();
return count.intValue();
}
/**
* 根据本地Sql返回执行的结果集
* @param sql
* @return
*/
@SuppressWarnings("unchecked")
public static List getObjectListWithNativeSql(String sql,Class resultClass){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("evalution");
EntityManager em = factory.createEntityManager();
List list = null;
Query query = em.createNativeQuery(sql,resultClass);
list = query.getResultList();
em.close();
factory.close();
return list;
}
}
分享到:
相关推荐
StringData JPA 反射生成 自定义显示类集合 !!
本文将深入探讨如何利用反射机制来实现一个简单的持久层工具类,以供学习和参考。 反射是Java提供的一种强大的动态类型特性,它允许我们在运行时检查类的信息,包括类名、属性、方法等,并能够动态地创建对象和调用...
Java反射的应用场景广泛,如框架开发(如Spring、Hibernate)、动态代理、代码生成工具(如JPA的实体生成)、序列化/反序列化、测试工具等。然而,反射也会带来性能损失,因为它是运行时的动态操作,且可能破坏封装...
这个工具类通常包含一个静态方法,接受ResultSet和JavaBean类型作为参数,然后遍历ResultSet,将数据填充到JavaBean对象中: ```java import java.sql.ResultSet; import java.sql.SQLException; public class ...
在Java反射中,`java.lang.reflect`包提供了三个核心类:`Constructor`、`Field`和`Method`,分别用于处理类的构造器、字段和方法。我们可以使用`getConstructors()`、`getFields()`和`getMethods()`方法来获取这些...
在Java世界中,Hibernate和Java Persistence API (JPA) 是两个强大的对象关系映射(ORM)框架,它们简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。本篇文章将深入探讨Hibernate JPA入门案例所需的...
此外,`Collections`和`Arrays`工具类提供了对集合的操作。 3. **IO流**:Java的IO流模型允许读写数据到文件、网络或其他输入/输出源。分为字节流和字符流,如`InputStream`和`OutputStream`代表字节流,`Reader`和...
这些信息在构建数据字典时非常重要,可以使用Java反射API来获取。 9. **异常处理**:在处理数据时,错误和异常是常见的。Java的异常处理机制(try-catch-finally)可以帮助我们编写健壮的代码,确保数据字典在遇到...
同步机制如synchronized关键字和java.util.concurrent包中的工具类(如Semaphore和CyclicBarrier)用于控制并发访问资源。 6. **异常处理**:Java的异常处理模型基于try-catch-finally结构,提供了Checked异常(如...
7. **反射机制**:Java反射允许在运行时动态访问类的信息,如创建对象、调用方法、访问字段等。这对于插件开发、元编程等高级场景非常有用。 8. **Java I/O/NIO**:NIO(非阻塞I/O)是Java 1.4引入的新特性,提供了...
1. **反射(Reflection)**:Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能够动态调用方法或改变字段值。在生成实体类时,反射可以用于获取数据库表的元数据,如字段名、类型等,然后基于这些...
- **注意事项**:实体类必须有一个公共无参数构造函数,以便JPA能够通过反射机制实例化对象。实体类可以继承,但继承链中非实体类也可以继承实体类,反之亦然。 2. **@Table** - **作用**:`@Table`注解用于指定...
6. 核心类库:Java集合框架(如ArrayList、LinkedList、HashMap、HashSet等)、泛型、枚举、反射、注解等都是日常开发中常用的工具。此外,Java标准库提供了大量的实用类,如Date和Calendar处理时间,File操作文件,...
8. **反射机制**:Java反射机制允许在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和访问私有属性。这对于创建灵活和动态的应用程序非常有用。 9. **JVM内存模型**:理解Java虚拟机(JVM)的工作...
5. 多线程和并发编程,探讨线程安全、锁机制、同步器以及并发工具类。 6. Java的反射机制,了解如何在运行时检查、修改和调用对象的方法和属性。 7. 注解(Annotation)和泛型的深入讲解,涵盖自定义注解的创建与...
3. **集合框架**:`java.util`包含了许多容器类,如`ArrayList`、`HashMap`、`LinkedList`等,以及`Collections`工具类,用于对数据进行管理和操作。 4. **多线程**:`java.lang.Thread`和`java.util.concurrent`包...
这个工具类源码的实现细节可能包括使用Spring Boot的JdbcTemplate或者JPA(Java Persistence API)进行数据库操作,利用反射机制获取和设置Java对象的属性,以及使用try-catch-finally语句处理异常并关闭资源。...
5. Java反射API:反射允许程序在运行时检查和操作类、接口、字段和方法的信息。这对于动态加载类、创建对象、访问私有成员和调用私有方法非常有用。 6. Java泛型:泛型是在编译时提供类型安全的一种方式,可以避免...
7. **JAVA标准库**:熟悉JAVA标准库(Java Standard Library),如util包中的各种工具类,lang包中的基础类,以及nio(非阻塞I/O)和反射等高级特性,将极大地提高开发效率。 8. **JAVA EE**:如果你的目标是开发...
JPA(Java Persistence API)和MyBatis是常用的Java ORM(对象关系映射)框架,它们能帮助开发者将Java对象与数据库表对应,减少对SQL的直接操作。 六、文档存储 在知识库系统中,文档可能包括各种格式,如PDF、...