对于后端开发者来说,经常跟数据库打交道,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