提取经常操作表如新增、修改、删除、查询、分页查询、统计等业务功能,形成基类,用泛型传参,有利于每个实体对象数据层继承。

  1. package com.base.dao;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Collection;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Set;
  8.  
  9. import javax.annotation.Resource;
  10.  
  11. import org.hibernate.Query;
  12. import org.hibernate.Session;
  13. import org.hibernate.SessionFactory;
  14. import org.hibernate.criterion.CriteriaSpecification;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Repository;
  17.  
  18. /**
  19. * 数据库操作接口实现类,where条件使用命名参数
  20. *
  21. */
  22. @Repository("baseDao")
  23. @SuppressWarnings("all")
  24. public class BaseDao<T> {
  25.  
  26. private SessionFactory sessionFactory;
  27.  
  28. public SessionFactory getSessionFactory() {
  29. return sessionFactory;
  30. }
  31.  
  32. @Autowired
  33. public void setSessionFactory(SessionFactory sessionFactory) {
  34. this.sessionFactory = sessionFactory;
  35. }
  36.  
  37. private Session getCurrentSession() {
  38. return sessionFactory.getCurrentSession();//获取数据库链接
  39. }
  40.  
  41. /**
  42. * 保存一个对象
  43. *
  44. * @param T 要保存的JavaBean 对象
  45. *
  46. */
  47. public Serializable save(T o) {
  48. return this.getCurrentSession().save(o);
  49. }
  50.  
  51. /**
  52. * 删除一个对象
  53. *
  54. * @param T 对象
  55. *
  56. */
  57. public void delete(T o) {
  58. this.getCurrentSession().delete(o);
  59. }
  60.  
  61. /**
  62. * 修改一个对象
  63. *
  64. * @param T 对象
  65. *
  66. */
  67. public void update(T o) {
  68. this.getCurrentSession().update(o);
  69. }
  70.  
  71. /**
  72. * 查询对象集合
  73. *
  74. * @param Hql格式查询语句
  75. * @return 对象集合
  76. */
  77. public List<T> find(String hql) {
  78. return this.getCurrentSession().createQuery(hql).list();
  79. }
  80.  
  81. /**
  82. * 查询对象集合
  83. *
  84. * @param Hql格式语句
  85. * @param map参数
  86. * @return 对象集合
  87. */
  88. public List<T> find(String hql, Map<String, Object> map) {
  89. Query q = this.getCurrentSession().createQuery(hql);
  90. if (map != null) {
  91. Set<String> keySet = map.keySet();
  92. for (String string : keySet) {
  93. Object obj = map.get(string);
  94. if (obj instanceof Collection<?>) {
  95. q.setParameterList(string, (Collection<?>) obj);
  96. } else if (obj instanceof Object[]) {
  97. q.setParameterList(string, (Object[]) obj);
  98. } else {
  99. q.setParameter(string, obj);
  100. }
  101. }
  102. }
  103. return q.list();
  104. }
  105.  
  106. /**
  107. * 分页查询对象集合
  108. *
  109. * @param Hql格式语句
  110. * @param map参数
  111. * @param 页码
  112. * @param 每页记录数
  113. * @return 对象集合
  114. **/
  115. public List<T> find(String hql, Map<String, Object> map, Integer page, Integer rows) {
  116. if (page == null || page < 1) {
  117. page = 1;
  118. }
  119. if (rows == null || rows < 1) {
  120. rows = 10;
  121. }
  122. Query q = this.getCurrentSession().createQuery(hql);
  123. if (map != null) {
  124. Set<String> keySet = map.keySet();
  125. for (String string : keySet) {
  126. Object obj = map.get(string);
  127. if (obj instanceof Collection<?>) {
  128. q.setParameterList(string, (Collection<?>) obj);
  129. } else if (obj instanceof Object[]) {
  130. q.setParameterList(string, (Object[]) obj);
  131. } else {
  132. q.setParameter(string, obj);
  133. }
  134. }
  135. }
  136. return q.setFirstResult((page - 1) * rows).setMaxResults(rows).list();
  137. }
  138.  
  139. /**
  140. * 查询指定对象
  141. *
  142. * @param 对象
  143. * @param 主键值
  144. * @return 获取对象
  145. */
  146. public T get(Class<T> c, Serializable id) {
  147. return (T) this.getCurrentSession().get(c, id);
  148. }
  149.  
  150. /**
  151. * 查询指定对象
  152. *
  153. * @param hql查询语句
  154. * @param map参数
  155. * @return 相应对象
  156. */
  157. public T get(String hql, Map<String, Object> map) {
  158. List<T> l = this.find(hql, map);
  159. if (l != null && l.size() > 0) {
  160. return l.get(0);
  161. } else {
  162. return null;
  163. }
  164. }
  165.  
  166. /**
  167. * 查询记录数
  168. *
  169. * @param hql查询语句
  170. * @param map参数
  171. * @return 记录数
  172. */
  173. public Long count(String hql, Map<String, Object> map) {
  174. Query q = this.getCurrentSession().createQuery(hql);
  175. if (map != null) {
  176. Set<String> keySet = map.keySet();
  177. for (String string : keySet) {
  178. Object obj = map.get(string);
  179. if (obj instanceof Collection<?>) {
  180. q.setParameterList(string, (Collection<?>) obj);
  181. } else if (obj instanceof Object[]) {
  182. q.setParameterList(string, (Object[]) obj);
  183. } else {
  184. q.setParameter(string, obj);
  185. }
  186. }
  187. }
  188. return (Long) q.uniqueResult();
  189. }
  190.  
  191. /**
  192. * 执行更新语句
  193. *
  194. * @param hql查询语句
  195. * @param map参数
  196. * @return 响应数目
  197. */
  198. public Integer executeHql(String hql, Map<String, Object> map) {
  199. Query q = this.getCurrentSession().createQuery(hql);
  200. if (map != null) {
  201. Set<String> keySet = map.keySet();
  202. for (String string : keySet) {
  203. Object obj = map.get(string);
  204. if (obj instanceof Collection<?>) {
  205. q.setParameterList(string, (Collection<?>) obj);
  206. } else if (obj instanceof Object[]) {
  207. q.setParameterList(string, (Object[]) obj);
  208. } else {
  209. q.setParameter(string, obj);
  210. }
  211. }
  212. }
  213. return q.executeUpdate();
  214. }
  215.  
  216. /**
  217. * 执行查询语句
  218. *
  219. * @param hql查询语句
  220. * @param map 参数
  221. * @return 响应数目
  222. */
  223. public List<Object> queryHql(String hql, Map<String, Object> map) {
  224. Query q = this.getCurrentSession().createQuery(hql);
  225. if (map != null) {
  226. Set<String> keySet = map.keySet();
  227. for (String string : keySet) {
  228. Object obj = map.get(string);
  229. if (obj instanceof Collection<?>) {
  230. q.setParameterList(string, (Collection<?>) obj);
  231. } else if (obj instanceof Object[]) {
  232. q.setParameterList(string, (Object[]) obj);
  233. } else {
  234. q.setParameter(string, obj);
  235. }
  236. }
  237. }
  238. return q.list();
  239. }
  240.  
  241. /**
  242. * 执行查询语句
  243. *
  244. * @param hql查询语句
  245. * @param map 参数
  246. * @return Map记录返回集合
  247. */
  248. public List<Object> queryHqlMap(String hql, Map<String, Object> map) {
  249. Query q = this.getCurrentSession().createQuery(hql);
  250. if (map != null) {
  251. Set<String> keySet = map.keySet();
  252. for (String string : keySet) {
  253. Object obj = map.get(string);
  254. if (obj instanceof Collection<?>) {
  255. q.setParameterList(string, (Collection<?>) obj);
  256. } else if (obj instanceof Object[]) {
  257. q.setParameterList(string, (Object[]) obj);
  258. } else {
  259. q.setParameter(string, obj);
  260. }
  261. }
  262. }
  263. q.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
  264. return q.list();
  265. }
  266. }

 

调用示例

  1. @Repository("softwareDao")
  2. public class SoftwareDao extends BaseDao<Software> {
  3.  
  4. public void delete(String terminalId) {
  5. String hql = "delete from Software WHERE terminalId = :terminalId";
  6. Map<String, Object> paramMap = new HashMap<String, Object>();
  7. paramMap.put("terminalId", terminalId);
  8. executeHql(hql, paramMap);
  9. }
  10.  
  11. }

  

 

Hibernate 数据层基类实现的更多相关文章

  1. BaseDAL最牛数据层基类2

    using System; using System.Data.Entity; using System.Linq; using System.Threading.Tasks; using Syste ...

  2. BaseDAL数据层基类1

    /// <summary> /// EF数据库操作基类 /// </summary> /// <typeparam name="T"></ ...

  3. C# 基于MySQL的数据层基类(MySQLHelper)

    这里介绍下比较简单的方式,引用MySql.Data.dll然后添加一个MySqlHelper类来对MySql数据库进行访问和操作. 1.将MySql.Data.dll引用到你的项目中 下载地址:MyS ...

  4. 使用SqlSugar封装的数据层基类

    首先简单封装了个DbContext public class DbContext { #region 属性字段 private static string _connectionString; /// ...

  5. 四、spring集成ibatis进行项目中dao层基类封装

    Apache iBatis(现已迁至Google Code下发展,更名为MyBatis)是当前IT项目中使用很广泛的一个半自动ORM框架,区别于Hibernate之类的全自动框架,iBatis对数据库 ...

  6. BIM工程信息管理系统-EF实体框架数据操作基类

    EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...

  7. mysql批量插入数据的基类

    自己设计的一个mysql数据库批量添加数据的基类.用于批量向mysql数据库添加数据,子类实现起来很简单,自测性能也还不错. 1.基类实现-BatchAddBase using System.Coll ...

  8. 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理

    我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...

  9. EF实体框架数据操作基类(转)

    //----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司 ...

随机推荐

  1. 压缩感知重构算法之OMP算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  2. Task 的一些个人见解

    Task确实比较好用且优雅 我感觉.NET要成为艺术家... public class TheTask { /// <summary> /// 直接调用是同步方法 /// </sum ...

  3. Python多版本管理器pyenv

    查看Linux版本 [root@web ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@web ~]# uname -a L ...

  4. VS编译命令

    一.前言 由于公司要求项目需要走CI构建平台,抛弃掉之前的人工编译打包方式,所以需要调研一下项目怎么通过命令行编译出产物. 二.准备工作 在构建机器上安装vs(本文示例为vs2017) 将代码上传版本 ...

  5. Orleans 初接触(二) 测试用例

    [返回导航] 在简单了解了Orleans 之后我们可以通过几个例子去加深印象 一.快速入门示例 这个例子也是跟着<Microsoft Orleans 之 入门指南>(https://www ...

  6. VS Code 成主宰、Vue 备受热捧!2019 前端开发趋势必读

    前端在生产和开发中占据着越来越重要的地位,PC 端.手机端.桌面端.智能手表端等等设备都离不开前端的身影.本文将围绕框架.编程语言.工具.React.Vue 等方面,全面回顾 2019 年前端与 We ...

  7. HttpRunner学习6--使用parameters参数化

    前言 在使用HttpRunner测试过程中,我们可能会遇到这种场景: 账号登录功能,需要输入用户名和密码,设计测试用例后有 N 种组合情况 如果测试组合比较少,比如只有2个,那我们直接在YAML脚本中 ...

  8. 函数式响应式编程 - Functional Reactive Programming

    我们略过概念,直接看函数式响应式编程解决了什么问题. 从下面这个例子展开: 两个密码输入框,一个提交按钮. 密码.确认密码都填写并一致,允许提交:不一致提示错误. HTML 如下: <input ...

  9. ReadWriteLock场景应用解析

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  10. IDEA中使用Maven模板创建Maven WebApp项目并使用Tomact来运行项目

    首先需要正确安装Maven和Tomact,Maven安装和Tomact安装步骤,参见别的文章. 一.创建Maven工作空间 点击Finish按钮后,耐心等待.直到出现BUILD SUCCESS为止. ...