利用Java的反射和JPA写的工具类

利用周末时间,花了近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;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值