hibernate4的dao基础工具类

因为hibernate4的事物处理已经完善的非常好,所以spring没有做hibernate4的事务支持(也就是spring的hibernateDaoSupport),所以hibernate4和之前版本的dao基础工具类有点区别,所以贴出来,仅供参考交流,不足的地方还望指正!
里面有基本的增删改查,hql、sql语句执行,分页查询的封装等。
  1. package com.itv.launcher.util;
  2. import java.io.Serializable;
  3. import java.util.Collection;
  4. import java.util.List;
  5. /**
  6. * @ClassName: IBaseDao
  7. * @Description: Dao封装接口
  8. * @author yz
  9. * @date 2014年6月16日17:05:17
  10. */
  11. public interface IBaseDao<T, ID extends Serializable> {
  12. /**
  13. * <保存实体>
  14. * <完整保存实体>
  15. * @param t 实体参数
  16. */
  17. public abstract void save(T t);
  18. /**
  19. * <保存或者更新实体>
  20. * @param t 实体
  21. */
  22. public abstract void saveOrUpdate(T t);
  23. /**
  24. * <load>
  25. * <加载实体的load方法>
  26. * @param id 实体的id
  27. * @return 查询出来的实体
  28. */
  29. public abstract T load(ID id);
  30. /**
  31. * <get>
  32. * <查找的get方法>
  33. * @param id 实体的id
  34. * @return 查询出来的实体
  35. */
  36. public abstract T get(ID id);
  37. /**
  38. * <contains>
  39. * @param t 实体
  40. * @return 是否包含
  41. */
  42. public abstract boolean contains(T t);
  43. /**
  44. * <delete>
  45. * <删除表中的t数据>
  46. * @param t 实体
  47. */
  48. public abstract void delete(T t);
  49. /**
  50. * <根据ID删除数据>
  51. * @param Id 实体id
  52. * @return 是否删除成功
  53. */
  54. public abstract boolean deleteById(ID Id);
  55. /**
  56. * <删除所有>
  57. * @param entities 实体的Collection集合
  58. */
  59. public abstract void deleteAll(Collection<T> entities);
  60. /**
  61. * <执行Hql语句>
  62. * @param hqlString hql
  63. * @param values 不定参数数组
  64. */
  65. public abstract void queryHql(String hqlString, Object... values);
  66. /**
  67. * <执行Sql语句>
  68. * @param sqlString sql
  69. * @param values 不定参数数组
  70. */
  71. public abstract void querySql(String sqlString, Object... values);
  72. /**
  73. * <根据HQL语句查找唯一实体>
  74. * @param hqlString HQL语句
  75. * @param values 不定参数的Object数组
  76. * @return 查询实体
  77. */
  78. public abstract T getByHQL(String hqlString, Object... values);
  79. /**
  80. * <根据SQL语句查找唯一实体>
  81. * @param sqlString SQL语句
  82. * @param values 不定参数的Object数组
  83. * @return 查询实体
  84. */
  85. public abstract T getBySQL(String sqlString, Object... values);
  86. /**
  87. * <根据HQL语句,得到对应的list>
  88. * @param hqlString HQL语句
  89. * @param values 不定参数的Object数组
  90. * @return 查询多个实体的List集合
  91. */
  92. public abstract List<T> getListByHQL(String hqlString, Object... values);
  93. /**
  94. * <根据SQL语句,得到对应的list>
  95. * @param sqlString HQL语句
  96. * @param values 不定参数的Object数组
  97. * @return 查询多个实体的List集合
  98. */
  99. public abstract List<T> getListBySQL(String sqlString, Object... values);
  100. /**
  101. * 由sql语句得到List
  102. * @param sql
  103. * @param map
  104. * @param values
  105. * @return List
  106. */
  107. public List findListBySql(final String sql, final RowMapper map, final Object... values);
  108. /**
  109. * <refresh>
  110. * @param t 实体
  111. */
  112. public abstract void refresh(T t);
  113. /**
  114. * <update>
  115. * @param t 实体
  116. */
  117. public abstract void update(T t);
  118. /**
  119. * <根据HQL得到记录数>
  120. * @param hql HQL语句
  121. * @param values 不定参数的Object数组
  122. * @return 记录总数
  123. */
  124. public abstract Long countByHql(String hql, Object... values);
  125. /**
  126. * <HQL分页查询>
  127. * @param hql HQL语句
  128. * @param countHql 查询记录条数的HQL语句
  129. * @param pageNo 下一页
  130. * @param pageSize 一页总条数
  131. * @param values 不定Object数组参数
  132. * @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合
  133. */
  134. public abstract PageResults<T> findPageByFetchedHql(String hql, String countHql, int pageNo, int pageSize, Object... values);
  135. }
复制代码
  1. package com.itv.launcher.util;
  2. import java.io.Serializable;
  3. import java.lang.reflect.ParameterizedType;
  4. import java.math.BigDecimal;
  5. import java.sql.Connection;
  6. import java.sql.PreparedStatement;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import java.sql.Timestamp;
  10. import java.sql.Types;
  11. import java.util.ArrayList;
  12. import java.util.Collection;
  13. import java.util.Date;
  14. import java.util.List;
  15. import org.hibernate.Query;
  16. import org.hibernate.ScrollableResults;
  17. import org.hibernate.Session;
  18. import org.hibernate.SessionFactory;
  19. import org.hibernate.jdbc.Work;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. /**
  22. * @ClassName: BaseDao
  23. * @Description: baseDao实现
  24. * @author yz
  25. * @date 2014年6月16日17:09:52
  26. *
  27. */
  28. @SuppressWarnings({ "rawtypes", "unchecked" })
  29. public class BaseDao<T, ID extends Serializable> implements IBaseDao<T, ID> {
  30. @Autowired
  31. private SessionFactory sessionFactory;
  32. protected Class<T> entityClass;
  33. public BaseDao() {
  34. }
  35. protected Class getEntityClass() {
  36. if (entityClass == null) {
  37. entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  38. }
  39. return entityClass;
  40. }
  41. /**
  42. * <保存实体>
  43. * <完整保存实体>
  44. * @param t 实体参数
  45. * @see com.itv.launcher.util.IBaseDao#save(java.lang.Object)
  46. */
  47. @Override
  48. public void save(T t) {
  49. this.getSession().save(t);
  50. }
  51. /**
  52. * <保存或者更新实体>
  53. * @param t 实体
  54. * @see com.itv.launcher.util.IBaseDao#saveOrUpdate(java.lang.Object)
  55. */
  56. @Override
  57. public void saveOrUpdate(T t) {
  58. this.getSession().saveOrUpdate(t);
  59. }
  60. /**
  61. * <load>
  62. * <加载实体的load方法>
  63. * @param id 实体的id
  64. * @return 查询出来的实体
  65. * @see com.itv.launcher.util.IBaseDao#load(java.io.Serializable)
  66. */
  67. @Override
  68. public T load(ID id) {
  69. T load = (T) this.getSession().load(getEntityClass(), id);
  70. return load;
  71. }
  72. /**
  73. * <get>
  74. * <查找的get方法>
  75. * @param id 实体的id
  76. * @return 查询出来的实体
  77. * @see com.itv.launcher.util.IBaseDao#get(java.io.Serializable)
  78. */
  79. @Override
  80. public T get(ID id) {
  81. T load = (T) this.getSession().get(getEntityClass(), id);
  82. return load;
  83. }
  84. /**
  85. * <contains>
  86. * @param t 实体
  87. * @return 是否包含
  88. * @see com.itv.launcher.util.IBaseDao#contains(java.lang.Object)
  89. */
  90. @Override
  91. public boolean contains(T t) {
  92. return this.getSession().contains(t);
  93. }
  94. /**
  95. * <delete>
  96. * <删除表中的t数据>
  97. * @param t 实体
  98. * @see com.itv.launcher.util.IBaseDao#delete(java.lang.Object)
  99. */
  100. @Override
  101. public void delete(T t) {
  102. this.getSession().delete(t);
  103. }
  104. /**
  105. * <根据ID删除数据>
  106. * @param Id 实体id
  107. * @return 是否删除成功
  108. * @see com.itv.launcher.util.IBaseDao#deleteById(java.io.Serializable)
  109. */
  110. @Override
  111. public boolean deleteById(ID Id) {
  112. T t = get(Id);
  113. if(t == null){
  114. return false;
  115. }
  116. delete(t);
  117. return true;
  118. }
  119. /**
  120. * <删除所有>
  121. * @param entities 实体的Collection集合
  122. * @see com.itv.launcher.util.IBaseDao#deleteAll(java.util.Collection)
  123. */
  124. @Override
  125. public void deleteAll(Collection<T> entities) {
  126. for(Object entity : entities) {
  127. this.getSession().delete(entity);
  128. }
  129. }
  130. /**
  131. * <执行Hql语句>
  132. * @param hqlString hql
  133. * @param values 不定参数数组
  134. * @see com.itv.launcher.util.IBaseDao#queryHql(java.lang.String, java.lang.Object[])
  135. */
  136. @Override
  137. public void queryHql(String hqlString, Object... values) {
  138. Query query = this.getSession().createQuery(hqlString);
  139. if (values != null)
  140. {
  141. for (int i = 0; i < values.length; i++)
  142. {
  143. query.setParameter(i, values[i]);
  144. }
  145. }
  146. query.executeUpdate();
  147. }
  148. /**
  149. * <执行Sql语句>
  150. * @param sqlString sql
  151. * @param values 不定参数数组
  152. * @see com.itv.launcher.util.IBaseDao#querySql(java.lang.String, java.lang.Object[])
  153. */
  154. @Override
  155. public void querySql(String sqlString, Object... values) {
  156. Query query = this.getSession().createSQLQuery(sqlString);
  157. if (values != null)
  158. {
  159. for (int i = 0; i < values.length; i++)
  160. {
  161. query.setParameter(i, values[i]);
  162. }
  163. }
  164. query.executeUpdate();
  165. }
  166. /**
  167. * <根据HQL语句查找唯一实体>
  168. * @param hqlString HQL语句
  169. * @param values 不定参数的Object数组
  170. * @return 查询实体
  171. * @see com.itv.launcher.util.IBaseDao#getByHQL(java.lang.String, java.lang.Object[])
  172. */
  173. @Override
  174. public T getByHQL(String hqlString, Object... values) {
  175. Query query = this.getSession().createQuery(hqlString);
  176. if (values != null)
  177. {
  178. for (int i = 0; i < values.length; i++)
  179. {
  180. query.setParameter(i, values[i]);
  181. }
  182. }
  183. return (T) query.uniqueResult();
  184. }
  185. /**
  186. * <根据SQL语句查找唯一实体>
  187. * @param sqlString SQL语句
  188. * @param values 不定参数的Object数组
  189. * @return 查询实体
  190. * @see com.itv.launcher.util.IBaseDao#getBySQL(java.lang.String, java.lang.Object[])
  191. */
  192. @Override
  193. public T getBySQL(String sqlString, Object... values) {
  194. Query query = this.getSession().createSQLQuery(sqlString);
  195. if (values != null)
  196. {
  197. for (int i = 0; i < values.length; i++)
  198. {
  199. query.setParameter(i, values[i]);
  200. }
  201. }
  202. return (T) query.uniqueResult();
  203. }
  204. /**
  205. * <根据HQL语句,得到对应的list>
  206. * @param hqlString HQL语句
  207. * @param values 不定参数的Object数组
  208. * @return 查询多个实体的List集合
  209. * @see com.itv.launcher.util.IBaseDao#getListByHQL(java.lang.String, java.lang.Object[])
  210. */
  211. @Override
  212. public List<T> getListByHQL(String hqlString, Object... values) {
  213. Query query = this.getSession().createQuery(hqlString);
  214. if (values != null)
  215. {
  216. for (int i = 0; i < values.length; i++)
  217. {
  218. query.setParameter(i, values[i]);
  219. }
  220. }
  221. return query.list();
  222. }
  223. /**
  224. * <根据SQL语句,得到对应的list>
  225. * @param sqlString HQL语句
  226. * @param values 不定参数的Object数组
  227. * @return 查询多个实体的List集合
  228. * @see com.itv.launcher.util.IBaseDao#getListBySQL(java.lang.String, java.lang.Object[])
  229. */
  230. @Override
  231. public List<T> getListBySQL(String sqlString, Object... values ) {
  232. Query query = this.getSession().createSQLQuery(sqlString);
  233. if (values != null)
  234. {
  235. for (int i = 0; i < values.length; i++)
  236. {
  237. query.setParameter(i, values[i]);
  238. }
  239. }
  240. return query.list();
  241. }
  242. /**
  243. * 由sql语句得到List
  244. * @param sql
  245. * @param map
  246. * @param values
  247. * @return List
  248. * @see com.itv.launcher.util.IBaseDao#findListBySql(java.lang.String, com.itv.launcher.util.RowMapper, java.lang.Object[])
  249. */
  250. @Override
  251. public List findListBySql(final String sql, final RowMapper map, final Object... values) {
  252. final List list = new ArrayList();
  253. // 执行JDBC的数据批量保存
  254. Work jdbcWork = new Work()
  255. {
  256. public void execute(Connection connection)
  257. throws SQLException
  258. {
  259. PreparedStatement ps = null;
  260. ResultSet rs = null;
  261. try
  262. {
  263. ps = connection.prepareStatement(sql);
  264. for (int i = 0; i < values.length; i++)
  265. {
  266. setParameter(ps, i, values[i]);
  267. }
  268. rs = ps.executeQuery();
  269. int index = 0;
  270. while (rs.next())
  271. {
  272. Object obj = map.mapRow(rs, index++);
  273. list.add(obj);
  274. }
  275. }
  276. finally
  277. {
  278. if (rs != null)
  279. {
  280. rs.close();
  281. }
  282. if (ps != null)
  283. {
  284. ps.close();
  285. }
  286. }
  287. }
  288. };
  289. this.getSession().doWork(jdbcWork);
  290. return list;
  291. }
  292. /**
  293. * <refresh>
  294. * @param t 实体
  295. * @see com.itv.launcher.util.IBaseDao#refresh(java.lang.Object)
  296. */
  297. @Override
  298. public void refresh(T t) {
  299. this.getSession().refresh(t);
  300. }
  301. /**
  302. * <update>
  303. * @param t 实体
  304. * @see com.itv.launcher.util.IBaseDao#update(java.lang.Object)
  305. */
  306. @Override
  307. public void update(T t) {
  308. this.getSession().update(t);
  309. }
  310. /**
  311. * <根据HQL得到记录数>
  312. * @param hql HQL语句
  313. * @param values 不定参数的Object数组
  314. * @return 记录总数
  315. * @see com.itv.launcher.util.IBaseDao#countByHql(java.lang.String, java.lang.Object[])
  316. */
  317. @Override
  318. public Long countByHql(String hql, Object... values) {
  319. Query query = this.getSession().createQuery(hql);
  320. if(values != null){
  321. for(int i = 0; i < values.length; i++) {
  322. query.setParameter(i, values[i]);
  323. }
  324. }
  325. return (Long) query.uniqueResult();
  326. }
  327. /**
  328. * <HQL分页查询>
  329. * @param hql HQL语句
  330. * @param countHql 查询记录条数的HQL语句
  331. * @param pageNo 下一页
  332. * @param pageSize 一页总条数
  333. * @param values 不定Object数组参数
  334. * @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合
  335. * @see com.itv.launcher.util.IBaseDao#findPageByFetchedHql(java.lang.String, java.lang.String, int, int, java.lang.Object[])
  336. */
  337. @Override
  338. public PageResults<T> findPageByFetchedHql(String hql, String countHql,
  339. int pageNo, int pageSize, Object... values) {
  340. PageResults<T> retValue = new PageResults<T>();
  341. Query query = this.getSession().createQuery(hql);
  342. if(values != null){
  343. for(int i = 0; i < values.length; i++) {
  344. query.setParameter(i, values[i]);
  345. }
  346. }
  347. int currentPage = pageNo > 1 ? pageNo : 1;
  348. retValue.setCurrentPage(currentPage);
  349. retValue.setPageSize(pageSize);
  350. if (countHql == null)
  351. {
  352. ScrollableResults results = query.scroll();
  353. results.last();
  354. retValue.setTotalCount(results.getRowNumber() + 1);// 设置总记录数
  355. }
  356. else
  357. {
  358. Long count = countByHql(countHql, values);
  359. retValue.setTotalCount(count.intValue());
  360. }
  361. retValue.resetPageNo();
  362. List<T> itemList = query.setFirstResult((currentPage - 1) * pageSize).setMaxResults(pageSize).list();
  363. if (itemList == null)
  364. {
  365. itemList = new ArrayList<T>();
  366. }
  367. retValue.setResults(itemList);
  368. return retValue;
  369. }
  370. /**
  371. * @return the sessionFactory
  372. */
  373. public SessionFactory getSessionFactory() {
  374. return sessionFactory;
  375. }
  376. /**
  377. * @param sessionFactory the sessionFactory to set
  378. */
  379. public void setSessionFactory(SessionFactory sessionFactory) {
  380. this.sessionFactory = sessionFactory;
  381. }
  382. /**
  383. *
  384. * @return session
  385. */
  386. public Session getSession() {
  387. //需要开启事物,才能得到CurrentSession
  388. return sessionFactory.getCurrentSession();
  389. }
  390. /**
  391. *
  392. * 设置每行批处理参数
  393. *
  394. * @param ps
  395. * @param pos ?占位符索引,从0开始
  396. * @param data
  397. * @throws SQLException
  398. * @see [类、类#方法、类#成员]
  399. */
  400. private void setParameter(PreparedStatement ps, int pos, Object data)
  401. throws SQLException
  402. {
  403. if (data == null)
  404. {
  405. ps.setNull(pos + 1, Types.VARCHAR);
  406. return;
  407. }
  408. Class dataCls = data.getClass();
  409. if (String.class.equals(dataCls))
  410. {
  411. ps.setString(pos + 1, (String)data);
  412. }
  413. else if (boolean.class.equals(dataCls))
  414. {
  415. ps.setBoolean(pos + 1, ((Boolean)data));
  416. }
  417. else if (int.class.equals(dataCls))
  418. {
  419. ps.setInt(pos + 1, (Integer)data);
  420. }
  421. else if (double.class.equals(dataCls))
  422. {
  423. ps.setDouble(pos + 1, (Double)data);
  424. }
  425. else if (Date.class.equals(dataCls))
  426. {
  427. Date val = (Date)data;
  428. ps.setTimestamp(pos + 1, new Timestamp(val.getTime()));
  429. }
  430. else if (BigDecimal.class.equals(dataCls))
  431. {
  432. ps.setBigDecimal(pos + 1, (BigDecimal)data);
  433. }
  434. else
  435. {
  436. // 未知类型
  437. ps.setObject(pos + 1, data);
  438. }
  439. }
  440. }
复制代码
  1. package com.itv.launcher.util;
  2. import java.util.List;
  3. /**
  4. * 分页封装类
  5. * 用于做分页查询的基础类,封装了一些分页的相关属性
  6. * @author 闫洲
  7. * @version v1.0
  8. * @param <T>
  9. */
  10. public class PageResults<T> {
  11. // 下一页
  12. private int pageNo;
  13. // 当前页
  14. private int currentPage;
  15. // 每页个个数
  16. private int pageSize;
  17. // 总条数
  18. private int totalCount;
  19. // 总页数
  20. private int pageCount;
  21. // 记录
  22. private List<T> results;
  23. public int getPageCount() {
  24. return pageCount;
  25. }
  26. public void setPageCount(int pageCount) {
  27. this.pageCount = pageCount;
  28. }
  29. public int getPageNo() {
  30. if (pageNo <= 0) {
  31. return 1;
  32. } else{
  33. return pageNo > pageCount ? pageCount : pageNo;
  34. }
  35. }
  36. public void setPageNo(int pageNo) {
  37. this.pageNo = pageNo;
  38. }
  39. public List<T> getResults() {
  40. return results;
  41. }
  42. public void setResults(List<T> results) {
  43. this.results = results;
  44. }
  45. public int getCurrentPage() {
  46. return currentPage;
  47. }
  48. public void setCurrentPage(int currentPage) {
  49. this.currentPage = currentPage;
  50. }
  51. public int getPageSize() {
  52. return pageSize;
  53. }
  54. public void setPageSize(int pageSize) {
  55. this.pageSize = pageSize <= 0 ? 10 : pageSize;
  56. }
  57. public int getTotalCount() {
  58. return totalCount;
  59. }
  60. public void setTotalCount(int totalCount) {
  61. this.totalCount = totalCount;
  62. }
  63. public void resetPageNo() {
  64. pageNo = currentPage + 1;
  65. pageCount = totalCount % pageSize == 0 ? totalCount / pageSize
  66. : totalCount / pageSize + 1;
  67. }
  68. }
复制代码
  1. package com.itv.launcher.util;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. /**
  5. * RowMapper
  6. * @author yanzhou
  7. * @version v1.0
  8. */
  9. public interface RowMapper
  10. {
  11. public Object mapRow(ResultSet rs, int index)
  12. throws SQLException;
  13. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值