文档章节

《Hibernate》--------单表查询的功能封装

Airship
 Airship
发布于 2017/01/11 14:40
字数 457
阅读 20
收藏 0

- 前言

以前用JDBC的时候,我们利用参数化查询将查询的方法封装起来,这样有利于我们的重用,当我们利用hibernate的Hql语句,使用查询功能的时候,我们同样可以将一些公共常用的查询方法封装起来,然后将此类抽象成一个公共的类,让所有的Dao来继承此类。

实现步骤

1、封装CommonDao接口

public interface CommonDao<T> {

    /*
     * keyValues:条件
     * orderName:排序字段
     * flag:是否升序
     */
    public List<T> getEntriesByCondition(Map<String,Object> keyValues,String orderName,Boolean flag);

}

2、封装CommonDaoImpl


public class CommonDaoImpl<T> implements CommonDao<T> {
    private Class classt;
    private ClassMetadata classMetadata;

    public CommonDaoImpl() {
        ParameterizedType type = (ParameterizedType) this.getClass()
                .getGenericSuperclass();
        this.classt = (Class) type.getActualTypeArguments()[0];
        /*
         * classt就是代表持久化类的class形式
         */
        this.classMetadata = HibernateUtils.sessionFactory
                .getClassMetadata(classt);
    }

    @Override
    public List<T> getEntriesByCondition(Map<String, Object> keyValues,
            String orderName, Boolean flag) {
        StringBuffer buffer = new StringBuffer();
        Query query = null;
        buffer.append("from " + this.classt.getName());
        buffer.append(" where 1=1 ");
        for (Entry<String, Object> entry : keyValues.entrySet()) {
            /*
             * from Classes where cid=:cid and name=:name
             */
            buffer.append("and " + entry.getKey() + "=:" + entry.getKey());
        }
        Session session = HibernateUtils.sessionFactory.openSession();

        if (!StringUtils.isNullOrEmpty(orderName)) {
            buffer.append(" order by ");
            buffer.append(orderName);
            if (flag) {
                buffer.append(" Asc");
            } else {
                buffer.append(" Desc");
            }
            query = session.createQuery(buffer.toString());

        } else {
            query = session.createQuery(buffer.toString());
        }

        // 拼接参数,给参数赋值
        for (Entry<String, Object> entry : keyValues.entrySet()) {
            query.setParameter(entry.getKey(), entry.getValue());
        }
        return query.list();
    }
}

3、封装具体的Dao类

public class ClassesDao extends CommonDaoImpl<Classes> {
    //这里写属于ClassDao特有的一些方法,公共方法都抽到CommonDaoImpl中去了
}
  •  

4、执行单元测试

public void testQeryByCondition() {
        ClassesDao classesDao = new ClassesDao();
        Map<String, Object> keyValues = new HashMap<String, Object>();
        keyValues.put("name", "1班");
        List<Classes> classes = classesDao.getEntriesByCondition(keyValues,"cid",false);
        for (Classes classes2 : classes) {
            System.out.println(classes2.getDescription());
        }

        System.out.println(classes.size());
    }

小结

  • 这是一个浅面的Dao层设计,写一个共同的CommonDao接口,一个共同的CommonDaoImpl,我们将那些公共的Dao的CRUD封装在CommonDaoImpl中,然后让子类去继承CommonDaoImpl,这样以来,我们不但可以重用公共的代码,还可以将满足需求的特殊的方法写在子类里面。

本文转载自:http://blog.csdn.net/zhoukun1008/article/details/52859633

Airship
粉丝 50
博文 1097
码字总数 22567
作品 0
南京
高级程序员
私信 提问
基于 Spring JDBC 的轻量级 ORM 框架--sborm

一、SBORM 介绍 1、目前只考虑支持 mysql; 2、基于spring jdbc的上层封装,底层jdbc操作基于JdbcTemplate,对于使用spring jdbc的人会有一点价值,比较简洁的封装可以节省很多重复劳动,具体...

franticwind
2015/03/30
2.7K
0
hibernate hql 分页查询

今天封装了自己的hibernateDao,主要是基于hql的,期间遇到一个问题,最后解决了,和大家分享分享 其他hibernate的查询,像QBE,QBC,这些就不说了,如果用hibernate还是hql最强大,也很容易...

peanutmain
2012/06/10
14.4K
0
呸呸呸/sense-support

#为什么要做一个“sense”脚手架 java开发中常用的框架其实就是几个,spring(mvc),hibernate,mybatis,lucene,使用的数据库也就那么几种,mysql,redis,memcahced,mongodb。在遥远的“远...

呸呸呸
2016/11/10
0
0
JPA的多表复杂查询

最近工作中由于要求只能用hibernate+jpa 与数据库进行交互,在简单查询中,jpa继承CrudRepository接口 ,然后利用jpa的方法命名规范进行jpql查询,然而在进行复杂查询时,需要继承JpaSpecif...

从小爱喝AD钙奶的攻城狮
2017/11/12
0
0
关于ORM选型问题,分享下我对spring jdbc的使用经验

由于不太喜欢hibernate和mybatis,更多使用spring jdbc来开发,针对spring jdbc一些不便捷的地方,做了写整合,写了sborm,具体可以看项目介绍。 osc项目地址:http://www.oschina.net/p/sb...

franticwind
2015/03/30
1K
16

没有更多内容

加载失败,请刷新页面

加载更多

如何递归计算目录中的所有代码行?

我们有一个PHP应用程序,并希望计算特定目录及其子目录下的所有代码行。 我们不需要忽略评论,因为我们只是想弄清楚。 wc -l *.php 该命令在给定目录中运行良好,但忽略子目录。 我当时认为...

技术盛宴
32分钟前
3
0
使用 try-with-resources 优雅关闭资源

我们知道,在 Java 编程过程中,如果打开了外部资源(文件、数据库连接、网络连接等、redis),我们必须在这些外部资源使用完毕后,手动关闭它们。 因为外部资源不由 JVM 管理,无法享用 JVM ...

七弦桐
39分钟前
4
0
04.深入浅出索引(上)

简单来说,索引的出现就是为了提高数据查询效率,就像书的目录一样。 索引的常见模型 索引实现的方式有很多种,所以这里就引入了索引模型的概念,可以用于提高读写效率的数据结构很多,比较常...

scgaopan
42分钟前
5
0
Redis哨兵、复制、集群的设计原理,以及区别

谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。 **哨兵(Sentinel):**可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的...

Java阿七
52分钟前
5
0
浅析laravel路由执行原理

目前很多文章已经对Laravel的执行原理做了详细介绍,这里只是为了个人做一下简单记录 首先看入口 index.php 关键的执行函数就是 handle方法 ,但是前面的几个预处理函数,包括了整合框架的大...

冻结not
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部