利用周末时间,花了近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;
}
}
分享到:
相关推荐
SpringData框架中使用的JPA工具类.模板代码,解决实体管理器工厂的浪费资源和耗时问题.第一次访问getEntityManager方法:经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象,第二次方法...
StringData JPA 反射生成 自定义显示类集合 !!
JPA简易读写数据库java代码,非常简单的入门代码
Spring使用JavaConfig集成JPA简单例子,对应博文地址为http://blog.csdn.net/wu_boy/article/details/72353608
java程序使用JPA注解详解.doc
java程序使用JPA注解详解 JPA注解详解 java 程序使用 JPA注解 详解
Java Persistence API JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA框架的集成使用 package com.itcast.bean.product; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @...
java程序使用JPA注解详解.zip java程序使用JPA注解详解.zip java程序使用JPA注解详解.zip java程序使用JPA注解详解.zip java程序使用JPA注解详解.zip
jpa代码自动生成工具- 自动生成domain/dao/service/controller
宠物商店系统是用EJB3.0+java swing+JPA的结构。EJB3.0组建部署在javaee容器中,使用jpa来操作数据库。
springboot+jpa基本实现,v1版完整项目,包括jpa的各种使用情况
本工具可以根据数据库表自动生成JPA开发所需的实体JavaBean(带有jpa主注解)、repository及service类,提高开发效率;目前支持数据库:MYSQL;并提供配合演示使用的demo项目。
我們使用Spring Framework裡,在Service 的 Method 給予@Transactional 系統就會去管理transaction,我們是在哪裡做了甚麼設定嗎? 為什麼下的這個Annotation成功會commit失敗會rollback呢? Transaction 管理做了...
java springboot data jpa 做的登录小程序 为了熟悉springboot组件,自己写的一些测试,不足的地方大家多交流 相互提高
JPA 批注的详细说明文档,自己整理的。
基于java jpa层实现mysql数据库的建表、新增、变更数据操作; 提供完整的jar包文件在根目录 下
JPA 规范部分详细的介绍了 JPA 中实体 Bean 的定义,并介绍了实体 Bean 支持的注释、全新的查询语言、实体管理接口、容器实现规范等内容。 JPA 标准制定过程中充分吸收了目前已经出现的所有持久化技术的所有优点,...
JPA 教程 Java 持久化教程 JPA 教程 Java 持久化教程
现在的数据层的开发,大多会使用如MyBatis或...由于部分场景下MyBatis或JPA之类无法满足我的需求,所以我打算自己封装一套查数据库的工具类。 文章地址: https://blog.csdn.net/lxyoucan/article/details/124042295