HibernateDAO: 通用DAO,基于Hibernate的DAO实现

 

对于后端开发者来说,经常跟数据库打交道,hibernate mybatis是常用是的持久化层,mybatis简单、灵活,易上手,但要写大量的sql;Hibernate太复杂,但对基于对象的操作则方便些,但是对于复杂的查询也是比较麻烦。但在实际项目中,大部分语句是比较简单的,只有部分会比较复杂些,但若简单的语句写多了也是麻烦。此DAO层正是由此而来,基于Hibernate开发,解决小sql的问题,对于复杂的sql,还需要自己手写。


2021-1-31 

升级为hibernate search6.0.0,6.0.0与5.x版有很大的不同,注解变了,已经一个@Field就行,现在分为好几个,从注解到查询好多地方都有变,但在连表方面还是要方便些,整体来说使用是方便了,不过升级版本造成的改动还是比较大。


该DAO的功能就是增删改查,以及搜索:

1. Dao类,大部分增删改查都在这里面,只要将实际用到的Dao继承此类就行。

2. QueryObject类,提供查询功能,使查询更加简单。

3. QueryUpdateObject类:提供更新功能,这个比较简单,具体可以参考项目中的实例。

4. QueryDeleteObject类:提供删除功能,这个比较简单,具体可以参考项目中的实例

5. QuerySearchObject类:基于Hibernate Search,实现搜索功能。

使用

 

使用简单,只需要用一个抽象BaseDao继承此Dao,再用实际用到的Dao类继承Dao,只需要传入SessionFactory:

public abstract class BaseDao<T> extends Dao<T>{

    @Autowired

    protected SessionFactory sessionFactory;

    

    protected SessionFactory getSessionFactory() {

        return sessionFactory;

    }

}

 

先说Dao类,就是常见的dao,有一些增删改查的功能,但由于查询要传入sql,在简单的sql比较多的时候,感觉不是太方便,这个和常用的差不多。但也增加了一些常用功能:比如对单个属性的查询可以直接传入,加了一些统计查询,此处不再赘述,具体内容可以参见Dao类,或者TestDao类。

 

QueryObject类:这个是此项目的核心,该项目就是为了使查询更加方便。

下面的例子均以相应dao bean已注入或者已传入为前提。

 

// 查询等于条件,返回单个对象

User user = userDao.getQueryObject().andEqual("name", "125").getOne();

// 查询等于条件,返回list

List<User> users = userDao.getQueryObject().andEqual("name", "aaaa").list();

 

// 查询关联表等于条件,返回list

List<Company> cs = companyDao.getQueryObject().andGe("user.age", 88).list();

 

// 查询多个条件

List<User> users = userDao.getQueryObject().andLe("age", 88).orLike("name", "ABCD").orLike("info", "abcd").isNull("age").list();

 

// 排序

List<User> users = userDao.getQueryObject().andEqual("name", "125").orderAsc("age").list();

List<Company> list1 = companyDao.getQueryObject().orderDesc("address.user.age").list();

 

// 分组

List<User> users = userDao.getQueryObject().groupBy("name").list();

List<Company> list1 = companyDao.getQueryObject().groupBy("address.user.age").list();

 

// 关联表

List<Company> list1 = companyDao.getQueryObject().innerJoin("user").groupBy("address.user.age").list();

List<Address> list = addressDao.getQueryObject().leftJoin("user").andEqual("id", 5L).list();

 

// 关联且抓取

List<Company> list2 = companyDao.getQueryObject().innerJoinFetch("address.user")

.groupBy("address.user.age") .list();

 

// in

List<Company> list = companyDao.getQueryObject().andIn("address.user.age", Arrays.asList(8,2, 10)).list();

 

// distinct

List<User> users = addressDao.getQueryObject().distinct().andEqual("city", "深圳").list("user");

 

// 只查询需要的字段

List<String> list1 = companyDao.getQueryObject().list("user.name");

List<Object[]> list1 = companyDao.getQueryObject().list("user.name", "name", "user.age", "address.user.name");

 

// 获取单个值

Integer age = userDao.getQueryObject().andEqual("name", "125").getSingleValue("age");

 

// 统计,是否去重

Long num = userDao.getQueryObject().andEqual("name", "bbbb").count(false);

 

// 聚合函数

String max = userDao.getQueryObject().max("name");

int minAge = userDao.getQueryObject().min("age");

Number num = companyDao.getQueryObject().sum("address.user.age");

 

采用链式操作,使查询更简单、易读。

 

QuerySearchObject类:搜索功能,采用Hibernate Search功能,实现全文本搜索,可以针对文本、范围以及距离搜索:

// 查找

List<Product> list = productDao.getQuerySearchObject().match("坏不了的手机", "subtitle").list(0, 20);

 

// 加过滤条件

List<Address> list2 = addressDao.getQuerySearchObject().match("是", "street").sentence("user.name", "工有")./*sentence("user.id", 10).*/list(0, 20);

 

// 范围

List<Product> list2 = productDao.getQuerySearchObject().match("手机", "name", "subtitle").sentence("categories.category.name", "小米").range("price", 1000, 8000, double.class).list(0, 20);

List<User> list5 = userDao.getQuerySearchObject().above("age", 10, int.class).below("age", 88, int.class).range("birthday", LocalDate.of(1955, 5, 5), LocalDate.of(1999, 9, 9), LocalDate.class).list(0, 20);

 

// 若是使用BigDecimal类的数字,要转换,并且查找时要指定之前转成了什么类型

List<User> list5 = userDao.getQuerySearchObject().range("property", 100, 180, double.class);

 

// 排序

List<Product> list3 = productDao.getQuerySearchObject()/*.match("果", "name").match("坏不了的手机", "subtitle")*/.range("price", 10, 500, double.class).sort("price", SortField.Type.DOUBLE, true).list(0, 20);

 

// 获取附近30公里以内的人

List<User> list = userDao.getQuerySearchObject().distance(30, 114.06667, 22.61667).list(0, 20);

 

// 获取附近30公里,且返回每个user的距离

List<Object[]> list = userDao.getQuerySearchObject().distance(30, 114.06667, 22.61667).listWithDistance("location", /*114.06667, 22.61667, */0, 20);

 

上面列出的是一些常见功能,还有一些其它功能请见相应的实现类,或者测试类。

项目下载地址:https://github.com/yanghf2000/Hibernate-DAO.git

 

 

版权声明:本文为博主原创文章,转发请注明出处:  http://blog.csdn.net/baidu_32448463/article/details/79637882

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值