封装JPA的数据操作DAO类

阅读: 评论:0

封装JPA的数据操作DAO类

封装JPA的数据操作DAO类

对JPA的实体操作进行了简单的封装,降低了数据操作的难度,提高了开发的效率。里面可能会有少许hibernate的元素。

DAO.java

/************************* 版权声明 ********************************** * 版权所有:百洋软件* Copyright (c) 2009 by Pearl Ocean.* ************************* 变更记录 *********************************** 创建者:yongtree   创建日期: 2009-4-30* 创建记录:创建类结构。* * 修改者:宋黎晓       修改日期:2010-1-12* 修改记录:修改接口定义中的泛型T ,将其从接口定义挪到每个方法的声明.* ************************* 随   笔 *********************************** 这里可以写写感想,感慨,疑问什么的。* *******************************************************************/package com.posoftframework.dao;import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;import javax.persistence.EntityManager;import ity.base.BaseEO;/*** 底层数据操作的工具类* * @author yongtree* @date 2009-4-30 上午08:55:32* @version 2.0* @since 2.0 泛型T挪到方法声明出,声明对象时不需要指定泛型.*/
public interface DAO {/*** 清除一级缓存的数据*/public void clear();/*** 新增实体* * @param entity*            实体*/public <T extends BaseEO> void create(T entity);/*** 批量新增实体* * @param entitys*            实体列表*/public <T extends BaseEO> void createBatch(List<T> entitys);/*** 更新实体* * @param entity*            实体*/public <T extends BaseEO> void update(T entity);/*** 删除实体* * @param entityClass*            实体类* @param entityid*            实体id*/public <T extends BaseEO> void delete(Class<T> entityClass, Object entityid);/*** 删除实体* * @param entityClass*            实体类* @param entityids*            实体id数组*/public <T extends BaseEO> void delete(Class<T> entityClass,Object[] entityids);/*** 根据条件删除* * @author slx* @date 2009-11-24 下午05:52:04* @modifyNote* @param entityClass* @param where* @param delParams*/public <T extends BaseEO> void deleteByWhere(Class<T> entityClass,String where, Object[] delParams);/*** 获取实体* * @param <T>* @param entityClass*            实体类* @param entityId*            实体id* @return*/public <T extends BaseEO> T find(Class<T> entityClass, Object entityId);/*** 根据where条件查询单个对象* @author slx* @date 2010-7-19 上午10:33:20* @modifyNote* @param <T>* @param entityClass*          类型* @param where*          条件* @param params*          参数* @return*/public <T extends BaseEO> T findByWhere(Class<T> entityClass, String where ,Object[] params);/*** 获取实体,具有延迟加载的作用(和find相比)* * @param <T>* @param entityClass*            实体类* @param entityId*            实体id* @return*/public <T extends BaseEO> T load(Class<T> entityClass, Object entityId);/*** 根据条件判断实体是否存在* * @author slx* @date 2009-7-8 上午11:49:13* @modifyNote* @param entityClass*            实体类* @param whereql*            查询条件(可空,可为 field1=? and field2=? 形式,也可为field1='value1' and*            field2='value2'的形式)* @param queryParams*            参数(可空,但是当条件使用了field1=? and field2=? 的形式后参数不能为空)* @return 是否存在*/public <T extends BaseEO> boolean isExistedByWhere(Class<T> entityClass,String whereql, Object[] queryParams);/*** 获取记录总数* * @param entityClass*            实体类* @return*/public <T extends BaseEO> long getCount(Class<T> entityClass);/*** 根据条件和参数获取记录总数* * @author slx* @date 2009-7-8 上午11:34:41* @modifyNote* @param <T>* @param entityClass*            实体类* @param whereql*            查询条件(可空,可为 field1=? and field2=? 形式,也可为field1='value1' and*            field2='value2'的形式)* @param queryParams*            参数(可空,但是当条件使用了field1=? and field2=? 的形式后参数不能为空)* @return 记录行数*/public <T extends BaseEO> long getCountByWhere(Class<T> entityClass,String whereql, Object[] queryParams);/*** 获取分页数据* * @param <T>* @param entityClass*            实体类* @param firstindex*            开始索引* @param maxresult*            需要获取的记录数* @return*/public <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult,String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby);public <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult,String wherejpql, List<Object> queryParams,LinkedHashMap<String, String> orderby);public <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult,String wherejpql, Map<String, Object> queryParams,LinkedHashMap<String, String> orderby);/*** 查询实体部分字段,获取分页数据* * 返回的结果将重新组装到实体属性中,没有查询的字段为NULL<br>* 注意:使用该接口时,要确保实体类中有对应的查询字段的有参数构造方法,并且参数的顺序要和此处的queryfields数组的元素一致* * @author yongtree* @date 2010-4-13 下午12:56:03* @modifyNote* @param <T>* @param entityClass* @param queryfields* @param firstindex* @param maxresult* @param wherejpql* @param queryParams* @param orderby* @return*/public <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, String[] queryfields, int firstindex,int maxresult, String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby);public <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, String[] queryfields, int firstindex,int maxresult, String wherejpql, List<Object> queryParams,LinkedHashMap<String, String> orderby);public <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, String[] queryfields, int firstindex,int maxresult, String wherejpql, Map<String, Object> queryParams,LinkedHashMap<String, String> orderby);/*** 根据条件查询实体中的指定几个字段 <br>* 返回结果List<String[]>格式如下: <br>* 行1: 字段1value , 字段2value , 字段3value <br>* 行2: 字段1value , 字段2value , 字段3value* * @author slx* @date 2009-5-14 下午01:14:23* @modifyNote* @param <T>* @param entityClass* @param queryfields* @param wheresql* @param queryParams* @return*/public <T extends BaseEO> List<Object[]> queryFieldValues(Class<T> entityClass, String[] queryfields, String wheresql,Object[] queryParams);public <T extends BaseEO> List<Object[]> queryFieldValues(Class<T> entityClass, String[] queryfields, String wheresql,Object[] queryParams, int startRow, int rows);/*** 根据条件查询实体中的指定几个字段 <br>* 返回的结果将重新组装到实体属性中,没有查询的字段为NULL<br>* 注意:使用该接口时,要确保实体类中有对应的查询字段的有参数构造方法,并且参数的顺序要和此处的queryfields数组的元素一致* * @author yongtree* @date 2010-4-13 上午11:45:27* @modifyNote* @param <T>* @param entityClass* @param queryfields* @param wheresql* @param queryParams* @return*/public <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,String[] queryfields, String wheresql, Object[] queryParams);public <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,String[] queryfields, String wheresql, Object[] queryParams,int startRow, int rows);/*** 根据where条件查询实体bean列表 <br>* where和queryParams可空* * @author slx* @date 2009-5-14 下午01:20:19* @modifyNote* @param <T>* @param entityClass* @param wheresql* @param queryParams* @return*/public <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,String wheresql, Object[] queryParams);/*** 根据where条件查询实体bean列表,可指定取第几行到第几行 <br>* where和queryParams可空* * @author slx* @date 2009-5-14 下午01:20:19* @modifyNote* @param <T>* @param entityClass* @param wheresql* @param queryParams* @param startRow*            开始行* @param rows*            共多少行* @return*/public <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,String wheresql, Object[] queryParams, int startRow, int rows);/*** 得到EM,不建议经常使用,以免使用过于随意造成系统的维护难度加大和扩展性变差* * @author yongtree* @date 2009-11-5 上午11:32:49* @modifyNote* @return*/public EntityManager getEntityManager();
}

BaseJpaDao.java

/************************* 版权声明 ********************************** * 版权所有:百洋软件* Copyright (c) 2009 by Pearl Ocean.* ************************* 变更记录 *********************************** 创建者:yongtree   创建日期: 2009-5-31* 创建记录:创建类结构。* * 修改者:宋黎晓       修改日期:2010-1-12* 修改记录:修改了DAO接口,同时修改了此实现类.************************* 随   笔 *********************************** 这里可以写写感想,感慨,疑问什么的。* *******************************************************************/package com.posoftframework.dao;import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;import javax.persistence.EntityManager;
import javax.persistence.Query;import org.apachemons.lang.StringUtils;
import ansaction.annotation.Transactional;import ity.base.BaseEO;/*** 封装常用增删改查操作* * @author yongtree* @date 2009-5-31 上午11:09:01* @version 2.0* @since 2.0 泛型T挪到方法声明出,声明对象时不需要指定泛型.*/
@SuppressWarnings("unchecked")
public abstract class BaseJpaDao implements DAO {private QLBuilder sqlBuilder = new QLBuilder();public void clear() {getEntityManager().clear();}@Transactionalpublic <T extends BaseEO> void create(T entity) {getEntityManager().persist(entity);}public <T extends BaseEO> void createBatch(List<T> entitys) {for (T entity : entitys) {create(entity);}}@Transactionalpublic <T extends BaseEO> void update(T entity) {getEntityManager().merge(entity);}@Transactionalpublic <T extends BaseEO> void saveAll(List<T> entitys) {for (int i = 0; i < entitys.size(); i++) {T entity = (i);save(entity);}}@Transactionalpublic <T extends BaseEO> void save(T entity) {if (PrimaryKey() == null) {ate(entity);} else {this.update(entity);}}@Transactionalpublic <T extends BaseEO> void delete(Class<T> entityClass, Object entityid) {delete(entityClass, new Object[] { entityid });}@Transactionalpublic <T extends BaseEO> void delete(Class<T> entityClass,Object[] entityids) {// StringBuffer sf_QL = new StringBuffer(" DELETE FROM ").append(// EntityName(entityClass)).append(" o WHERE ")// .PkField(entityClass, "o")).append("=? ");// Query query = getEntityManager().createQuery(String());for (Object id : entityids) {getEntityManager().remove(getEntityManager().find(entityClass, id));// query.setParameter(1, id).executeUpdate();}}@Transactionalpublic <T extends BaseEO> void deleteByWhere(Class<T> entityClass,String where, Object[] delParams) {StringBuffer sf_QL = new StringBuffer("DELETE FROM ").EntityName(entityClass)).append(" o WHERE 1=1 ");if (where != null && where.length() != 0) {sf_QL.append(" AND ").append(where);}Query query = getEntityManager().createQuery(String());this.setQueryParams(query, delParams);uteUpdate();}public <T extends BaseEO> T find(Class<T> entityClass, Object entityId) {return getEntityManager().find(entityClass, entityId);}public <T extends BaseEO> long getCount(Class<T> entityClass) {return getCountByWhere(entityClass, null, null);}public <T extends BaseEO> long getCountByWhere(Class<T> entityClass,String whereql, Object[] queryParams) {StringBuffer sf_QL = new StringBuffer("SELECT COUNT(").PkField(entityClass, "o")).append(") FROM ").EntityName(entityClass)).append(" o WHERE 1=1 ");if (whereql != null && whereql.length() != 0) {sf_QL.append(" AND ").append(whereql);}Query query = getEntityManager().createQuery(String());this.setQueryParams(query, queryParams);return (Long) SingleResult();}public <T extends BaseEO> boolean isExistedByWhere(Class<T> entityClass,String whereql, Object[] queryParams) {long count = getCountByWhere(entityClass, whereql, queryParams);return count > 0 ? true : false;}public <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult,String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby) {return scroll(entityClass, firstindex, maxresult, wherejpql,queryParams, orderby);}public <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult,String wherejpql, List<Object> queryParams,LinkedHashMap<String, String> orderby) {Object[] ps = null;if (queryParams != null) {ps = Array();}return getScrollData(entityClass, firstindex, maxresult, wherejpql, ps,orderby);}@Overridepublic <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, int firstindex, int maxresult,String wherejpql, Map<String, Object> queryParams,LinkedHashMap<String, String> orderby) {return scroll(entityClass, firstindex, maxresult, wherejpql,queryParams, orderby);}/*** 根据条件查询某个实体的列表* * @author slx* @param <T>* @param entityClass*            实体类型* @param firstindex*            开始行* @param maxresult*            结束行* @param wherejpql*            where条件* @param queryParams*            参数* @param orderby*            排序条件* @return*/private <T extends BaseEO> QueryResult<T> scroll(Class<T> entityClass,int firstindex, int maxresult, String wherejpql,Object queryParams, LinkedHashMap<String, String> orderby) {QueryResult<T> qr = new QueryResult<T>();String entityname = EntityName(entityClass);Query query = getEntityManager().createQuery("SELECT o FROM "+ entityname+ " o "+ (StringUtils.isEmpty(wherejpql) ? "": "WHERE " + wherejpql)+ sqlBuilder.buildOrderby(orderby));setQueryParams(query, queryParams);if (firstindex != -1 && maxresult != -1)query.setFirstResult(firstindex).setMaxResults(maxresult).setHint("org.hibernate.cacheable", true);qr.ResultList());query = getEntityManager().createQuery("SELECT COUNT("+ PkField(entityClass, "o")+ ") FROM "+ entityname+ " o "+ (StringUtils.isEmpty(wherejpql) ? "" : "WHERE "+ wherejpql));setQueryParams(query, queryParams);qr.setTotalrecord((Long) SingleResult());return qr;}/*** 根据条件查询实体指定字段的值并回填到实体内. <br/>* <b>注意:</b> <br/>* 实体必须有包括要查询的字段为参数的构造函数.* * @param <T>* @param entityClass* @param queryfields* @param firstindex* @param maxresult* @param wherejpql* @param queryParams* @param orderby* @return*/private <T extends BaseEO> QueryResult<T> scroll(Class<T> entityClass,String[] queryfields, int firstindex, int maxresult,String wherejpql, Object queryParams,LinkedHashMap<String, String> orderby) {QueryResult<T> qr = new QueryResult<T>();String entityname = EntityName(entityClass);Query query = getEntityManager().createQuery((sqlBuilder.buildSelect(entityname, queryfields, "o")+ "FROM "+ entityname+ " o "+ (StringUtils.isEmpty(wherejpql) ? "": "WHERE " + wherejpql) + sqlBuilder.buildOrderby(orderby)));setQueryParams(query, queryParams);if (firstindex != -1 && maxresult != -1)query.setFirstResult(firstindex).setMaxResults(maxresult).setHint("org.hibernate.cacheable", true);qr.ResultList());query = getEntityManager().createQuery("SELECT COUNT("+ PkField(entityClass, "o")+ ") FROM "+ entityname+ " o "+ (StringUtils.isEmpty(wherejpql) ? "" : "WHERE "+ wherejpql));setQueryParams(query, queryParams);qr.setTotalrecord((Long) SingleResult());return qr;}@Overridepublic <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, String[] queryfields, int firstindex,int maxresult, String wherejpql, List<Object> queryParams,LinkedHashMap<String, String> orderby) {return this.scroll(entityClass, queryfields, firstindex, maxresult,wherejpql, queryParams, orderby);}@Overridepublic <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, String[] queryfields, int firstindex,int maxresult, String wherejpql, Map<String, Object> queryParams,LinkedHashMap<String, String> orderby) {return this.scroll(entityClass, queryfields, firstindex, maxresult,wherejpql, queryParams, orderby);}@Overridepublic <T extends BaseEO> QueryResult<T> getScrollData(Class<T> entityClass, String[] queryfields, int firstindex,int maxresult, String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby) {return this.scroll(entityClass, queryfields, firstindex, maxresult,wherejpql, queryParams, orderby);}protected void setQueryParams(Query query, Object queryParams) {sqlBuilder.setQueryParams(query, queryParams);}public <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,String wheresql, Object[] queryParams) {String entityname = EntityName(entityClass);Query query = getEntityManager().createQuery("SELECT o FROM "+ entityname+ " o "+ ((wheresql == null || wheresql.length() == 0) ? "": "WHERE " + wheresql));setQueryParams(query, queryParams);query.setHint("org.hibernate.cacheable", true);ResultList();}public <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,String wheresql, Object[] queryParams, int startRow, int rows) {String entityname = EntityName(entityClass);Query query = getEntityManager().createQuery("SELECT o FROM "+ entityname+ " o "+ ((wheresql == null || wheresql.length() == 0) ? "": "WHERE " + wheresql));setQueryParams(query, queryParams);if (startRow >= 0) {query.setFirstResult(startRow);}if (rows > 0) {query.setMaxResults(rows);}query.setHint("org.hibernate.cacheable", true);ResultList();}@Overridepublic <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,String[] queryfields, String wheresql, Object[] queryParams) {return queryByWhere(entityClass, queryfields, wheresql, queryParams,-1, -1);}@Overridepublic <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,String[] queryfields, String wheresql, Object[] queryParams,int startRow, int rows) {String entityname = EntityName(entityClass);Query query = getEntityManager().createQuery(sqlBuilder.buildSelect(entityname, queryfields, "o") + " FROM "+ entityname + " o "+ (wheresql == null ? "" : "WHERE " + wheresql));setQueryParams(query, queryParams);if (startRow >= 0) {query.setFirstResult(startRow);}if (rows > 0) {query.setMaxResults(rows);}ResultList();}public <T extends BaseEO> List<Object[]> queryFieldValues(Class<T> entityClass, String[] queryfields, String wheresql,Object[] queryParams) {return queryFieldValues(entityClass, queryfields, wheresql,queryParams, -1, -1);}@Overridepublic <T extends BaseEO> List<Object[]> queryFieldValues(Class<T> entityClass, String[] queryfields, String wheresql,Object[] queryParams, int startRow, int rows) {String entityname = EntityName(entityClass);Query query = getEntityManager().createQuery(sqlBuilder.buildSelect(queryfields, "o") + " FROM "+ entityname + " o "+ (wheresql == null ? "" : "WHERE " + wheresql));setQueryParams(query, queryParams);if (startRow >= 0) {query.setFirstResult(startRow);}if (rows > 0) {query.setMaxResults(rows);}ResultList();}/*** 设置查询参数* * @author slx* @date 2009-7-8 上午10:02:55* @modifyNote* @param query*            查询* @param queryParams*            查询参数*/protected void setQueryParams(Query query, Object[] queryParams) {sqlBuilder.setQueryParams(query, queryParams);}/*** 返回实体管理器* * @desc 由slx在2010-6-8下午04:06:55重写父类方法*/public abstract EntityManager getEntityManager();@Overridepublic <T extends BaseEO> T load(Class<T> entityClass, Object entityId) {try {return getEntityManager().getReference(entityClass, entityId);} catch (Exception e) {return null;}}@Overridepublic <T extends BaseEO> T findByWhere(Class<T> entityClass, String where,Object[] params) {List<T> l = queryByWhere(entityClass, where, params);if(l != null && l.size() == 1){(0);}else if(l.size() > 1){throw new RuntimeException("查寻到的结果不止一个.");}else{return null;}}}

QLBuilder.java

/************************* 版权声明 ********************************** * 版权所有:百洋软件* Copyright (c) 2009 by Pearl Ocean.* ************************* 变更记录 *********************************** 创建者:slx   创建日期: 2009-7-8* 创建记录:创建类结构。* * 修改者:       修改日期:* 修改记录:************************* 随   笔 *********************************** 这里可以写写感想,感慨,疑问什么的。* *******************************************************************/    package com.posoftframework.dao;import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import flect.Method;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Query;/*** SQL语句构建工具类* @author slx* @date 2009-7-8 上午10:35:28* @version 1.0*/
public class QLBuilder {/*** 获取实体的名称* * @param <T>* @param entityClass*            实体类* @return*/public <T> String getEntityName(Class<T> entityClass) {String entityname = Name();Entity entity = Annotation(Entity.class);if (entity.name() != null && !"".equals(entity.name())) {entityname = entity.name();}return entityname;}/*** 创建Select后所要查询的字段名称字符串* @author slx* @date 2009-7-8 上午10:01:02* @modifyNote* @param fields *          需要查询的字段* @param alias  *          表的别名* @return*          拼接成的字段名字符串*/public String buildSelect(String[] fields, String alias) {StringBuffer sf_select = new StringBuffer("SELECT");for (String field : fields) {sf_select.append(" ").append(alias).append(".").append(field).append(",");}return (sf_select.substring(0, sf_select.length() - 1)).toString();}/*** 创建Select后所要查询的字段名称字符串,并作为实体类的构造函数* @author yongtree* @date 2010-4-13 上午11:59:04* @modifyNote* @param fields* @param alias* @return*/public String buildSelect(String className,String[] fields, String alias) {StringBuffer sf_select = new StringBuffer("SELECT new ").append(className).append("(");for (String field : fields) {sf_select.append(" ").append(alias).append(".").append(field).append(",");}return (sf_select.substring(0, sf_select.length() - 1))+")";}/*** 组装order by语句* * @param orderby*      列名为key ,排序顺序为value的map* @return*      Order By 子句*/public String buildOrderby(LinkedHashMap<String, String> orderby) {StringBuffer orderbyql = new StringBuffer("");if (orderby != null && orderby.size() > 0) {orderbyql.append(" order by ");for (String key : orderby.keySet()) {orderbyql.append("o.").append(key).append(" ").(key)).append(",");}orderbyql.deleteCharAt(orderbyql.length() - 1);}String();}/*** 得到Count聚合查询的聚合字段,既是主键列* @author slx* @date 2009-7-8 上午10:26:11* @modifyNote* @param <T>*              实体类型* @param clazz     *              实体类* @param alias*              表别名* @return*              聚合字段名(主键名)*/public <T> String getPkField(Class<T> clazz, String alias) {String out = alias;try {PropertyDescriptor[] propertyDescriptors = BeanInfo(clazz).getPropertyDescriptors();for (PropertyDescriptor propertydesc : propertyDescriptors) {Method method = ReadMethod();if (method != null && method.isAnnotationPresent(Id.class)) {
//                  PropertyDescriptor[] ps = BeanInfo(
//                          PropertyType())
//                          .getPropertyDescriptors();out = alias+ "."+ Name();
//                          + "."
//                          + (!ps[1].getName().equals("class") ? ps[1]
//                                  .getName() : ps[0].getName()
//                                  );break;}}} catch (Exception e) {e.printStackTrace();}return out;}/*** 设置查询参数* @author slx* @date 2009-7-8 上午10:02:55* @modifyNote* @param query *          查询* @param queryParams*          查询参数*/public Query setQueryParams(Query query, Object queryParams) {if (queryParams != null) {if (queryParams instanceof Object[]) {Object[] params = (Object[]) queryParams;if (params.length > 0) {for (int i = 0; i < params.length; i++) {query.setParameter(i + 1, params[i]);}}} else if (queryParams instanceof Map) {Map params = (Map) queryParams;Iterator<String> it = params.keySet().iterator();while(it.hasNext()){String key = it.next();query.setParameter(key, (key));}}}return query;}/*** 将集合中的字符串拼接成为SQL语句中 in的形式 'aaa','bbb','ccc'* @author slx* @date 2009-5-26 上午10:30:17* @modifyNote* @param values* @return*/public String toSQLIn(Collection<String> values){if(values == null || values.isEmpty())return null;String[] strvalues = new String[0];strvalues = (String[]) Array(new String[values.size()]);return toSQLIn(strvalues);}/*** 将字符串数组中的字符串拼接成为SQL语句中 in的形式 'aaa','bbb','ccc'* @author slx* @date 2009-5-26 上午10:30:17* @modifyNote* @param values* @return*/public String toSQLIn(String[] values){StringBuffer bf_sqlin = new StringBuffer();if(values == null || values.length == 0)return null;int len = values.length;for(int i = 0 ; i < len ; i++){bf_sqlin = bf_sqlin.append(", '").append(values[i]).append("' ");}String str_sqlin = bf_sqlin.substring(1).toString();return str_sqlin;}
}

QueryResult.java

/************************* 版权声明 ********************************** * 版权所有:百洋软件* Copyright (c) 2009 by Pearl Ocean.* ************************* 变更记录 *********************************** 创建者:yongtree   创建日期: 2009-4-30* 创建记录:创建类结构。* * 修改者:       修改日期:* 修改记录:************************* 随   笔 *********************************** 这里可以写写感想,感慨,疑问什么的。* *******************************************************************/package com.posoftframework.dao;import java.util.List;/*** 查询结果对象* * @author yongtree* @date 2009-4-30 上午09:00:12* @version 1.0*/
public class QueryResult<T> {private List<T> resultlist;private Long totalrecord;public List<T> getResultlist() {return resultlist;}public void setResultlist(List<T> resultlist) {sultlist = resultlist;}public Long getTotalrecord() {return totalrecord;}public void setTotalrecord(Long totalrecord) {alrecord = totalrecord;}
}

QueryCondition.java

/************************* 版权声明 ********************************** * 版权所有:百洋软件* Copyright (c) 2009 by Pearl Ocean.* ************************* 变更记录 *********************************** 创建者:slx   创建日期: 2009-6-24* 创建记录:创建类结构。* * 修改者:       修改日期:* 修改记录:************************* 随   笔 *********************************** 这里可以写写感想,感慨,疑问什么的。* *******************************************************************/    package com.posoftframework.dao;import java.io.Serializable;/*** 条件对象* @author slx* @date 2009-6-24 上午10:53:46* @version 1.0*/
public class QueryCondition implements Serializable,Cloneable{private static final long serialVersionUID = 1L;/** 字段名(表名.列名) **/private String field ;/** 操作符 **/private String operator ;/** 值 **/private Object value ;public QueryCondition() {}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}public QueryCondition(String field , String operator , Object value) {this.field = field ;this.operator = operator ;this.value = value ;}public String getField() {return field;}public void setField(String field) {this.field = field;}public String getOperator() {return operator;}public void setOperator(String operator) {this.operator = operator;}public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}
}

QueryObject.java

/************************* 版权声明 ********************************** * 版权所有:百洋软件* Copyright (c) 2009 by Pearl Ocean.* ************************* 变更记录 *********************************** 创建者:slx   创建日期: 2009-6-24* 创建记录:创建类结构。* * 修改者:       修改日期:* 修改记录:************************* 随   笔 *********************************** 这里可以写写感想,感慨,疑问什么的。* *******************************************************************/    package com.posoftframework.dao;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;/*** 查询对象,用于前后台传输查询条件。* 拼接查询语句并返回参数* @author slx* @date 2009-6-24 上午10:46:05* @version 1.0*/
public class QueryObject implements Serializable{private static final long serialVersionUID = 1L;/** 条件列表 **/private List<QueryCondition> queryConditions ;/** 参数列表 **/private Object[] queryParams ;/** where语句 **/private String whereQL ;/*** 添加查询条件* @author slx* @date 2009-6-24 上午11:18:16* @modifyNote* @param field 字段名* @param operator  操作符* @param value 值*/public void addCondition(String field , String operator , Object value ){addCondition(new QueryCondition(field,operator,value));}/*** 添加查询条件* @author slx* @date 2009-6-24 上午11:19:03* @modifyNote* @param condition 条件对象*/public void addCondition(QueryCondition condition ){getQueryConditions().add(condition);}/*** 设置条件列表* @author slx* @date 2009-6-24 上午11:19:41* @modifyNote* @param queryConditions*/public void setQueryConditions(List<QueryCondition> queryConditions){this.queryConditions = queryConditions;}public List<QueryCondition> getQueryConditions() {if(queryConditions == null){queryConditions = new ArrayList<QueryCondition>();}return queryConditions;}/*** 得到where语句* <br> table.field1 = ? AND table.field2 = ?* @author slx* @date 2009-6-24 上午11:20:17* @modifyNote* @return*/public String getWhereQL(){buildQuery();return whereQL ;}/*** 得到参数列表* @author slx* @date 2009-6-24 上午11:03:54* @modifyNote* @return*/public Object[] getQueryParams(){buildQuery();return queryParams ;}/*** 构造查询,初始化where和params* @author slx* @date 2009-6-24 上午11:31:08* @modifyNote*/protected void buildQuery(){StringBuffer sf_where = new StringBuffer("");int size = getQueryConditions().size();queryParams = new Object[size];for(int i = 0 ; i < size ; i++){QueryCondition condition = getQueryConditions().get(i);Value() == null || Value().toString().trim().equals("")){continue;}sf_where.append(" AND ").Field()).append(" ").Operator()).append(" ? ");queryParams[i] = Value();}whereQL = String();whereQL = whereQL. replaceFirst("AND", "");}public QueryCondition findQueryCondition(String field , String operator){for (QueryCondition queryCondition : queryConditions) {if (field.Field())&& operator.Operator())) {return queryCondition ;}}return null;}
}

BaseEO.java

/************************* 版权声明 ********************************** * 版权所有:百洋软件* Copyright (c) 2009 by Pearl Ocean.* ************************* 变更记录 *********************************** 创建者:yongtree   创建日期: 2009-4-29* 创建记录:创建类结构。* * 修改者:       修改日期:* 修改记录:************************* 随   笔 *********************************** 这里可以写写感想,感慨,疑问什么的。* *******************************************************************/package ity.base;import java.io.Serializable;
import java.util.List;import javax.persistence.MappedSuperclass;
import javax.persistence.Transient;/*** 基础实体Bean,包含系统表中公共的字段 <br>* 重写 toString() clone() equals() hashCode()* * @author yongtree* @date 2009-4-29 下午01:43:42* @version 1.0*/
@MappedSuperclass
public abstract class BaseEO implements Serializable {private static final long serialVersionUID = 1962905939086138888L;private transient EOUtility eoutil ;protected boolean selected;@Transientpublic boolean isSelected() {return selected;}public void setSelected(boolean selected) {this.selected = selected;}@Transientprotected EOUtility getBeanUtility() {if (eoutil == null) {eoutil = new EOUtility(this);}return eoutil;}@Overridepublic String toString() {return getBeanUtility().beanToString();}@Overridepublic boolean equals(Object obj) {return getBeanUtility().equalsBean(obj);}@Overridepublic int hashCode() {return getBeanUtility().hashCodeBean();}@Overridepublic Object clone() throws CloneNotSupportedException {Object obj = null;try {obj = getBeanUtility().cloneBean();} catch (Exception e) {throw new Message());}return obj;}/*** 得到所有可持久化字段的名称* @author slx* @date 2009-7-17 上午08:59:34* @modifyNote* @return*      名称列表*/@Transientpublic String[] getAttributeNames(){return getBeanUtility().getAttributeNames();}/*** 得到某个字段的值* @author slx* @date 2009-7-17 上午08:59:58* @modifyNote* @param attributeName*      字段名* @return*      值*/@Transientpublic Object getAttributeValue(String attributeName) {return getBeanUtility().getAttributeValue(attributeName);}/*** 设置某个字段的值* @author slx* @date 2009-7-17 上午09:00:26* @modifyNote* @param attributeName*      字段名* @param value*      值*/@Transientpublic void setAttributeValue(String attributeName , Object value){getBeanUtility().setAttributeValue(attributeName,value);}@SuppressWarnings("static-access")@Transientpublic String getEnumDescription(String enumAttributeName){Object value = getAttributeValue(enumAttributeName);return getBeanUtility().getEnumDescription(value);}/*** 获得实体对应的表名* * @author slx* @date 2009-7-17 上午09:00:57* @modifyNote* @return*/@Transientpublic String getTableName() {return getBeanUtility().getTableName();}/*** 比较此对象与另一个对象的差别,并返回值不同的字段的名称。* * @author slx* @date 2009-7-17 上午09:34:39* @modifyNote* @param antherBean*            将要比较的对象* @return 值不同的字段名*/@Transientpublic List<String> getDifferentField(BaseEO anotherBean) {return getBeanUtility().getDifferentField(anotherBean);}/*** 获取主键值* * @author slx* @date 2009-6-12 上午09:15:11* @modifyNote* @return 主键值*/@Transientpublic abstract Object getPrimaryKey();/*** 比较主键值是否相同* * @author yongtree* @date 2009-9-15 下午04:09:21* @modifyNote* @param obj* @return*/@Transientpublic boolean equalsPK(Object obj) {if (obj == null)// 对象为空不比较return false;// 类型不同不必进行比较if (!Class().Class())) {return false;}// 不是BaseEO,不必比较if (!(obj instanceof BaseEO)) {return false;}BaseEO eo = (BaseEO) obj;if (getPrimaryKey()!=null&& eo.getPrimaryKey()!=null) {if (getPrimaryKey().PrimaryKey()))return true;return false;} else {return false;}}/*** 拷贝另一个eo对象中的字段值到当前对象中* @author slx* @date 2009-12-6 上午11:04:49* @modifyNote* @param fromEO            从哪里拷贝* @param copyAttributes    拷贝哪些字段*/public void copyAttributeValue(BaseEO fromEO , String[] copyAttributes){if(copyAttributes == null)return ;for (String attr : copyAttributes) {this.setAttributeValue(attr, AttributeValue(attr));}}/*** 加载所有延迟加载字段* @author slx* @date 2010年4月1日17:22:29* @modifyNote*/public void loadLazyAttributes(){getBeanUtility().loadLazyField();}}

DateUtil.java

package com.posoftframework.util;DateFormat;
ParseException;
SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;/*** 字符串公共工具类* <br>提供关于字符串处理的公用方法* <li> 按照指定格式格式化日期并作为字符串返回* <li> 将字符串数组或者容器转换为sql语句中in子句的形式。* * @author slx* @date 2009-5-14 下午05:21:42* @version 1.0*/
public class DateUtil {private static DateFormat datefmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/*** 按照指定格式返回日期字符串* * @author slx* @date 2009-5-14 下午05:20:06* @modifyNote* @param date*          需要格式化的日期* @param format*          格式化字符串,为空则采用默认  yyyy-MM-dd hh:mm:ss。如果格式化字符串不合法会抛出异常* @return*          格式化后的日期字符串。*/public static String formatDate(Date date , String format){if(date == null)return null;String str_date = null;if(format != null){DateFormat formater = new SimpleDateFormat(format);str_date = formater.format(date);}else{str_date =datefmt.format(date);}return str_date;}public static Date parseToDate(String date , String format) throws ParseException{if(date == null)return null;Date dDate = null;if(format != null){DateFormat formater = new SimpleDateFormat(format);dDate = formater.parse(date);}else{DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");dDate =formater.parse(date);}return dDate;}/*** 比较两个时间是否相等。* @author slx* @date 2009-7-13 上午10:08:52* @modifyNote* @param d1  *          时间1* @param d2*          时间2 * @return*          相等则true。因为数据库中读出的数据为Timestamp类型(Date的子类),* 当它与Date类型进行比较时,总是为false,即使是同一个时间.因此写了这个方法,用于兼容这两种类型的时间比较.*/public static boolean equalsDate(Date d1 , Date d2){if(d1 !=null && d2!= null){Time() == d2.getTime();}return false;}/*** 判断后面的一天是否是前面一天的下一天* @author slx* @date 2009-7-8 下午04:46:38* @modifyNote* @param day   *          基准日期* @param nextDay*          比较日期* @return*          如果比较日期是基准日期的下一天则返回true,否则为false*/public static boolean isNextDay(Date day,Date nextDay){return ( getBetweenDays(day ,nextDay) == -1 );}/*** 判断两个日期是否是同一天* @author slx* @date 2009-11-10 下午04:32:07* @modifyNote* @param day* @param otherDay* @return*/public static boolean isSameDay(Date day,Date otherDay){return ( getBetweenDays(day ,otherDay) == 0 );}/*** 计算两个日期相差的天数.不满24小时不算做一天* @author slx* @date 2009-7-10 下午03:15:54* @modifyNote* @param fDate     日期1* @param oDate     日期2* @return*      日期1 - 日期2 的差*/public static int getBetweenDays(Date fDate, Date sDate) {int day=(int)((Time()-Time())/86400000L);//(24小时 * 60分 * 60秒 * 1000毫秒 = 1天毫秒数) return day;}/*** 日期相加指定年* @author slx* @date 2009-9-10 上午10:26:22* @modifyNote* @param date*      日期* @param addYears*      要添加的年数* @return*      相加后的日期*/public static Date addYears(Date date , int addYears){Calendar calender = Instance();calender.setTime(date);calender.add(Calendar.YEAR, addYears);Time();}/*** 加指定月* @author slx* @date 2009-9-10 上午10:26:57* @modifyNote* @param date*      日期* @param addMonths*      月数* @return*      相加后的日期*/public static Date addMonth(Date date , int addMonths){Calendar calender = Instance();calender.setTime(date);calender.add(Calendar.MONTH, addMonths);Time();}/*** 加指定天数* @author slx* @date 2009-9-10 上午10:27:22* @modifyNote* @param date*      日期* @param addDays*      天数* @return*      相加后的日期*/public static Date addDay(Date date , int addDays){Calendar calender = Instance();calender.setTime(date);calender.add(Calendar.DAY_OF_YEAR, addDays);Time();}/*** 得到一年的第一天* @author slx* @date 2009-9-10 上午11:14:23* @modifyNote* @param year*      年* @return*      一年的第一天*/public static Date getFirstDateOfYear(int year){Calendar calender = Instance();calender.set(Calendar.YEAR,year);calender.set(Calendar.DAY_OF_YEAR, ActualMinimum(Calendar.DAY_OF_YEAR));setStartTimeOfDay(calender);Time();}/*** 得到一年的最后一天* @author slx* @date 2009-9-10 上午11:14:42* @modifyNote* @param year*      年* @return*      一年的最后一天*/public static Date getLastDateOfYear(int year){Calendar calender = Instance();calender.set(Calendar.YEAR,year);calender.set(Calendar.DAY_OF_YEAR, ActualMaximum(Calendar.DAY_OF_YEAR));setEndTimeOfDay(calender);Time();}/*** 判断当前日期是否是所在月份的最后一天* @author slx* @date 2009-9-10 上午10:54:36* @modifyNote* @param date*      日期* @return*      是最后一天为 true*/public static boolean isLastDayOfMonth(Date date) {Calendar calender = Instance();calender.setTime(date);int day = (Calendar.DAY_OF_MONTH);int lastDay = ActualMaximum(Calendar.DAY_OF_MONTH);return day == lastDay ;}/*** 得到指定月的最后一天* @author slx* @date 2009-9-10 上午11:09:56* @modifyNote* @param year*      年* @param month*      月* @return*      最后一天*/public static Date getLastDayOfMonth(int year , int month){Calendar calender = Instance();calender.set(year, month-1, 1);calender.set(Calendar.DAY_OF_MONTH, ActualMaximum(Calendar.DAY_OF_MONTH));setEndTimeOfDay(calender);Time();}/*** 得到日期所在月的最后一天* @author slx* @date 2009-9-10 上午10:54:25* @modifyNote* @param date*      日期* @return*      所在月的最后一天*/public static Date getLastDayOfMonth(Date date){Calendar calender = Instance();calender.setTime(date);calender.set(Calendar.DAY_OF_MONTH, ActualMaximum(Calendar.DAY_OF_MONTH));setEndTimeOfDay(calender);Time();}/*** 设置到当前月的最后时刻* @author slx* @date 2010-10-18 上午11:04:56* @modifyNote* @param calender*/private static void setEndTimeOfDay(Calendar calender){calender.set(Calendar.HOUR_OF_DAY, ActualMaximum(Calendar.HOUR_OF_DAY));calender.set(Calendar.MINUTE, ActualMaximum(Calendar.MINUTE));calender.set(Calendar.SECOND, ActualMaximum(Calendar.SECOND));calender.set(Calendar.MILLISECOND, ActualMaximum(Calendar.MILLISECOND));}/*** 得到指定月的第一天* @author slx* @date 2009-9-10 上午11:09:56* @modifyNote* @param year*      年* @param month*      月* @return*      第一天*/public static Date getFirstDayOfMonth(int year , int month){Calendar calender = Instance();calender.set(year, month-1, 1);calender.set(Calendar.DAY_OF_MONTH, ActualMinimum(Calendar.DAY_OF_MONTH));setStartTimeOfDay(calender);Time();}/*** 得到指定日期所在月的第一天* @author slx* @date 2009-9-10 上午11:09:56* @modifyNote* @param date*      日期* @return*      第一天*/public static Date getFirstDayOfMonth(Date date){Calendar calender = Instance();calender.setTime(date);calender.set(Calendar.DAY_OF_MONTH, ActualMinimum(Calendar.DAY_OF_MONTH));setStartTimeOfDay(calender);Time();}/*** 设置到月份开始的时刻* @author slx* @date 2010-10-18 上午11:06:12* @modifyNote* @param calender*/private static void setStartTimeOfDay(Calendar calender){calender.set(Calendar.HOUR_OF_DAY, ActualMinimum(Calendar.HOUR_OF_DAY));calender.set(Calendar.MINUTE, ActualMinimum(Calendar.MINUTE));calender.set(Calendar.SECOND, ActualMinimum(Calendar.SECOND));calender.set(Calendar.MILLISECOND, ActualMinimum(Calendar.MILLISECOND));}public static Date getStartTimeOfDay(Date date){Calendar calender = Instance();calender.setTime(date);setStartTimeOfDay(calender);Time();}public static Date getEndTimeOfDay(Date date){Calendar calender = Instance();calender.setTime(date);setEndTimeOfDay(calender);Time();}/*** 得到当前年月* * @author yongtree* @date 2008-11-22 上午11:25:24* @return 格式:2008-11* @throws ParseException*/public static  String getThisYearMonth() throws ParseException {return getYearMonth(new Date());}/*** 得到年月* * @author slx* @date 2010年4月16日13:09:23* @return 格式:2008-11* @throws ParseException*/public static  String  getYearMonth(Date date){Calendar today = Instance();today.setTime(date);return ((Calendar.YEAR)) + "-" + (((Calendar.MONTH)+1)>=10?((Calendar.MONTH)+1):("0"+((Calendar.MONTH) + 1)));}/*** 计算两个日期之间相差的月份数* <br> 日期顺序不分先后不会返回负数* <br> 不足一个月不算做一个月* @author slx* @date 2010年4月16日11:32:51* @modifyNote* @param date1*      日期1* @param date2*      日期2* @return*      月数*/public static int getBetweenMonths(Date date1, Date date2){      int iMonth = 0;      int flag = 0;      Calendar objCalendarDate1 = Instance();      objCalendarDate1.setTime(date1);      Calendar objCalendarDate2 = Instance();      objCalendarDate2.setTime(date2);      if (objCalendarDate2.equals(objCalendarDate1))      return 0;      if (objCalendarDate1.after(objCalendarDate2)){      Calendar temp = objCalendarDate1;      objCalendarDate1 = objCalendarDate2;      objCalendarDate2 = temp;      }      if ((Calendar.DAY_OF_MONTH) < (Calendar.DAY_OF_MONTH))      flag = 1;      if ((Calendar.YEAR) > (Calendar.YEAR))      iMonth = (((Calendar.YEAR) - (Calendar.YEAR))      * 12 + (Calendar.MONTH) - flag)      - (Calendar.MONTH);      else     iMonth = (Calendar.MONTH)      - (Calendar.MONTH) - flag;      return iMonth;      }/*** 计算两个日期之间相差的年份数* <br> 日期顺序不分先后不会返回负数* <br> 不足一个年不算做一个年* @author slx* @date 2010年4月16日12:01:46* @modifyNote* @param date1*      日期1* @param date2*      日期2* @return*      年数*/public static int getBetweenYears(Date date1, Date date2){  return getBetweenMonths(date1 ,date2) / 12;}public static void main(String[] args) throws Exception {
//      Date d1 = parseToDate("2009-11-29", null);
//      Date d2 = parseToDate("2007-12-29", null);System.out.println(formatDate(getFirstDayOfMonth(2010,10),"yyyy-MM-dd HH:mm:ss.SSS"));System.out.println(formatDate(getLastDateOfYear(2009),"yyyy-MM-dd HH:mm:ss.SSS"));System.out.println(formatDate(getFirstDateOfYear(2009),"yyyy-MM-dd HH:mm:ss.SSS"));System.out.println(formatDate(getEndTimeOfDay(new Date()),"yyyy-MM-dd HH:mm:ss.SSS"));}
}

EnumDescription.java

package ums;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 枚举描述* * @author slx* @date 2009-9-2 下午05:13:57* @version 1.0*/
@Target( {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumDescription {String value();
}

EODisplayName.java

package ity.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 实体显示用名称(中文名)* * @author slx* @date 2010-7-1 上午08:55:19* @version 1.0*/
@Target( {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface EODisplayName {String value();}

FieldDisplayName.java

/************************* 版权声明 **********************************                                                                  **                     版权所有:百洋软件                           **          Copyright (c) 2010 by www.po-soft                **                                                                  ************************** 变更记录 *********************************** 创建者:slx   创建日期: 2010-7-1* 备注:* * 修改者:       修改日期:* 备注:* */    package ity.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 字段显示名(中文名)注解* @author slx* @date 2010-7-1 上午08:56:37* @version 1.0*/
@Target( {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldDisplayName {String value();
}

本文发布于:2024-02-01 16:13:10,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170677518937856.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:操作   数据   JPA   DAO
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23