Hibernate泛型DAO设计
2011-08-31 00:16
295 查看
泛型是JDK1.5的一个新的特性,使用泛型机制编写的程序代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。如果你的系统运行在JDK1.5以上的版本上,建议多使用泛型来代替无休止的对象转换。
在软件设计中我们开始对系统进行三层甚至是多层架构了,目的是职责更加的明确,功能更加的分离。而常常使用的三层架构就是将表现层、业务逻辑层和持久层进行分离,每一层关注点不同,职能更加的清晰。所以DAO的设计模式现在已经被我们所接受,下面就介绍一下泛型DAO的设计和实现。
这次的DAO例子是基于接口的.很多工具, 像Hibernate已经提供了数据库的便携访问,所以我们不是为持久层的轻便而设计接口. 然而, DAO接口在较为复杂的应用中更有意义, 当有几个持久化服务被封装到一个持久层的时候, 我想在很多情况下你应该直接使用Hibernate或者JPA, 而使用外加的DAO层最好的理由是为了实现更高的抽象化(例如:定义方法名findAll(String hql)而不是无数次地重复session.createQuery(...))
通用DAO接口:
view plainprint?
1. package com.baiyyy.util.dao;
2.
3. import java.io.Serializable;
4. import java.util.Collection;
5. import java.util.Iterator;
6. import java.util.List;
7.
8. import org.hibernate.Criteria;
9. import org.hibernate.LockMode;
10. import org.hibernate.criterion.Criterion;
11. import org.hibernate.criterion.DetachedCriteria;
12.
13. /**
14. * 承有业务数据的基础访问接口
15. * <p>
16. * 承有CRUD (创建,读取,修改和删陿)基本数据的操作在这个接口中都是独立的_ 并且承有的DAO都可以使用这些基本实玿
17. *
18. * @author yongtree
19. *
20. * @date:2008-03-04
21. */
22. public interface IBaseDAO<T, ID extends Serializable> {
23.
24. /***************************************************************************
25. * -------------------基本棿索?增加?修改?删除操使---------------------------- *
26. **************************************************************************/
27.
28. // --------findById()方法是?过get(ID id)得到实体对象-----------------------
29. /**
30. * 通过ID来得到实体对豿
31. *
32. * @param id
33. * 实体对象的标识符
34. * @param lock
35. * 使用的锁模式
36. * @return 该主键忼对应的实体对象
37. */
38. public T findById(ID id, LockMode lock);
39.
40. /**
41. * 通过ID来得到实体对豿
42. *
43. * @param id
44. * @return T
45. */
46. public T findById(ID id);
47.
48. /**
49. * 通过ID来得到实体对豿(为兼容其他开发成员的原有程序,保留使甿)
50. *
51. * @param c
52. * @param id
53. * @return T
54. */
55. public T findById(Class c, ID id);
56.
57. // -------------loadById()是调用hibernate的load方法------------
58.
59. public T loadById(ID id);
60.
61. /**
62. * 通过id load对象
63. *
64. * @param id
65. * @param lock
66. * @return
67. */
68. public T loadById(ID id, LockMode lock);
69.
70. /**
71. * 获取全部的实使
72. *
73. * @return
74. */
75. public List<T> loadAll();
76.
77. /**
78. * 保存丿个实体对豿
79. *
80. * @param entity
81. */
82. public T saveEntity(T entity);
83.
84. /**
85. * 更新丿个实体对豿
86. *
87. * @param entity
88. */
89. public void updateEntity(T entity);
90.
91. public void updateEntity(T entity, LockMode lock);
92.
93. /**
94. * 增加或更新集合中的全部实使
95. *
96. * @param entities
97. */
98. public void saveOrUpdateAll(Collection<T> entities);
99.
100. /**
101. * 删除丿个实使
102. *
103. * @param entity
104. * @throws Exception
105. */
106. public void deleteEntity(T entity);
107.
108. public void deleteEntity(T entity, LockMode lock);
109.
110. /**
111. * 根据主键删除指定实体
112. *
113. * @param id
114. */
115. public void deleteEntityById(ID id);
116.
117. public void deleteEntityById(ID id, LockMode lock);
118.
119. /**
120. * 批量删除
121. *
122. * @param entities
123. */
124. public void deleteAll(Collection<T> entities);
125.
126. /**
127. * 通过合并的方式更新对豿
128. *
129. * @param entity
130. * void
131. */
132. public void merge(T entity);
133.
134. /***************************************************************************
135. * ------------------------------使用HQL语句-------------------------------- *
136. **************************************************************************/
137.
138. /**
139. * 使用HQL语句进行对象的查诿
140. *
141. * @param hsql
142. * 查询语句
143. * @return 符合条件的对豿
144. */
145.
146. public T getEntity(String hsql);
147.
148. /**
149. * 使用HQL语句进行查询
150. *
151. * @param hsql
152. * 查询语句
153. * @return 符合条件的对象集吿
154. */
155. public List<T> getEntities(String hsql);
156.
157. /**
158. * 使用带参数的HQL语句进行查询
159. *
160. * @param hsql
161. * @param obj
162. * @return
163. */
164. public List<T> getEntities(String hsql, Object[] values);
165.
166. public List<T> getEntities(String hql, int start, int number);
167.
168. public List<T> getEntities(String hql, int start, int number,
169. Object[] values);
170.
171. /**
172. * 使用命名的HQL语句棿索数捿
173. *
174. * @param queryName
175. * @return
176. */
177. public List<T> findByNamedQuery(String queryName);
178.
179. /**
180. * 使用带参数的命名HSQL语句棿索数捿
181. *
182. * @param queryName
183. * @param values
184. * @return
185. */
186. public List<T> findByNamedQuery(String queryName, Object[] values);
187.
188. /**
189. * 使用带命名参数的命名HSQL语句棿索数捿
190. *
191. * @param queryName
192. * @param paramNames
193. * @param values
194. * @return
195. */
196. public List<T> findByNamedQuery(String queryName, String[] paramNames,
197. Object[] values);
198.
199. /**
200. * 使用HQL语句棿索数据,返回 Iterator
201. *
202. * @param queryString
203. * @return
204. */
205. public Iterator<T> iterate(String queryString);
206.
207. /**
208. * 使用带参数HSQL语句棿索数据,返回 Iterator
209. *
210. * @param queryString
211. * @param values
212. * @return
213. */
214. public Iterator<T> iterate(String queryString, Object[] values);
215.
216. /***************************************************************************
217. * -----------------------------Criteria动濁查诿---------------------------- *
218. **************************************************************************/
219.
220. /**
221. * 创建与会话无关的棿索标准对豿
222. */
223. public DetachedCriteria createDetachedCriteria();
224.
225. /**
226. * 创建与会话绑定的棿索标准对豿
227. *
228. * @return
229. */
230. public Criteria createCriteria();
231.
232. /**
233. * 使用指定的检索标准检索数捿
234. *
235. * @param criteria
236. * @return
237. */
238. public List<T> findByCriteria(DetachedCriteria criteria);
239.
240. /**
241. * 使用指定的检索标准检索数据,返回部分记录
242. *
243. * @param criteria
244. * @param firstResult
245. * @param maxResults
246. * @return
247. */
248. public List<T> findByCriteria(DetachedCriteria criteria, int firstResult,
249. int maxResults);
250.
251. /**
252. * 通过动濁查询条件进行查诿
253. *
254. * @param criterion
255. * @return List<T>
256. */
257. @SuppressWarnings("unchecked")
258. public List<T> findByCriteria(Criterion... criterion);
259.
260. /**
261. * 使用指定的检索标准检索数据,返回指定范围的记彿
262. *
263. * @param criteria
264. * @return
265. */
266. public Integer getRowCount(DetachedCriteria criteria);
267.
268. /**
269. * 使用指定的检索标准检索数据,返回指定统计倿
270. *
271. * @param criteria
272. * @param propertyName
273. * @param StatName
274. * (max,min,avg,sum)
275. * @return
276. */
277. public Object getStatValue(DetachedCriteria criteria, String propertyName,
278. String StatName);
279.
280. /**
281. * 通过给定的一个对象,查找与其匹配的对象,表关联比较多时,用户可以自己根据霿要扩展?
282. *
283. * @param entity
284. * @return List<T>
285. */
286. public List<T> findByExample(T entity);
287.
288. /***************************************************************************
289. * -------------------------Others ----------------------------------------*
290. **************************************************************************/
291.
292. /**
293. * 加锁指定的实使
294. *
295. * @param entity
296. * @param lockMode
297. */
298. public void lock(T entity, LockMode lockMode);
299.
300. /**
301. * 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新)
302. */
303. public void flush();
304.
305. /**
306. * 清空缓存
307. *
308. * void
309. */
310. public void clear();
311.
312. /***************************************************************************
313. * --------------------------------相关知识炿--------------------------------*
314. *
315. * 1、Session的load方法和get方法都是通过给定的ID从数据库中加载一个持久化的对象?但两个斿*
316. * 法的区别在于:当数据库不存在于ID对应的记录时,load()方法抛出异常,迌get()方法返回null*
317. ***************************************************************************/
318.
319. }
package com.baiyyy.util.dao; import java.io.Serializable; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.hibernate.Criteria; import org.hibernate.LockMode; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.DetachedCriteria;
/** * 承有业务数据的基础访问接口 * <p> * 承有CRUD (创建,读取,修改和删陿)基本数据的操作在这个接口中都是独立的_ 并且承有的DAO都可以使用这些基本实玿 * * @author yongtree * * @date:2008-03-04 */ public interface IBaseDAO<T, ID extends Serializable> { /***************************************************************************
* -------------------基本棿索?增加?修改?删除操使---------------------------- * **************************************************************************/ // --------findById()方法是?过get(ID id)得到实体对象----------------------- /** * 通过ID来得到实体对豿 * * @param id * 实体对象的标识符 * @param
lock * 使用的锁模式 * @return 该主键忼对应的实体对象 */ public T findById(ID id, LockMode lock); /** * 通过ID来得到实体对豿 * * @param id * @return T */ public T findById(ID id); /** * 通过ID来得到实体对豿(为兼容其他开发成员的原有程序,保留使甿) * * @param c * @param id * @return T */ public T findById(Class
c, ID id); // -------------loadById()是调用hibernate的load方法------------ public T loadById(ID id); /** * 通过id load对象 * * @param id * @param lock * @return */ public T loadById(ID id, LockMode lock); /** * 获取全部的实使 * * @return */ public List<T> loadAll(); /** *
保存丿个实体对豿 * * @param entity */ public T saveEntity(T entity); /** * 更新丿个实体对豿 * * @param entity */ public void updateEntity(T entity); public void updateEntity(T entity, LockMode lock); /** * 增加或更新集合中的全部实使 * * @param entities */ public void saveOrUpdateAll(Collection<T>
entities); /** * 删除丿个实使 * * @param entity * @throws Exception */ public void deleteEntity(T entity); public void deleteEntity(T entity, LockMode lock); /** * 根据主键删除指定实体 * * @param id */ public void deleteEntityById(ID id); public void deleteEntityById(ID id,
LockMode lock); /** * 批量删除 * * @param entities */ public void deleteAll(Collection<T> entities); /** * 通过合并的方式更新对豿 * * @param entity * void */ public void merge(T entity); /*************************************************************************** * ------------------------------使用HQL语句--------------------------------
* **************************************************************************/ /** * 使用HQL语句进行对象的查诿 * * @param hsql * 查询语句 * @return 符合条件的对豿 */ public T getEntity(String hsql); /** * 使用HQL语句进行查询 * * @param hsql * 查询语句 * @return 符合条件的对象集吿 */ public List<T> getEntities(String
hsql); /** * 使用带参数的HQL语句进行查询 * * @param hsql * @param obj * @return */ public List<T> getEntities(String hsql, Object[] values); public List<T> getEntities(String hql, int start, int number); public List<T> getEntities(String hql, int start, int number, Object[]
values); /** * 使用命名的HQL语句棿索数捿 * * @param queryName * @return */ public List<T> findByNamedQuery(String queryName); /** * 使用带参数的命名HSQL语句棿索数捿 * * @param queryName * @param values * @return */ public List<T> findByNamedQuery(String queryName, Object[] values);
/** * 使用带命名参数的命名HSQL语句棿索数捿 * * @param queryName * @param paramNames * @param values * @return */ public List<T> findByNamedQuery(String queryName, String[] paramNames, Object[] values); /** * 使用HQL语句棿索数据,返回 Iterator * * @param queryString * @return */ public
Iterator<T> iterate(String queryString); /** * 使用带参数HSQL语句棿索数据,返回 Iterator * * @param queryString * @param values * @return */ public Iterator<T> iterate(String queryString, Object[] values); /***************************************************************************
* -----------------------------Criteria动濁查诿---------------------------- * **************************************************************************/ /** * 创建与会话无关的棿索标准对豿 */ public DetachedCriteria createDetachedCriteria(); /** * 创建与会话绑定的棿索标准对豿 * * @return
*/ public Criteria createCriteria(); /** * 使用指定的检索标准检索数捿 * * @param criteria * @return */ public List<T> findByCriteria(DetachedCriteria criteria); /** * 使用指定的检索标准检索数据,返回部分记录 * * @param criteria * @param firstResult * @param maxResults * @return */ public
List<T> findByCriteria(DetachedCriteria criteria, int firstResult, int maxResults); /** * 通过动濁查询条件进行查诿 * * @param criterion * @return List<T> */ @SuppressWarnings("unchecked") public List<T> findByCriteria(Criterion... criterion); /** * 使用指定的检索标准检索数据,返回指定范围的记彿
* * @param criteria * @return */ public Integer getRowCount(DetachedCriteria criteria); /** * 使用指定的检索标准检索数据,返回指定统计倿 * * @param criteria * @param propertyName * @param StatName * (max,min,avg,sum) * @return */ public Object getStatValue(DetachedCriteria criteria,
String propertyName, String StatName); /** * 通过给定的一个对象,查找与其匹配的对象,表关联比较多时,用户可以自己根据霿要扩展? * * @param entity * @return List<T> */ public List<T> findByExample(T entity); /*************************************************************************** * -------------------------Others
----------------------------------------* **************************************************************************/ /** * 加锁指定的实使 * * @param entity * @param lockMode */ public void lock(T entity, LockMode lockMode); /** * 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新) */
public void flush(); /** * 清空缓存 * * void */ public void clear(); /*************************************************************************** * --------------------------------相关知识炿--------------------------------* * * 1、Session的load方法和get方法都是通过给定的ID从数据库中加载一个持久化的对象?但两个斿*
* 法的区别在于:当数据库不存在于ID对应的记录时,load()方法抛出异常,迌get()方法返回null* ***************************************************************************/ }
设计完接口,我们就要实现我们创建的接口,我们如果使用Hibernate,那么就做一个hibernate的实现,如果使用JPA,那么就做一个JPA实现。以下采用hibernate进行实现。
通用Hibernate DAO实现:
view plainprint?
1. package com.baiyyy.util.dao;
2.
3. /**
4. * @filename:BaseHibernateDAO.java
5. */
6.
7. import java.io.Serializable;
8. import java.util.Collection;
9. import java.util.Iterator;
10. import java.util.List;
11.
12. import org.hibernate.Criteria;
13. import org.hibernate.LockMode;
14. import org.hibernate.Query;
15. import org.hibernate.Session;
16. import org.hibernate.criterion.Criterion;
17. import org.hibernate.criterion.DetachedCriteria;
18. import org.hibernate.criterion.Example;
19. import org.hibernate.criterion.MatchMode;
20. import org.hibernate.criterion.Projections;
21.
22. import com.baiyyy.workflow.pojo.TWfPackage;
23.
24. /**
25. * 用Hibernate实现通用DAO接口
26. *
27. * @author yongtree
28. * @date 2008-3-10
29. * @param <T>
30. * @param <ID>
31. */
32. public class BaseHibernateDAO<T, ID extends Serializable> implements
33. IBaseDAO<T, ID> {
34. // 保持实体对象类的类型
35. private Class<T> persistentClass;
36.
37. private Session session;
38.
39. /**
40. * */
41. @SuppressWarnings("unchecked")
42. public BaseHibernateDAO() {
43. //下面这种方式丿直有错误,不能得到真正的T.class,迌是Object.class
44. // this.persistentClass=GenericsUtils.getSuperClassGenricType(getClass());
45. // System.out.println(obj.getClass().getName());
46. }
47.
48. @SuppressWarnings("unchecked")
49. public BaseHibernateDAO(Class clazz) {
50. this.persistentClass = clazz;
51. }
52.
53. /**
54. * @param session
55. * the session to set
56. */
57. public void setSession(Session session) {
58. this.session = session;
59. }
60.
61. /**
62. * 得到当前线程的Session对象的实便
63. *
64. * @return
65. */
66. protected Session getSession() {
67. System.out.println("get session");
68. return HibernateUtil.getCurrentSession();
69. }
70.
71. /**
72. * 得到持久化对象的类型
73. *
74. * @return 持久化类的类垿
75. */
76. protected Class<T> getPersistentClass() {
77. return persistentClass;
78. }
79.
80. @SuppressWarnings("unchecked")
81. public T findById(ID id, LockMode lock) {
82. // TODO Auto-generated method stub
83. T entity = (T) getSession().get(getPersistentClass(), id, lock);
84. if (entity != null) {
85. this.flush();
86. }
87.
88. return entity;
89. }
90.
91. @SuppressWarnings("unchecked")
92. public T findById(Class c, ID id) {
93. // TODO Auto-generated method stub
94. T entity;
95.
96. entity = (T) getSession().get(c, id);
97.
98. return entity;
99. }
100.
101. @SuppressWarnings("unchecked")
102. public T findById(ID id) {
103. // TODO Auto-generated method stub
104. T entity = (T) getSession().get(getPersistentClass(), id);
105.
106. return entity;
107. }
108.
109. @SuppressWarnings("unchecked")
110. public T loadById(ID id) {
111. // TODO Auto-generated method stub
112. T entity = (T) getSession().load(getPersistentClass(), id);
113. return entity;
114. }
115.
116. @SuppressWarnings("unchecked")
117. public T loadById(Class c, ID id) {
118. // TODO Auto-generated method stub
119. T entity = (T) getSession().load(c, id);
120. return entity;
121. }
122.
123. @SuppressWarnings("unchecked")
124. public T loadById(ID id, LockMode lock) {
125. // TODO Auto-generated method stub
126. T entity = (T) getSession().load(getPersistentClass(), id, lock);
127. return entity;
128. }
129.
130. @SuppressWarnings("unchecked")
131. public List<T> loadAll() {
132. List<T> list = getSession().createQuery(
133. "from " + getPersistentClass().getName()).list();
134. return list;
135. }
136.
137. public T saveEntity(T entity) {
138. // TODO Auto-generated method stub
139.
140. getSession().save(entity);
141. this.flush();
142. return entity;
143. }
144.
145. public void updateEntity(T entity) {
146. // TODO Auto-generated method stub
147. getSession().saveOrUpdate(entity);
148. this.flush();
149. }
150.
151. /**
152. * 该实现类暂时没有实现更新加锁的操使
153. */
154. public void updateEntity(T entity, LockMode lock) {
155. // TODO Auto-generated method stub
156. getSession().saveOrUpdate(entity);
157. this.flush();
158. }
159.
160. public void saveOrUpdateAll(Collection<T> entities) {
161. getSession().saveOrUpdate(entities);
162. this.flush();
163. }
164.
165. public void deleteEntity(T entity) {
166. // TODO Auto-generated method stub
167. getSession().delete(entity);
168. this.flush();
169. }
170.
171. /**
172. * 该实现没有实现加锁删除对象的操作,在spring的DAO实现中已经实玿
173. */
174. public void deleteEntity(T entity, LockMode lock) {
175. // TODO Auto-generated method stub
176. getSession().delete(entity);
177. this.flush();
178. }
179.
180. public void deleteEntityById(ID id) {
181. this.deleteEntity(this.loadById(id));
182. this.flush();
183. }
184.
185. // 该实现没有实现加锁的删除,在spring的dao中已经实现了
186. public void deleteEntityById(ID id, LockMode lock) {
187. this.deleteEntity(this.loadById(id));
188. this.flush();
189. }
190.
191. public void deleteAll(Collection<T> entities) {
192. this.flush();
193. getSession().delete(entities);
194. }
195.
196. public void merge(T entity){
197. getSession().merge(entity);
198. this.flush();
199. }
200.
201. @SuppressWarnings("unchecked")
202. public T getEntity(String hsql) {
203. T uniqueResult = (T) getSession().createQuery(hsql).uniqueResult();
204. // TODO Auto-generated method stub
205. return uniqueResult;
206. }
207.
208. @SuppressWarnings("unchecked")
209. public List<T> getEntities(String hsql) {
210. // TODO Auto-generated method stub
211.
212. List list = getSession().createQuery(hsql).list();
213. return list;
214. }
215.
216. @SuppressWarnings("unchecked")
217. public List<T> getEntities(String hql, int start, int number,
218. Object[] values) {
219. // TODO Auto-generated method stub
220. Query query = getSession().createQuery(hql);
221. for (int i = 0; i < values.length; i++) {
222. query.setParameter(i, values[i]);
223. }
224. query.setFirstResult(start);
225. query.setMaxResults(number);
226. List list = query.list();
227. return list;
228. }
229.
230. @SuppressWarnings("unchecked")
231. public List<T> getEntities(String hql, int start, int number) {
232. // TODO Auto-generated method stub
233. Query query = getSession().createQuery(hql);
234. query.setFirstResult(start);
235. query.setMaxResults(number);
236. List list = query.list();
237. return list;
238. }
239.
240. @SuppressWarnings("unchecked")
241. public List<T> getEntities(String hql, Object[] values) {
242. // TODO Auto-generated method stub
243. Query query = getSession().createQuery(hql);
244. for (int i = 0; i < values.length; i++) {
245. query.setParameter(i, values[i]);
246. }
247. return query.list();
248. }
249.
250. @SuppressWarnings("unchecked")
251. public List<T> findByNamedQuery(String queryName) {
252. // TODO Auto-generated method stub
253. return getSession().getNamedQuery(queryName).list();
254. }
255.
256. @SuppressWarnings("unchecked")
257. public List<T> findByNamedQuery(String queryName, Object[] values) {
258. // TODO Auto-generated method stub
259. Query query = getSession().getNamedQuery(queryName);
260. for (int i = 0; i < values.length; i++) {
261. query.setParameter(i, values);
262. }
263. return query.list();
264. }
265.
266. /**
267. * 注意:该方法是?过设置参数来进行命名查询,承以在传参数时,一定要注意paramNames和values的长度,位置要一丿对应?
268. */
269. @SuppressWarnings("unchecked")
270. public List<T> findByNamedQuery(String queryName, String[] paramNames,
271. Object[] values) {
272. // TODO Auto-generated method stub
273. Query query = getSession().getNamedQuery(queryName);
274. for (int i = 0; i < paramNames.length; i++) {
275. query.setParameter(paramNames[i], values[i]);
276. }
277. return query.list();
278. }
279.
280. @SuppressWarnings("unchecked")
281. public Iterator<T> iterate(String hql) {
282. // TODO Auto-generated method stub
283. return getSession().createQuery(hql).iterate();
284. }
285.
286. @SuppressWarnings("unchecked")
287. public Iterator<T> iterate(String hql, Object[] values) {
288. // TODO Auto-generated method stub
289. Query query = getSession().createQuery(hql);
290. for (int i = 0; i < values.length; i++) {
291. query.setParameter(i, values[i]);
292. }
293. return query.iterate();
294. }
295.
296. public DetachedCriteria createDetachedCriteria() {
297. // TODO Auto-generated method stub
298. return DetachedCriteria.forClass(this.persistentClass);
299. }
300.
301. public Criteria createCriteria() {
302. // TODO Auto-generated method stub
303. return this.createDetachedCriteria().getExecutableCriteria(
304. this.getSession());
305. }
306.
307. /**
308. * 该方法没有经过验证,不能保证正确,在spring的实现中已经实现亿
309. */
310. @SuppressWarnings("unchecked")
311. public List<T> findByCriteria(DetachedCriteria criteria) {
312. // TODO Auto-generated method stub
313. return criteria.getExecutableCriteria(this.getSession()).list();
314. }
315.
316. @SuppressWarnings("unchecked")
317. public List<T> findByCriteria(DetachedCriteria criteria, int firstResult,
318. int maxResults) {
319. // TODO Auto-generated method stub
320. return criteria.getExecutableCriteria(this.getSession())
321. .setFirstResult(firstResult).setMaxResults(maxResults).list();
322.
323. }
324.
325. /**
326. * 动濁查诿
327. *
328. * @param criterion
329. * @return
330. */
331. public @SuppressWarnings("unchecked")
332. List<T> findByCriteria(Criterion... criterion) {
333. Criteria crit = getSession().createCriteria(getPersistentClass());
334. for (Criterion c : criterion) {
335.
336. if (c != null) {
337.
338. crit.add(c);
339.
340. }
341. }
342. List list = crit.list();
343. return list;
344. }
345.
346. @SuppressWarnings("unchecked")
347. public Integer getRowCount(DetachedCriteria criteria) {
348. // TODO Auto-generated method stub
349. criteria.setProjection(Projections.rowCount());
350. List list = this.findByCriteria(criteria, 0, 1);
351. return (Integer) list.get(0);
352.
353. }
354.
355. @SuppressWarnings("unchecked")
356. public Object getStatValue(DetachedCriteria criteria, String propertyName,
357. String StatName) {
358. // TODO Auto-generated method stub
359. if (StatName.toLowerCase().equals("max"))
360. criteria.setProjection(Projections.max(propertyName));
361. else if (StatName.toLowerCase().equals("min"))
362. criteria.setProjection(Projections.min(propertyName));
363. else if (StatName.toLowerCase().equals("avg"))
364. criteria.setProjection(Projections.avg(propertyName));
365. else if (StatName.toLowerCase().equals("sum"))
366. criteria.setProjection(Projections.sum(propertyName));
367. else
368. return null;
369. List list = this.findByCriteria(criteria, 0, 1);
370. return list.get(0);
371. }
372.
373. @SuppressWarnings("unchecked")
374. public List<T> findByExample(T exampleInstance) {
375. // TODO Auto-generated method stub
376. Criteria crit = getSession().createCriteria(getPersistentClass());
377. Example example = Example.create(exampleInstance);
378. example.ignoreCase().enableLike(MatchMode.ANYWHERE);// 忽略大小写,并进行模糊比辿
379. example.excludeZeroes();// 对于属濧中有数字类型的,如果exampleInstance的属性忼为0,就把它添加到查询中
380. crit.add(example);
381. return crit.list();
382.
383. }
384.
385. public void lock(T entity, LockMode lockMode) {
386. // TODO Auto-generated method stub
387. getSession().lock(entity, lockMode);
388. }
389.
390. public void flush() {
391. // TODO Auto-generated method stub
392. getSession().flush();
393. }
394.
395. public void clear() {
396. // TODO Auto-generated method stub
397. getSession().clear();
398. }
399.
400. }
在软件设计中我们开始对系统进行三层甚至是多层架构了,目的是职责更加的明确,功能更加的分离。而常常使用的三层架构就是将表现层、业务逻辑层和持久层进行分离,每一层关注点不同,职能更加的清晰。所以DAO的设计模式现在已经被我们所接受,下面就介绍一下泛型DAO的设计和实现。
这次的DAO例子是基于接口的.很多工具, 像Hibernate已经提供了数据库的便携访问,所以我们不是为持久层的轻便而设计接口. 然而, DAO接口在较为复杂的应用中更有意义, 当有几个持久化服务被封装到一个持久层的时候, 我想在很多情况下你应该直接使用Hibernate或者JPA, 而使用外加的DAO层最好的理由是为了实现更高的抽象化(例如:定义方法名findAll(String hql)而不是无数次地重复session.createQuery(...))
通用DAO接口:
view plainprint?
1. package com.baiyyy.util.dao;
2.
3. import java.io.Serializable;
4. import java.util.Collection;
5. import java.util.Iterator;
6. import java.util.List;
7.
8. import org.hibernate.Criteria;
9. import org.hibernate.LockMode;
10. import org.hibernate.criterion.Criterion;
11. import org.hibernate.criterion.DetachedCriteria;
12.
13. /**
14. * 承有业务数据的基础访问接口
15. * <p>
16. * 承有CRUD (创建,读取,修改和删陿)基本数据的操作在这个接口中都是独立的_ 并且承有的DAO都可以使用这些基本实玿
17. *
18. * @author yongtree
19. *
20. * @date:2008-03-04
21. */
22. public interface IBaseDAO<T, ID extends Serializable> {
23.
24. /***************************************************************************
25. * -------------------基本棿索?增加?修改?删除操使---------------------------- *
26. **************************************************************************/
27.
28. // --------findById()方法是?过get(ID id)得到实体对象-----------------------
29. /**
30. * 通过ID来得到实体对豿
31. *
32. * @param id
33. * 实体对象的标识符
34. * @param lock
35. * 使用的锁模式
36. * @return 该主键忼对应的实体对象
37. */
38. public T findById(ID id, LockMode lock);
39.
40. /**
41. * 通过ID来得到实体对豿
42. *
43. * @param id
44. * @return T
45. */
46. public T findById(ID id);
47.
48. /**
49. * 通过ID来得到实体对豿(为兼容其他开发成员的原有程序,保留使甿)
50. *
51. * @param c
52. * @param id
53. * @return T
54. */
55. public T findById(Class c, ID id);
56.
57. // -------------loadById()是调用hibernate的load方法------------
58.
59. public T loadById(ID id);
60.
61. /**
62. * 通过id load对象
63. *
64. * @param id
65. * @param lock
66. * @return
67. */
68. public T loadById(ID id, LockMode lock);
69.
70. /**
71. * 获取全部的实使
72. *
73. * @return
74. */
75. public List<T> loadAll();
76.
77. /**
78. * 保存丿个实体对豿
79. *
80. * @param entity
81. */
82. public T saveEntity(T entity);
83.
84. /**
85. * 更新丿个实体对豿
86. *
87. * @param entity
88. */
89. public void updateEntity(T entity);
90.
91. public void updateEntity(T entity, LockMode lock);
92.
93. /**
94. * 增加或更新集合中的全部实使
95. *
96. * @param entities
97. */
98. public void saveOrUpdateAll(Collection<T> entities);
99.
100. /**
101. * 删除丿个实使
102. *
103. * @param entity
104. * @throws Exception
105. */
106. public void deleteEntity(T entity);
107.
108. public void deleteEntity(T entity, LockMode lock);
109.
110. /**
111. * 根据主键删除指定实体
112. *
113. * @param id
114. */
115. public void deleteEntityById(ID id);
116.
117. public void deleteEntityById(ID id, LockMode lock);
118.
119. /**
120. * 批量删除
121. *
122. * @param entities
123. */
124. public void deleteAll(Collection<T> entities);
125.
126. /**
127. * 通过合并的方式更新对豿
128. *
129. * @param entity
130. * void
131. */
132. public void merge(T entity);
133.
134. /***************************************************************************
135. * ------------------------------使用HQL语句-------------------------------- *
136. **************************************************************************/
137.
138. /**
139. * 使用HQL语句进行对象的查诿
140. *
141. * @param hsql
142. * 查询语句
143. * @return 符合条件的对豿
144. */
145.
146. public T getEntity(String hsql);
147.
148. /**
149. * 使用HQL语句进行查询
150. *
151. * @param hsql
152. * 查询语句
153. * @return 符合条件的对象集吿
154. */
155. public List<T> getEntities(String hsql);
156.
157. /**
158. * 使用带参数的HQL语句进行查询
159. *
160. * @param hsql
161. * @param obj
162. * @return
163. */
164. public List<T> getEntities(String hsql, Object[] values);
165.
166. public List<T> getEntities(String hql, int start, int number);
167.
168. public List<T> getEntities(String hql, int start, int number,
169. Object[] values);
170.
171. /**
172. * 使用命名的HQL语句棿索数捿
173. *
174. * @param queryName
175. * @return
176. */
177. public List<T> findByNamedQuery(String queryName);
178.
179. /**
180. * 使用带参数的命名HSQL语句棿索数捿
181. *
182. * @param queryName
183. * @param values
184. * @return
185. */
186. public List<T> findByNamedQuery(String queryName, Object[] values);
187.
188. /**
189. * 使用带命名参数的命名HSQL语句棿索数捿
190. *
191. * @param queryName
192. * @param paramNames
193. * @param values
194. * @return
195. */
196. public List<T> findByNamedQuery(String queryName, String[] paramNames,
197. Object[] values);
198.
199. /**
200. * 使用HQL语句棿索数据,返回 Iterator
201. *
202. * @param queryString
203. * @return
204. */
205. public Iterator<T> iterate(String queryString);
206.
207. /**
208. * 使用带参数HSQL语句棿索数据,返回 Iterator
209. *
210. * @param queryString
211. * @param values
212. * @return
213. */
214. public Iterator<T> iterate(String queryString, Object[] values);
215.
216. /***************************************************************************
217. * -----------------------------Criteria动濁查诿---------------------------- *
218. **************************************************************************/
219.
220. /**
221. * 创建与会话无关的棿索标准对豿
222. */
223. public DetachedCriteria createDetachedCriteria();
224.
225. /**
226. * 创建与会话绑定的棿索标准对豿
227. *
228. * @return
229. */
230. public Criteria createCriteria();
231.
232. /**
233. * 使用指定的检索标准检索数捿
234. *
235. * @param criteria
236. * @return
237. */
238. public List<T> findByCriteria(DetachedCriteria criteria);
239.
240. /**
241. * 使用指定的检索标准检索数据,返回部分记录
242. *
243. * @param criteria
244. * @param firstResult
245. * @param maxResults
246. * @return
247. */
248. public List<T> findByCriteria(DetachedCriteria criteria, int firstResult,
249. int maxResults);
250.
251. /**
252. * 通过动濁查询条件进行查诿
253. *
254. * @param criterion
255. * @return List<T>
256. */
257. @SuppressWarnings("unchecked")
258. public List<T> findByCriteria(Criterion... criterion);
259.
260. /**
261. * 使用指定的检索标准检索数据,返回指定范围的记彿
262. *
263. * @param criteria
264. * @return
265. */
266. public Integer getRowCount(DetachedCriteria criteria);
267.
268. /**
269. * 使用指定的检索标准检索数据,返回指定统计倿
270. *
271. * @param criteria
272. * @param propertyName
273. * @param StatName
274. * (max,min,avg,sum)
275. * @return
276. */
277. public Object getStatValue(DetachedCriteria criteria, String propertyName,
278. String StatName);
279.
280. /**
281. * 通过给定的一个对象,查找与其匹配的对象,表关联比较多时,用户可以自己根据霿要扩展?
282. *
283. * @param entity
284. * @return List<T>
285. */
286. public List<T> findByExample(T entity);
287.
288. /***************************************************************************
289. * -------------------------Others ----------------------------------------*
290. **************************************************************************/
291.
292. /**
293. * 加锁指定的实使
294. *
295. * @param entity
296. * @param lockMode
297. */
298. public void lock(T entity, LockMode lockMode);
299.
300. /**
301. * 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新)
302. */
303. public void flush();
304.
305. /**
306. * 清空缓存
307. *
308. * void
309. */
310. public void clear();
311.
312. /***************************************************************************
313. * --------------------------------相关知识炿--------------------------------*
314. *
315. * 1、Session的load方法和get方法都是通过给定的ID从数据库中加载一个持久化的对象?但两个斿*
316. * 法的区别在于:当数据库不存在于ID对应的记录时,load()方法抛出异常,迌get()方法返回null*
317. ***************************************************************************/
318.
319. }
package com.baiyyy.util.dao; import java.io.Serializable; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.hibernate.Criteria; import org.hibernate.LockMode; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.DetachedCriteria;
/** * 承有业务数据的基础访问接口 * <p> * 承有CRUD (创建,读取,修改和删陿)基本数据的操作在这个接口中都是独立的_ 并且承有的DAO都可以使用这些基本实玿 * * @author yongtree * * @date:2008-03-04 */ public interface IBaseDAO<T, ID extends Serializable> { /***************************************************************************
* -------------------基本棿索?增加?修改?删除操使---------------------------- * **************************************************************************/ // --------findById()方法是?过get(ID id)得到实体对象----------------------- /** * 通过ID来得到实体对豿 * * @param id * 实体对象的标识符 * @param
lock * 使用的锁模式 * @return 该主键忼对应的实体对象 */ public T findById(ID id, LockMode lock); /** * 通过ID来得到实体对豿 * * @param id * @return T */ public T findById(ID id); /** * 通过ID来得到实体对豿(为兼容其他开发成员的原有程序,保留使甿) * * @param c * @param id * @return T */ public T findById(Class
c, ID id); // -------------loadById()是调用hibernate的load方法------------ public T loadById(ID id); /** * 通过id load对象 * * @param id * @param lock * @return */ public T loadById(ID id, LockMode lock); /** * 获取全部的实使 * * @return */ public List<T> loadAll(); /** *
保存丿个实体对豿 * * @param entity */ public T saveEntity(T entity); /** * 更新丿个实体对豿 * * @param entity */ public void updateEntity(T entity); public void updateEntity(T entity, LockMode lock); /** * 增加或更新集合中的全部实使 * * @param entities */ public void saveOrUpdateAll(Collection<T>
entities); /** * 删除丿个实使 * * @param entity * @throws Exception */ public void deleteEntity(T entity); public void deleteEntity(T entity, LockMode lock); /** * 根据主键删除指定实体 * * @param id */ public void deleteEntityById(ID id); public void deleteEntityById(ID id,
LockMode lock); /** * 批量删除 * * @param entities */ public void deleteAll(Collection<T> entities); /** * 通过合并的方式更新对豿 * * @param entity * void */ public void merge(T entity); /*************************************************************************** * ------------------------------使用HQL语句--------------------------------
* **************************************************************************/ /** * 使用HQL语句进行对象的查诿 * * @param hsql * 查询语句 * @return 符合条件的对豿 */ public T getEntity(String hsql); /** * 使用HQL语句进行查询 * * @param hsql * 查询语句 * @return 符合条件的对象集吿 */ public List<T> getEntities(String
hsql); /** * 使用带参数的HQL语句进行查询 * * @param hsql * @param obj * @return */ public List<T> getEntities(String hsql, Object[] values); public List<T> getEntities(String hql, int start, int number); public List<T> getEntities(String hql, int start, int number, Object[]
values); /** * 使用命名的HQL语句棿索数捿 * * @param queryName * @return */ public List<T> findByNamedQuery(String queryName); /** * 使用带参数的命名HSQL语句棿索数捿 * * @param queryName * @param values * @return */ public List<T> findByNamedQuery(String queryName, Object[] values);
/** * 使用带命名参数的命名HSQL语句棿索数捿 * * @param queryName * @param paramNames * @param values * @return */ public List<T> findByNamedQuery(String queryName, String[] paramNames, Object[] values); /** * 使用HQL语句棿索数据,返回 Iterator * * @param queryString * @return */ public
Iterator<T> iterate(String queryString); /** * 使用带参数HSQL语句棿索数据,返回 Iterator * * @param queryString * @param values * @return */ public Iterator<T> iterate(String queryString, Object[] values); /***************************************************************************
* -----------------------------Criteria动濁查诿---------------------------- * **************************************************************************/ /** * 创建与会话无关的棿索标准对豿 */ public DetachedCriteria createDetachedCriteria(); /** * 创建与会话绑定的棿索标准对豿 * * @return
*/ public Criteria createCriteria(); /** * 使用指定的检索标准检索数捿 * * @param criteria * @return */ public List<T> findByCriteria(DetachedCriteria criteria); /** * 使用指定的检索标准检索数据,返回部分记录 * * @param criteria * @param firstResult * @param maxResults * @return */ public
List<T> findByCriteria(DetachedCriteria criteria, int firstResult, int maxResults); /** * 通过动濁查询条件进行查诿 * * @param criterion * @return List<T> */ @SuppressWarnings("unchecked") public List<T> findByCriteria(Criterion... criterion); /** * 使用指定的检索标准检索数据,返回指定范围的记彿
* * @param criteria * @return */ public Integer getRowCount(DetachedCriteria criteria); /** * 使用指定的检索标准检索数据,返回指定统计倿 * * @param criteria * @param propertyName * @param StatName * (max,min,avg,sum) * @return */ public Object getStatValue(DetachedCriteria criteria,
String propertyName, String StatName); /** * 通过给定的一个对象,查找与其匹配的对象,表关联比较多时,用户可以自己根据霿要扩展? * * @param entity * @return List<T> */ public List<T> findByExample(T entity); /*************************************************************************** * -------------------------Others
----------------------------------------* **************************************************************************/ /** * 加锁指定的实使 * * @param entity * @param lockMode */ public void lock(T entity, LockMode lockMode); /** * 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新) */
public void flush(); /** * 清空缓存 * * void */ public void clear(); /*************************************************************************** * --------------------------------相关知识炿--------------------------------* * * 1、Session的load方法和get方法都是通过给定的ID从数据库中加载一个持久化的对象?但两个斿*
* 法的区别在于:当数据库不存在于ID对应的记录时,load()方法抛出异常,迌get()方法返回null* ***************************************************************************/ }
设计完接口,我们就要实现我们创建的接口,我们如果使用Hibernate,那么就做一个hibernate的实现,如果使用JPA,那么就做一个JPA实现。以下采用hibernate进行实现。
通用Hibernate DAO实现:
view plainprint?
1. package com.baiyyy.util.dao;
2.
3. /**
4. * @filename:BaseHibernateDAO.java
5. */
6.
7. import java.io.Serializable;
8. import java.util.Collection;
9. import java.util.Iterator;
10. import java.util.List;
11.
12. import org.hibernate.Criteria;
13. import org.hibernate.LockMode;
14. import org.hibernate.Query;
15. import org.hibernate.Session;
16. import org.hibernate.criterion.Criterion;
17. import org.hibernate.criterion.DetachedCriteria;
18. import org.hibernate.criterion.Example;
19. import org.hibernate.criterion.MatchMode;
20. import org.hibernate.criterion.Projections;
21.
22. import com.baiyyy.workflow.pojo.TWfPackage;
23.
24. /**
25. * 用Hibernate实现通用DAO接口
26. *
27. * @author yongtree
28. * @date 2008-3-10
29. * @param <T>
30. * @param <ID>
31. */
32. public class BaseHibernateDAO<T, ID extends Serializable> implements
33. IBaseDAO<T, ID> {
34. // 保持实体对象类的类型
35. private Class<T> persistentClass;
36.
37. private Session session;
38.
39. /**
40. * */
41. @SuppressWarnings("unchecked")
42. public BaseHibernateDAO() {
43. //下面这种方式丿直有错误,不能得到真正的T.class,迌是Object.class
44. // this.persistentClass=GenericsUtils.getSuperClassGenricType(getClass());
45. // System.out.println(obj.getClass().getName());
46. }
47.
48. @SuppressWarnings("unchecked")
49. public BaseHibernateDAO(Class clazz) {
50. this.persistentClass = clazz;
51. }
52.
53. /**
54. * @param session
55. * the session to set
56. */
57. public void setSession(Session session) {
58. this.session = session;
59. }
60.
61. /**
62. * 得到当前线程的Session对象的实便
63. *
64. * @return
65. */
66. protected Session getSession() {
67. System.out.println("get session");
68. return HibernateUtil.getCurrentSession();
69. }
70.
71. /**
72. * 得到持久化对象的类型
73. *
74. * @return 持久化类的类垿
75. */
76. protected Class<T> getPersistentClass() {
77. return persistentClass;
78. }
79.
80. @SuppressWarnings("unchecked")
81. public T findById(ID id, LockMode lock) {
82. // TODO Auto-generated method stub
83. T entity = (T) getSession().get(getPersistentClass(), id, lock);
84. if (entity != null) {
85. this.flush();
86. }
87.
88. return entity;
89. }
90.
91. @SuppressWarnings("unchecked")
92. public T findById(Class c, ID id) {
93. // TODO Auto-generated method stub
94. T entity;
95.
96. entity = (T) getSession().get(c, id);
97.
98. return entity;
99. }
100.
101. @SuppressWarnings("unchecked")
102. public T findById(ID id) {
103. // TODO Auto-generated method stub
104. T entity = (T) getSession().get(getPersistentClass(), id);
105.
106. return entity;
107. }
108.
109. @SuppressWarnings("unchecked")
110. public T loadById(ID id) {
111. // TODO Auto-generated method stub
112. T entity = (T) getSession().load(getPersistentClass(), id);
113. return entity;
114. }
115.
116. @SuppressWarnings("unchecked")
117. public T loadById(Class c, ID id) {
118. // TODO Auto-generated method stub
119. T entity = (T) getSession().load(c, id);
120. return entity;
121. }
122.
123. @SuppressWarnings("unchecked")
124. public T loadById(ID id, LockMode lock) {
125. // TODO Auto-generated method stub
126. T entity = (T) getSession().load(getPersistentClass(), id, lock);
127. return entity;
128. }
129.
130. @SuppressWarnings("unchecked")
131. public List<T> loadAll() {
132. List<T> list = getSession().createQuery(
133. "from " + getPersistentClass().getName()).list();
134. return list;
135. }
136.
137. public T saveEntity(T entity) {
138. // TODO Auto-generated method stub
139.
140. getSession().save(entity);
141. this.flush();
142. return entity;
143. }
144.
145. public void updateEntity(T entity) {
146. // TODO Auto-generated method stub
147. getSession().saveOrUpdate(entity);
148. this.flush();
149. }
150.
151. /**
152. * 该实现类暂时没有实现更新加锁的操使
153. */
154. public void updateEntity(T entity, LockMode lock) {
155. // TODO Auto-generated method stub
156. getSession().saveOrUpdate(entity);
157. this.flush();
158. }
159.
160. public void saveOrUpdateAll(Collection<T> entities) {
161. getSession().saveOrUpdate(entities);
162. this.flush();
163. }
164.
165. public void deleteEntity(T entity) {
166. // TODO Auto-generated method stub
167. getSession().delete(entity);
168. this.flush();
169. }
170.
171. /**
172. * 该实现没有实现加锁删除对象的操作,在spring的DAO实现中已经实玿
173. */
174. public void deleteEntity(T entity, LockMode lock) {
175. // TODO Auto-generated method stub
176. getSession().delete(entity);
177. this.flush();
178. }
179.
180. public void deleteEntityById(ID id) {
181. this.deleteEntity(this.loadById(id));
182. this.flush();
183. }
184.
185. // 该实现没有实现加锁的删除,在spring的dao中已经实现了
186. public void deleteEntityById(ID id, LockMode lock) {
187. this.deleteEntity(this.loadById(id));
188. this.flush();
189. }
190.
191. public void deleteAll(Collection<T> entities) {
192. this.flush();
193. getSession().delete(entities);
194. }
195.
196. public void merge(T entity){
197. getSession().merge(entity);
198. this.flush();
199. }
200.
201. @SuppressWarnings("unchecked")
202. public T getEntity(String hsql) {
203. T uniqueResult = (T) getSession().createQuery(hsql).uniqueResult();
204. // TODO Auto-generated method stub
205. return uniqueResult;
206. }
207.
208. @SuppressWarnings("unchecked")
209. public List<T> getEntities(String hsql) {
210. // TODO Auto-generated method stub
211.
212. List list = getSession().createQuery(hsql).list();
213. return list;
214. }
215.
216. @SuppressWarnings("unchecked")
217. public List<T> getEntities(String hql, int start, int number,
218. Object[] values) {
219. // TODO Auto-generated method stub
220. Query query = getSession().createQuery(hql);
221. for (int i = 0; i < values.length; i++) {
222. query.setParameter(i, values[i]);
223. }
224. query.setFirstResult(start);
225. query.setMaxResults(number);
226. List list = query.list();
227. return list;
228. }
229.
230. @SuppressWarnings("unchecked")
231. public List<T> getEntities(String hql, int start, int number) {
232. // TODO Auto-generated method stub
233. Query query = getSession().createQuery(hql);
234. query.setFirstResult(start);
235. query.setMaxResults(number);
236. List list = query.list();
237. return list;
238. }
239.
240. @SuppressWarnings("unchecked")
241. public List<T> getEntities(String hql, Object[] values) {
242. // TODO Auto-generated method stub
243. Query query = getSession().createQuery(hql);
244. for (int i = 0; i < values.length; i++) {
245. query.setParameter(i, values[i]);
246. }
247. return query.list();
248. }
249.
250. @SuppressWarnings("unchecked")
251. public List<T> findByNamedQuery(String queryName) {
252. // TODO Auto-generated method stub
253. return getSession().getNamedQuery(queryName).list();
254. }
255.
256. @SuppressWarnings("unchecked")
257. public List<T> findByNamedQuery(String queryName, Object[] values) {
258. // TODO Auto-generated method stub
259. Query query = getSession().getNamedQuery(queryName);
260. for (int i = 0; i < values.length; i++) {
261. query.setParameter(i, values);
262. }
263. return query.list();
264. }
265.
266. /**
267. * 注意:该方法是?过设置参数来进行命名查询,承以在传参数时,一定要注意paramNames和values的长度,位置要一丿对应?
268. */
269. @SuppressWarnings("unchecked")
270. public List<T> findByNamedQuery(String queryName, String[] paramNames,
271. Object[] values) {
272. // TODO Auto-generated method stub
273. Query query = getSession().getNamedQuery(queryName);
274. for (int i = 0; i < paramNames.length; i++) {
275. query.setParameter(paramNames[i], values[i]);
276. }
277. return query.list();
278. }
279.
280. @SuppressWarnings("unchecked")
281. public Iterator<T> iterate(String hql) {
282. // TODO Auto-generated method stub
283. return getSession().createQuery(hql).iterate();
284. }
285.
286. @SuppressWarnings("unchecked")
287. public Iterator<T> iterate(String hql, Object[] values) {
288. // TODO Auto-generated method stub
289. Query query = getSession().createQuery(hql);
290. for (int i = 0; i < values.length; i++) {
291. query.setParameter(i, values[i]);
292. }
293. return query.iterate();
294. }
295.
296. public DetachedCriteria createDetachedCriteria() {
297. // TODO Auto-generated method stub
298. return DetachedCriteria.forClass(this.persistentClass);
299. }
300.
301. public Criteria createCriteria() {
302. // TODO Auto-generated method stub
303. return this.createDetachedCriteria().getExecutableCriteria(
304. this.getSession());
305. }
306.
307. /**
308. * 该方法没有经过验证,不能保证正确,在spring的实现中已经实现亿
309. */
310. @SuppressWarnings("unchecked")
311. public List<T> findByCriteria(DetachedCriteria criteria) {
312. // TODO Auto-generated method stub
313. return criteria.getExecutableCriteria(this.getSession()).list();
314. }
315.
316. @SuppressWarnings("unchecked")
317. public List<T> findByCriteria(DetachedCriteria criteria, int firstResult,
318. int maxResults) {
319. // TODO Auto-generated method stub
320. return criteria.getExecutableCriteria(this.getSession())
321. .setFirstResult(firstResult).setMaxResults(maxResults).list();
322.
323. }
324.
325. /**
326. * 动濁查诿
327. *
328. * @param criterion
329. * @return
330. */
331. public @SuppressWarnings("unchecked")
332. List<T> findByCriteria(Criterion... criterion) {
333. Criteria crit = getSession().createCriteria(getPersistentClass());
334. for (Criterion c : criterion) {
335.
336. if (c != null) {
337.
338. crit.add(c);
339.
340. }
341. }
342. List list = crit.list();
343. return list;
344. }
345.
346. @SuppressWarnings("unchecked")
347. public Integer getRowCount(DetachedCriteria criteria) {
348. // TODO Auto-generated method stub
349. criteria.setProjection(Projections.rowCount());
350. List list = this.findByCriteria(criteria, 0, 1);
351. return (Integer) list.get(0);
352.
353. }
354.
355. @SuppressWarnings("unchecked")
356. public Object getStatValue(DetachedCriteria criteria, String propertyName,
357. String StatName) {
358. // TODO Auto-generated method stub
359. if (StatName.toLowerCase().equals("max"))
360. criteria.setProjection(Projections.max(propertyName));
361. else if (StatName.toLowerCase().equals("min"))
362. criteria.setProjection(Projections.min(propertyName));
363. else if (StatName.toLowerCase().equals("avg"))
364. criteria.setProjection(Projections.avg(propertyName));
365. else if (StatName.toLowerCase().equals("sum"))
366. criteria.setProjection(Projections.sum(propertyName));
367. else
368. return null;
369. List list = this.findByCriteria(criteria, 0, 1);
370. return list.get(0);
371. }
372.
373. @SuppressWarnings("unchecked")
374. public List<T> findByExample(T exampleInstance) {
375. // TODO Auto-generated method stub
376. Criteria crit = getSession().createCriteria(getPersistentClass());
377. Example example = Example.create(exampleInstance);
378. example.ignoreCase().enableLike(MatchMode.ANYWHERE);// 忽略大小写,并进行模糊比辿
379. example.excludeZeroes();// 对于属濧中有数字类型的,如果exampleInstance的属性忼为0,就把它添加到查询中
380. crit.add(example);
381. return crit.list();
382.
383. }
384.
385. public void lock(T entity, LockMode lockMode) {
386. // TODO Auto-generated method stub
387. getSession().lock(entity, lockMode);
388. }
389.
390. public void flush() {
391. // TODO Auto-generated method stub
392. getSession().flush();
393. }
394.
395. public void clear() {
396. // TODO Auto-generated method stub
397. getSession().clear();
398. }
399.
400. }
相关文章推荐
- 基于泛型DAO的Facade设计模式. - Hibernate - Java
- Hibernate泛型DAO设计
- 不要重复 DAO! 使用 Hibernate 和 Spring AOP 构建泛型类型安全的 DAO
- hibernate 泛型 DAO
- 一个通用的泛型GenericHibernateDAO
- 基于泛型的通用Dao接口和hibernate的实现
- Hibernate也须要呵护——Hibernate的泛型DAO
- 泛型和DAO设计
- 详细介绍 Hibernate 泛型 DAO 及其使用方法
- 一个通用的泛型 GenericHibernateDao
- <<项目架构那点儿事>>——hibernate泛型Dao,让持久层简洁起来 ...
- mybatis泛型DAO接口的设计
- 基于泛型的通用Dao接口和hibernate的实现
- 基于泛型DAO的设计模式
- Hibernate中应用dao设计模式进行数据库的增删改查操作
- JPA的泛型DAO设计及使用
- 改进版的hibernate泛型dao(依赖spring)
- 泛型Dao-减少重复的Dao代码,用Hibernate实现
- 基于泛型DAO的Facade设计模式.
- 一个泛型Hibernate DAO实现