您的位置:首页 > 其它

封装JPA的数据操作DAO类

2015-11-23 21:05 771 查看
对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 com.posoftframework.entity.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.apache.commons.lang.StringUtils;
import org.springframework.transaction.annotation.Transactional;

import com.posoftframework.entity.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();
}

@Transactional
public <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);
}
}

@Transactional
public <T extends BaseEO> void update(T entity) {
getEntityManager().merge(entity);
}

@Transactional
public <T extends BaseEO> void saveAll(List<T> entitys) {
for (int i = 0; i < entitys.size(); i++) {
T entity = entitys.get(i);
save(entity);
}
}

@Transactional
public <T extends BaseEO> void save(T entity) {
if (entity.getPrimaryKey() == null) {
this.create(entity);
} else {
this.update(entity);
}
}

@Transactional
public <T extends BaseEO> void delete(Class<T> entityClass, Object entityid) {
delete(entityClass, new Object[] { entityid });
}

@Transactional
public <T extends BaseEO> void delete(Class<T> entityClass,
Object[] entityids) {
// StringBuffer sf_QL = new StringBuffer(" DELETE FROM ").append(
// sqlBuilder.getEntityName(entityClass)).append(" o WHERE ")
// .append(sqlBuilder.getPkField(entityClass, "o")).append("=? ");
// Query query = getEntityManager().createQuery(sf_QL.toString());
for (Object id : entityids) {
getEntityManager().remove(getEntityManager().find(entityClass, id));
// query.setParameter(1, id).executeUpdate();
}
}

@Transactional
public <T extends BaseEO> void deleteByWhere(Class<T> entityClass,
String where, Object[] delParams) {
StringBuffer sf_QL = new StringBuffer("DELETE FROM ").append(
sqlBuilder.getEntityName(entityClass)).append(" o WHERE 1=1 ");
if (where != null && where.length() != 0) {
sf_QL.append(" AND ").append(where);
}
Query query = getEntityManager().createQuery(sf_QL.toString());
this.setQueryParams(query, delParams);

query.executeUpdate();
}

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(").append(
sqlBuilder.getPkField(entityClass, "o")).append(") FROM ")
.append(sqlBuilder.getEntityName(entityClass)).append(
" o WHERE 1=1 ");
if (whereql != null && whereql.length() != 0) {
sf_QL.append(" AND ").append(whereql);
}
Query query = getEntityManager().createQuery(sf_QL.toString());
this.setQueryParams(query, queryParams);
return (Long) query.getSingleResult();
}

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 = queryParams.toArray();
}
return getScrollData(entityClass, firstindex, maxresult, wherejpql, ps,
orderby);
}

@Override
public <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 = sqlBuilder.getEntityName(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.setResultlist(query.getResultList());
query = getEntityManager().createQuery(
"SELECT COUNT("
+ sqlBuilder.getPkField(entityClass, "o")
+ ") FROM "
+ entityname
+ " o "
+ (StringUtils.isEmpty(wherejpql) ? "" : "WHERE "
+ wherejpql));
setQueryParams(query, queryParams);
qr.setTotalrecord((Long) query.getSingleResult());
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 = sqlBuilder.getEntityName(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.setResultlist(query.getResultList());
query = getEntityManager().createQuery(
"SELECT COUNT("
+ sqlBuilder.getPkField(entityClass, "o")
+ ") FROM "
+ entityname
+ " o "
+ (StringUtils.isEmpty(wherejpql) ? "" : "WHERE "
+ wherejpql));
setQueryParams(query, queryParams);
qr.setTotalrecord((Long) query.getSingleResult());
return qr;
}

@Override
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) {
return this.scroll(entityClass, queryfields, firstindex, maxresult,
wherejpql, queryParams, orderby);
}

@Override
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) {
return this.scroll(entityClass, queryfields, firstindex, maxresult,
wherejpql, queryParams, orderby);
}

@Override
public <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 = sqlBuilder.getEntityName(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);
return query.getResultList();
}

public <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,
String wheresql, Object[] queryParams, int startRow, int rows) {
String entityname = sqlBuilder.getEntityName(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);
return query.getResultList();
}

@Override
public <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,
String[] queryfields, String wheresql, Object[] queryParams) {
return queryByWhere(entityClass, queryfields, wheresql, queryParams,
-1, -1);
}

@Override
public <T extends BaseEO> List<T> queryByWhere(Class<T> entityClass,
String[] queryfields, String wheresql, Object[] queryParams,
int startRow, int rows) {
String entityname = sqlBuilder.getEntityName(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);
}
return query.getResultList();
}

public <T extends BaseEO> List<Object[]> queryFieldValues(
Class<T> entityClass, String[] queryfields, String wheresql,
Object[] queryParams) {
return queryFieldValues(entityClass, queryfields, wheresql,
queryParams, -1, -1);
}

@Override
public <T extends BaseEO> List<Object[]> queryFieldValues(
Class<T> entityClass, String[] queryfields, String wheresql,
Object[] queryParams, int startRow, int rows) {
String entityname = sqlBuilder.getEntityName(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);
}
return query.getResultList();
}

/**
* 设置查询参数
*
* @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();

@Override
public <T extends BaseEO> T load(Class<T> entityClass, Object entityId) {
try {
return getEntityManager().getReference(entityClass, entityId);
} catch (Exception e) {
return null;
}
}

@Override
public <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){
return l.get(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 java.lang.reflect.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 = entityClass.getName();
Entity entity = entityClass.getAnnotation(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(" ").append(
orderby.get(key)).append(",");
}
orderbyql.deleteCharAt(orderbyql.length() - 1);
}
return orderbyql.toString();
}

/**
* 得到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 = Introspector
.getBeanInfo(clazz).getPropertyDescriptors();
for (PropertyDescriptor propertydesc : propertyDescriptors) {
Method method = propertydesc.getReadMethod();
if (method != null && method.isAnnotationPresent(Id.class)) {
//                  PropertyDescriptor[] ps = Introspector.getBeanInfo(
//                          propertydesc.getPropertyType())
//                          .getPropertyDescriptors();
out = alias
+ "."
+ propertydesc.getName();
//                          + "."
//                          + (!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, params.get(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[]) values.toArray(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) {
this.resultlist = resultlist;
}

public Long getTotalrecord() {
return totalrecord;
}

public void setTotalrecord(Long totalrecord) {
this.totalrecord = 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() {
}

@Override
public 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);
if(condition.getValue() == null || condition.getValue().toString().trim().equals("")){
continue;
}
sf_where.append(" AND ").append(condition.getField()).append(" ")
.append(condition.getOperator()).append(" ? ");
queryParams[i] = condition.getValue();
}
whereQL = sf_where.toString();
whereQL = whereQL. replaceFirst("AND", "");
}

public QueryCondition findQueryCondition(String field , String operator){

for (QueryCondition queryCondition : queryConditions) {
if (field.equals(queryCondition.getField())
&& operator.equals(queryCondition.getOperator())) {
return queryCondition ;
}
}
return null;
}
}


BaseEO.java
/************************* 版权声明 *********************************
*
* 版权所有:百洋软件
* Copyright (c) 2009 by Pearl Ocean.
*
************************* 变更记录 *********************************
*
* 创建者:yongtree   创建日期: 2009-4-29
* 创建记录:创建类结构。
*
* 修改者:       修改日期:
* 修改记录:
************************* 随   笔 *********************************
*
* 这里可以写写感想,感慨,疑问什么的。
*
******************************************************************
*/

package com.posoftframework.entity.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;

@Transient
public boolean isSelected() {
return selected;
}

public void setSelected(boolean selected) {
this.selected = selected;
}

@Transient
protected EOUtility getBeanUtility() {
if (eoutil == null) {
eoutil = new EOUtility(this);
}
return eoutil;
}

@Override
public String toString() {
return getBeanUtility().beanToString();
}

@Override
public boolean equals(Object obj) {
return getBeanUtility().equalsBean(obj);
}

@Override
public int hashCode() {
return getBeanUtility().hashCodeBean();
}

@Override
public Object clone() throws CloneNotSupportedException {
Object obj = null;
try {
obj = getBeanUtility().cloneBean();
} catch (Exception e) {
throw new CloneNotSupportedException(e.getMessage());
}

return obj;
}

/**
* 得到所有可持久化字段的名称
* @author slx
* @date 2009-7-17 上午08:59:34
* @modifyNote
* @return
*      名称列表
*/
@Transient
public String[] getAttributeNames(){
return getBeanUtility().getAttributeNames();
}

/**
* 得到某个字段的值
* @author slx
* @date 2009-7-17 上午08:59:58
* @modifyNote
* @param attributeName
*      字段名
* @return
*      值
*/
@Transient
public Object getAttributeValue(String attributeName) {
return getBeanUtility().getAttributeValue(attributeName);
}

/**
* 设置某个字段的值
* @author slx
* @date 2009-7-17 上午09:00:26
* @modifyNote
* @param attributeName
*      字段名
* @param value
*      值
*/
@Transient
public void setAttributeValue(String attributeName , Object value){
getBeanUtility().setAttributeValue(attributeName,value);
}

@SuppressWarnings("static-access")
@Transient
public String getEnumDescription(String enumAttributeName){
Object value = getAttributeValue(enumAttributeName);

return getBeanUtility().getEnumDescription(value);
}

/**
* 获得实体对应的表名
*
* @author slx
* @date 2009-7-17 上午09:00:57
* @modifyNote
* @return
*/
@Transient
public String getTableName() {
return getBeanUtility().getTableName();
}

/**
* 比较此对象与另一个对象的差别,并返回值不同的字段的名称。
*
* @author slx
* @date 2009-7-17 上午09:34:39
* @modifyNote
* @param antherBean
*            将要比较的对象
* @return 值不同的字段名
*/
@Transient
public List<String> getDifferentField(BaseEO anotherBean) {
return getBeanUtility().getDifferentField(anotherBean);
}

/**
* 获取主键值
*
* @author slx
* @date 2009-6-12 上午09:15:11
* @modifyNote
* @return 主键值
*/
@Transient
public abstract Object getPrimaryKey();

/**
* 比较主键值是否相同
*
* @author yongtree
* @date 2009-9-15 下午04:09:21
* @modifyNote
* @param obj
* @return
*/
@Transient
public boolean equalsPK(Object obj) {
if (obj == null)// 对象为空不比较
return false;
// 类型不同不必进行比较
if (!this.getClass().equals(obj.getClass())) {
return false;
}

// 不是BaseEO,不必比较
if (!(obj instanceof BaseEO)) {
return false;
}

BaseEO eo = (BaseEO) obj;

if (getPrimaryKey()!=null
&& eo.getPrimaryKey()!=null) {
if (getPrimaryKey().equals(eo.getPrimaryKey()))
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, fromEO.getAttributeValue(attr));
}
}

/**
* 加载所有延迟加载字段
* @author slx
* @date 2010年4月1日17:22:29
* @modifyNote
*/
public void loadLazyAttributes(){
getBeanUtility().loadLazyField();
}

}


DateUtil.java
package com.posoftframework.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.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){
return d1.getTime() == 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)((fDate.getTime()-sDate.getTime())/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 = Calendar.getInstance();
calender.setTime(date);
calender.add(Calendar.YEAR, addYears);
return calender.getTime();
}
/**
* 加指定月
* @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 = Calendar.getInstance();
calender.setTime(date);
calender.add(Calendar.MONTH, addMonths);
return calender.getTime();
}

/**
* 加指定天数
* @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 = Calendar.getInstance();
calender.setTime(date);
calender.add(Calendar.DAY_OF_YEAR, addDays);
return calender.getTime();
}

/**
* 得到一年的第一天
* @author slx
* @date 2009-9-10 上午11:14:23
* @modifyNote
* @param year
*      年
* @return
*      一年的第一天
*/
public static Date getFirstDateOfYear(int year){
Calendar calender = Calendar.getInstance();
calender.set(Calendar.YEAR,year);
calender.set(Calendar.DAY_OF_YEAR, calender.getActualMinimum(Calendar.DAY_OF_YEAR));
setStartTimeOfDay(calender);
return calender.getTime();
}

/**
* 得到一年的最后一天
* @author slx
* @date 2009-9-10 上午11:14:42
* @modifyNote
* @param year
*      年
* @return
*      一年的最后一天
*/
public static Date getLastDateOfYear(int year){
Calendar calender = Calendar.getInstance();
calender.set(Calendar.YEAR,year);
calender.set(Calendar.DAY_OF_YEAR, calender.getActualMaximum(Calendar.DAY_OF_YEAR));
setEndTimeOfDay(calender);
return calender.getTime();
}

/**
* 判断当前日期是否是所在月份的最后一天
* @author slx
* @date 2009-9-10 上午10:54:36
* @modifyNote
* @param date
*      日期
* @return
*      是最后一天为 true
*/
public static boolean isLastDayOfMonth(Date date) {
Calendar calender = Calendar.getInstance();
calender.setTime(date);
int day = calender.get(Calendar.DAY_OF_MONTH);
int lastDay = calender.getActualMaximum(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 = Calendar.getInstance();
calender.set(year, month-1, 1);
calender.set(Calendar.DAY_OF_MONTH, calender.getActualMaximum(Calendar.DAY_OF_MONTH));
setEndTimeOfDay(calender);
return calender.getTime();
}

/**
* 得到日期所在月的最后一天
* @author slx
* @date 2009-9-10 上午10:54:25
* @modifyNote
* @param date
*      日期
* @return
*      所在月的最后一天
*/
public static Date getLastDayOfMonth(Date date){
Calendar calender = Calendar.getInstance();
calender.setTime(date);
calender.set(Calendar.DAY_OF_MONTH, calender.getActualMaximum(Calendar.DAY_OF_MONTH));
setEndTimeOfDay(calender);
return calender.getTime();
}

/**
* 设置到当前月的最后时刻
* @author slx
* @date 2010-10-18 上午11:04:56
* @modifyNote
* @param calender
*/
private static void setEndTimeOfDay(Calendar calender){
calender.set(Calendar.HOUR_OF_DAY, calender.getActualMaximum(Calendar.HOUR_OF_DAY));
calender.set(Calendar.MINUTE, calender.getActualMaximum(Calendar.MINUTE));
calender.set(Calendar.SECOND, calender.getActualMaximum(Calendar.SECOND));
calender.set(Calendar.MILLISECOND, calender.getActualMaximum(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 = Calendar.getInstance();
calender.set(year, month-1, 1);
calender.set(Calendar.DAY_OF_MONTH, calender.getActualMinimum(Calendar.DAY_OF_MONTH));
setStartTimeOfDay(calender);
return calender.getTime();
}

/**
* 得到指定日期所在月的第一天
* @author slx
* @date 2009-9-10 上午11:09:56
* @modifyNote
* @param date
*      日期
* @return
*      第一天
*/
public static Date getFirstDayOfMonth(Date date){
Calendar calender = Calendar.getInstance();
calender.setTime(date);
calender.set(Calendar.DAY_OF_MONTH, calender.getActualMinimum(Calendar.DAY_OF_MONTH));
setStartTimeOfDay(calender);
return calender.getTime();
}

/**
* 设置到月份开始的时刻
* @author slx
* @date 2010-10-18 上午11:06:12
* @modifyNote
* @param calender
*/
private static void setStartTimeOfDay(Calendar calender){
calender.set(Calendar.HOUR_OF_DAY, calender.getActualMinimum(Calendar.HOUR_OF_DAY));
calender.set(Calendar.MINUTE, calender.getActualMinimum(Calendar.MINUTE));
calender.set(Calendar.SECOND, calender.getActualMinimum(Calendar.SECOND));
calender.set(Calendar.MILLISECOND, calender.getActualMinimum(Calendar.MILLISECOND));
}

public static Date getStartTimeOfDay(Date date){
Calendar calender = Calendar.getInstance();
calender.setTime(date);
setStartTimeOfDay(calender);
return calender.getTime();
}

public static Date getEndTimeOfDay(Date date){
Calendar calender = Calendar.getInstance();
calender.setTime(date);
setEndTimeOfDay(calender);
return calender.getTime();

}

/**
* 得到当前年月
*
* @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 = Calendar.getInstance();
today.setTime(date);
return (today.get(Calendar.YEAR)) + "-" + ((today.get(Calendar.MONTH)+1)>=10?(today.get(Calendar.MONTH)+1):("0"+(today.get(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 = Calendar.getInstance();
objCalendarDate1.setTime(date1);

Calendar objCalendarDate2 = Calendar.getInstance();
objCalendarDate2.setTime(date2);

if (objCalendarDate2.equals(objCalendarDate1))
return 0;
if (objCalendarDate1.after(objCalendarDate2)){
Calendar temp = objCalendarDate1;
objCalendarDate1 = objCalendarDate2;
objCalendarDate2 = temp;
}
if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1.get(Calendar.DAY_OF_MONTH))
flag = 1;

if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1.get(Calendar.YEAR))
iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1.get(Calendar.YEAR))
* 12 + objCalendarDate2.get(Calendar.MONTH) - flag)
- objCalendarDate1.get(Calendar.MONTH);
else
iMonth = objCalendarDate2.get(Calendar.MONTH)
- objCalendarDate1.get(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 com.posoftframework.enums;

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 com.posoftframework.entity.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.com                *
*                                                                  *
************************* 变更记录 *********************************
*
* 创建者:slx   创建日期: 2010-7-1
* 备注:
*
* 修改者:       修改日期:
* 备注:
*
*/

package com.posoftframework.entity.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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jpa 封装dao