欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

封装JPA的数据操作DAO类,封装jpadao类,对JPA的实体操作进行了

来源: javaer 分享于  点击 31583 次 点评:29

封装JPA的数据操作DAO类,封装jpadao类,对JPA的实体操作进行了


对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 */@MappedSuperclasspublic 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();}
相关栏目:

用户点评