`

通用的DAO查询,常见方法集合

 
阅读更多

import java.io.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.type.Type;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class GenericDao extends HibernateDaoSupport{
    private ThreadLocal<Session> sessions = new ThreadLocal<Session>();
    private ThreadLocal<Transaction> transactions = new ThreadLocal<Transaction>();
    public synchronized Session getMySession(){
        Session session = sessions.get();
        if(session==null){
            session = getSession();
            transactions.set(session.beginTransaction());
            sessions.set(session);
        }else
        if(!session.isOpen()){
            session = getSession();
            transactions.set(session.beginTransaction());
            sessions.set(session);
        }
        return session;
    }
    public synchronized void commitMySession(){
        Session session = sessions.get();
        if(session!=null&&session.isOpen()){
            transactions.get().commit();
            session.close();
        }
        transactions.remove();
        sessions.remove();
    }
    public synchronized void rollbackMySession(){
        Session session = sessions.get();
        if(session!=null&&session.isOpen()){
            transactions.get().rollback();
            session.close();
        }
        transactions.remove();
        sessions.remove();
    }
    public <T> T get(Class<T> clazz, Serializable id){
        return (T)getHibernateTemplate().get(clazz, id);
    }
    public <T> T load(Class<T> clazz, Serializable id){
        return (T)getHibernateTemplate().load(clazz, id);
    }
    public <T> void save(T entity){
//        System.out.println("---->gdao.save("+entity.getClass().getName()+")----");
        getHibernateTemplate().save(entity);
    }
    public <T> void update(T entity){
        getHibernateTemplate().update(entity);
    }
    public <T> void delete(T entity){
        getHibernateTemplate().delete(entity);
    }
  
    public int execUpdateSQL(String sql, Serializable...values){
        Session sess = getMySession();
        SQLQuery query = sess.createSQLQuery(sql);
        if(values!=null&&values.length>0){
            for(int i=0; i<values.length; i++){
                query.setParameter(i, values[i]);
            }
        }
        return query.executeUpdate();
    }
    public Long getFirstLong(String sql, final Serializable... values) throws Exception{
        List<String> params = new ArrayList<String>(1);
        List<Type> types = new ArrayList<Type>(1);
        params.add("c"); types.add(Hibernate.INTEGER);
        Object obj = findUnique(sql, params, types, values);
        if(obj==null){
            return -1L;
        }
        if(obj instanceof Object[]){
            obj = ((Object[])obj)[0];
        }
        if(obj instanceof Number){
            return ((Number)obj).longValue();
        }
        return -1L;
    }
//    public Long getFirstLong(String sql,  List<String>params, List<Type>types) throws Exception{
//        Object[] obj = findUnique(sql, params, types);
//        if(obj==null||obj.length==0){
//            return -1L;
//        }
//        Object object = obj[0];
//        if(object instanceof Number){
//            return ((Number)object).longValue();
//        }
//        return -1L;
//    }
    public List<?> find(String hql){
        return getHibernateTemplate().find(hql);
    }
//    public List<?> find(String hql, final Object...values){
//        logger.info(hql);
//        return getHibernateTemplate().find(hql, values);
//    }
  
    public <T> List<T> findByPage(Class<T> clazz, final int start, final int limit, final String where, final Serializable... values){
        String hql = "from " + clazz.getName() + " as e";
        if(where!=null&&where.length()>0){
            hql += " where " + where;
        }
        final String fHql = hql;
        return getHibernateTemplate().executeFind(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query q = session.createQuery(fHql);
                if(values!=null&&values.length>0){
                    for(int i=0; i<values.length; i++){
                        q.setParameter(i, values[i]);
                    }
                }
                q.setFirstResult(start).setMaxResults(limit);
                return q.list();
            }
          
        });
    }
    public <T> List<T> find(Class<T> clazz, final String where, final Serializable... values){
        String hql = "from " + clazz.getSimpleName()+" as e";
        if(where!=null&&where.length()>0){
            hql += " where " + where;
        }
        return getHibernateTemplate().find(hql, values);
    }
    public long getTotalCountByHql(Class<?> clazz, final String where, final Serializable... values) throws Exception {
        String hql = "select count(*) from " + clazz.getSimpleName()+" as e";
        if(where!=null&&where.length()>0){
            hql += " where " + where;
        }
        List<Number> cs = getHibernateTemplate().find(hql, values);
        if(cs!=null&&cs.size()>0){
            Number n = cs.get(0);
            return n.longValue();
        }
        return 0;
    }
    public long getTotalCount(Class<?> clazz, final String where, final Serializable... values) throws Exception {
        String sql = "select count(1) as c from " + clazz.getSimpleName() + " e";
        if(where!=null&&where.length()>0){
            sql += " where " + where;
        }
        return getFirstLong(sql, values);
    }
  
    public long getTotalCount(String sql, final Serializable... values) throws Exception {
        return getFirstLong(sql, values).longValue();
    }
    public Object[] findUnique(final String sql,  List<String>params, List<Type>types, final Serializable...values) {
        Session sess = getMySession();
        logger.debug("------findUnique.getSession()! sess="+sess.hashCode());
        SQLQuery query = sess.createSQLQuery(sql);
        for(int j=0; j<params.size(); j++){
            query.addScalar(params.get(j), types.get(j));
        }
        if(values!=null&&values.length>0){
            for(int i=0; i<values.length; i++){
                query.setParameter(i, values[i]);
            }
        }
        query.setMaxResults(1);
        List<?> list = query.list();
        if(list==null||list.size()==0){
            return null;
        }
        Object obj = list.get(0);
        if(obj==null){
            return null;
        }
        logger.debug("obj.type="+obj.getClass().getName());
        if(!obj.getClass().isArray()){//如果返回值不是数组,则要进行相关的处理
            if(obj instanceof Number){
                if(obj instanceof Long){
                    return new Long[]{(Long)(obj)};
                }
                if(obj instanceof Integer){
                    return new Long[]{new Long((Integer)obj)};
                }
                return new Number[]{(Number)obj};
            }
            return new Object[]{obj};
        }
        return (Object[])obj;
    }
    public List<Object[]> find(final String sql, List<String>params, List<Type>types, final Serializable... values) {
        Session sess = getMySession();
        logger.debug("------find.getSession()! sess="+sess.hashCode());
        SQLQuery query = sess.createSQLQuery(sql);
      
        for(int j=0; j<params.size(); j++){
            query.addScalar(params.get(j), types.get(j));
        }
        if(values!=null&&values.length>0){
            for(int i=0; i<values.length; i++){
                query.setParameter(i, values[i]);
            }
        }
        return query.list();
    }
    public long getNextId(String sequence) throws Exception{
        String sql = "select "+sequence+".nextval as nextid from dual";

        Session sess = getMySession();
        logger.debug("------generateId.getSession()! sess="+sess.hashCode());
        SQLQuery query = sess.createSQLQuery(sql);
        query.addScalar("nextid", Hibernate.LONG);
        List<?> list = query.list();
        if(list==null||list.size()==0){
            return -1L;
        }
        Object obj = list.get(0);
        logger.debug("obj.type="+obj.getClass().getName());
        if(obj instanceof Number){
            return ((Number)obj).longValue();
        }
        return -1L;
    }
    public boolean exists(String sql, final Object...values) throws Exception{
        Session sess = getMySession();
        logger.debug("------exists.getSession()! sess="+sess.hashCode());
        SQLQuery query = sess.createSQLQuery(sql);
        for(int i=0; i<values.length; i++){
            query.setParameter(i, values[i]);
        }
        List<?> list = query.list();
        if(list==null||list.size()==0){
            return false;
        }
        return true;
    }

}

分享到:
评论

相关推荐

    ssh通用泛型DAO

    4. 查询(Find):包括根据ID获取单个对象的`get()`方法,以及查询所有对象的`list()`方法。 5. 分页查询(Paging):提供分页查询功能,通常结合"Page"类使用。 接下来是"Page"类。在大型应用中,为了提高用户体验...

    基于Annotation并对DAO层封装具有分页功能的S2SH整合实例

    在这个接口中,我们可以定义一个分页查询的方法,接收页码和每页大小作为参数,并返回一个包含结果的集合和总记录数。 分页功能的实现通常涉及数据库的COUNT和LIMIT/OFFSET操作。在Hibernate中,可以使用Criteria ...

    mybatis生成对应的dao/model/mapper

    - 可以通过配置文件控制是否生成通用的 CRUD 方法,以及生成的实体类是否包含序列化标识等。 - MBG的运行可能会覆盖已存在的文件,因此在实际使用时要注意备份。 总结,MyBatis Generator是MyBatis框架下的一个重要...

    JSP做的一个论坛MVC+DAO+JSTL

    在论坛应用中,DAO类负责与数据库进行交互,执行SQL查询和更新操作,如添加新用户、发布帖子等。DAO使得代码更易测试和维护,因为它隐藏了数据库相关的复杂性。 【JSTL标签库】: JSTL是JavaServer Pages的标准标签...

    CodeSmith模板集合C#版

    CodeSmith模板集合提供的对象持久化模板,可能包括了数据访问层(DAL)的生成,例如创建DAO(数据访问对象)类、实体类以及CRUD(创建、读取、更新、删除)操作的方法。这些模板能够自动生成与数据库表对应的C#类,...

    commonsqldao类

    《CommonSQLDAO类详解》 在Java开发中,数据访问对象(DAO)模式是一种常见的设计模式,...然而,为了保持代码的灵活性和可维护性,应当避免过度依赖通用DAO,对于有特殊需求的数据操作,仍然建议创建特定的DAO子类。

    struts应用文档集合

    通常,开发者会创建一个通用的分页Action,结合DAO层进行数据库查询,然后在视图层展示分页结果。 3. **Struts2配置文件** Struts2的核心配置文件是struts.xml,它定义了Action、ActionMapping、结果类型、拦截器...

    VB数据库编程之通用源代码

    VB提供了多种方式来连接和操作数据库,如DAO(Data Access Objects)、RDO(Remote Data Objects)、ADO(ActiveX Data Objects)等。本资源“VB数据库编程之通用源代码”包含了已经过测试并成功编译的源代码,旨在...

    使用ADO进行数据库开发

    在数据库应用开发中,ADO(ActiveX Data Objects)和DAO(Data Access Objects)是两种常见的数据访问技术。本文将深入探讨如何使用ADO进行数据库开发,并对比性地提及DAO的使用方式,以帮助开发者理解这两种技术的...

    SSH集成查询分页处理BaseDao

    在这个场景中,"BaseDao"通常是一个基类,它包含了通用的数据库操作方法,可以被各个特定的DAO(Data Access Object)继承,以实现业务逻辑中的数据访问。 1. **BaseDao**:BaseDao是DAO层的基类,它的设计目的是...

    基于注解反射封装的BaseDao(支持一对多查询)

    在Java开发中,`BaseDao` 是一个常见的设计模式,用于提供数据访问对象(DAO)的基础功能,方便其他业务逻辑层或数据访问层组件进行数据库操作。本篇将深入探讨如何利用注解和反射机制来封装一个支持一对多查询的 `...

    ssh+baseDao实现分页

    3. **整合Struts**:在Action类中,我们接收用户的请求参数(如页码和每页大小),然后调用Service层的方法,Service层再调用Dao层的分页查询方法。Action将查询结果传递给对应的ActionForm或VO,最后由Struts的...

    论VB的数据库访问技术

    - **简化**:相比DAO和RDO,提供了更少的对象,更多的属性和方法。 - **兼容性**:支持广泛的ODBC数据源,包括SQL Server、Oracle、Access等。 - **易用性**:API设计友好,易于学习和使用。 - **应用**:适用于...

    精简封装Basedao.pdf

    总之,`BaseDao`接口及其实现是Java中数据访问层设计的一个常见模式,用于封装数据库操作,提供通用的方法供业务逻辑调用。这样的设计有助于减少代码重复,提高代码质量,同时也便于更换不同的数据库引擎。

    基于spring MVC 和 MyBatis 泛型的代码生成模板,可以根据自己的需求修改

    例如,你可以创建一个泛型BaseMapper接口,包含通用的CRUD方法,然后每个具体的Mapper接口继承这个BaseMapper,指定具体的实体类型。这样,即使数据库表结构变化,只需修改对应的Mapper,无需改动Service层和...

    Access+2000中文版高级编程

    14.1 理解ActiveX Windows通用控件 433 14.1.1 使用TabStrip控件 434 14.1.2 使用Access选项卡和使用ActiveX TabStrip控件的区别 436 14.2 ImageList控件详述 438 14.2.1 在设计阶段添加图像 438 14.2.2 ...

    Access 2000中文版高级编程(part1)

    14.1 理解ActiveX Windows通用控件 433 14.1.1 使用TabStrip控件 434 14.1.2 使用Access选项卡和使用ActiveX TabStrip控件的区别 436 14.2 ImageList控件详述 438 14.2.1 在设计阶段添加图像 438 14.2.2 在运行...

    cyqdata-master.zip

    在这个项目中,开发者可能封装了一些通用的DAO(Data Access Object)类,提供简单易用的方法来执行CRUD(创建、读取、更新、删除)操作,以适应不同的数据库系统,如MySQL、Oracle等。 3. **日志记录 (Log)**:...

    基于ADOX接口动态创建数据库方法探索.pdf

    数据库访问技术随着信息技术的发展而不断进步,目前常见的数据库访问接口包括数据库访问对象(DAO)、远程数据库对象(RDO)以及ActiveX数据对象(ADO)。其中,ADO因其高效性与灵活性成为最流行的数据访问技术,被...

Global site tag (gtag.js) - Google Analytics