首页 > 技术文章 > java Hibernate 用法

hehongtao 2016-04-13 21:53 原文

Hibernate 用法总结:

  1 import java.io.Serializable;
  2 import java.sql.SQLException;
  3 import java.util.Collection;
  4 import java.util.Iterator;
  5 import java.util.List;
  6 import java.util.Map;
  7 
  8 import org.apache.commons.logging.Log;
  9 import org.apache.commons.logging.LogFactory;
 10 import org.hibernate.FlushMode;
 11 import org.hibernate.HibernateException;
 12 import org.hibernate.Query;
 13 import org.hibernate.SQLQuery;
 14 import org.hibernate.Session;
 15 import org.hibernate.type.Type;
 16 import org.springframework.orm.hibernate3.HibernateCallback;
 17 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 18 
 19 import com.krm.dao.DAO;
 20 
 21 /**
 22  * @Title:
 23  *
 24  * @Description: HibernateTemplate是Spring框架接管hibernate的提供方法集合
 25  *
 26  * @Copyright: Copyright (c) 2015
 27  *
 28  * @author HHT
 29  */
 30 public class BaseDAOHibernate extends HibernateDaoSupport implements DAO {
 31 
 32     protected final Log log = LogFactory.getLog(getClass());
 33     
 34     // ---------------------------------------------- VO操作-------------------------------------------- //
 35     
 36     /**
 37      * 按主键查询,返回唯一结果
 38      * 
 39      * @param clazz
 40      *            DTO.class返回值的类
 41      * @param id
 42      *            主键(Long型就可以)
 43      * @return 查询结果
 44      */
 45     public Object getObject(Class clazz, Serializable id) {
 46         return getHibernateTemplate().get(clazz, id); // get
 47     }
 48     
 49     /**
 50      * 取得查询结果,返回所有结果
 51      * 
 52      * @param clazz
 53      *            DTO.class返回值的类
 54      * @return 查询结果列表
 55      */
 56     public List getObjects(Class clazz) {
 57         return getHibernateTemplate().loadAll(clazz); // load
 58     }
 59 
 60     /**
 61      * 删除数据,按住键删除
 62      * 
 63      * @param clazz
 64      *            DTO.class返回值的类
 65      * @param id
 66      *            主键(Long型就可以)
 67      * @return
 68      */
 69     public void removeObject(Class clazz, Serializable id) {
 70         getHibernateTemplate().delete(getObject(clazz, id)); // delete
 71     }
 72 
 73     /**
 74      * 删除数据
 75      * 
 76      * @param o
 77      *            VO实体类
 78      * @return
 79      */
 80     public void removeObject(Object o) {
 81         getHibernateTemplate().delete(o); // delete
 82     }
 83 
 84     /**
 85      * 更新或插入数据
 86      * 
 87      * @param o
 88      *            VO实体类
 89      * @return
 90      */
 91     public void saveObject(Object o) {
 92         getHibernateTemplate().saveOrUpdate(o); // saveOrUpdate
 93         getHibernateTemplate().flush();
 94     }
 95 
 96     /**
 97      * 经过检索操作,更新或插入数据
 98      * 
 99      * @param o
100      *            VO实体类
101      * @return
102      */
103     public void saveObjectAfterFind(final Object o) {
104         getHibernateTemplate().execute(new HibernateCallback() {  // execute
105             public Object doInHibernate(Session session) throws HibernateException,
106                     SQLException {
107                 session.saveOrUpdate(o);
108                 session.setFlushMode(FlushMode.COMMIT);
109                 session.flush();
110                 return null;
111             }
112         });
113     }
114 
115     /**
116      * 批量更新或插入数据
117      * 
118      * @param objectList
119      *            VO实体类
120      * @return 查询结果列表
121      */
122     public void batchSaveOrUpdateVO(final List objectList) {
123         HibernateCallback callback = new HibernateCallback() {
124             public Object doInHibernate(Session session) throws HibernateException,
125                     SQLException {
126                 int i = 0;
127                 for (Iterator it = objectList.iterator(); it.hasNext();) {
128                     session.saveOrUpdate(it.next());
129                     if (i % 20 == 0) {
130                         session.flush();
131                         session.clear();
132                     }
133                     i++;
134                 }
135                 session.flush();
136                 session.clear();
137                 return null;
138             }
139         };
140         getHibernateTemplate().execute(callback); // execute
141     }
142 
143 
144     // ---------------------------------------------- SQL,HQL语句-------------------------------------------- //
145     
146     /**
147      * 执行简单的HQL查询,返回多件结果
148      * 
149      * @param hql
150      *            HQL查询语句
151      * @return 查询结果列表
152      */
153     protected List list(String hql) {
154         return getHibernateTemplate().find(hql); // find
155     }
156 
157     /**
158      * 执行带参数的HQL查询,返回多件结果
159      * 
160      * @param hql
161      *            HQL查询语句
162      * @param values
163      *            HQL语句数组类型的参数
164      * @return 查询结果列表
165      */
166     // String hql = "SELECT * FROM table WHERE entityId=? AND entityKind=? AND status=1 ORDER BY dispOrder";
167     // list(hql, new Object[]{entityId, accessoryType});
168     protected List list(String hql, Object[] values) {
169         return getHibernateTemplate().find(hql, values); // find
170     }    
171 
172     /**
173      * 执行带参数的HQL查询,返回多件结果
174      * 
175      * @param hql
176      *            HQL查询语句
177      * @param parameters
178      *            HQL语句Map类型的参数
179      * @return 查询结果列表
180      */
181     // String hql = "from ImportRule t where t.report_type=:type and t.reportid=:reportid";
182     // Map map = new HashMap();
183     // map.put("type",report_type);
184     // map.put("reportid",reportid);
185     // list(hql,map);
186     protected List list(final String hql, final Map parameters) {
187         HibernateCallback callback = new HibernateCallback() {
188             public Object doInHibernate(Session session) throws HibernateException,
189                     SQLException {
190                 Query query = session.createQuery(hql);
191                 setQueryParameters(query, parameters);
192                 return query.list();
193             }
194         };
195         return (List) getHibernateTemplate().execute(callback); // execute
196     }
197 
198     // 方法重载
199     // Object[][] scalaries = {{"money", Hibernate.DOUBLE}};
200     // List list = list(sql, null, scalaries);
201     protected List list(String sql, Object[][] entities, Object[][] scalaries) {
202         return list(sql, entities, scalaries, null);
203     }
204 
205     // 方法重载
206     protected List list(String sql, Object[][] entities, Object[][] scalaries, int maxResults) {
207         return list(sql, entities, scalaries, null, maxResults);
208     }
209     
210     // 方法重载
211     // String sql = "SELECT {u.*} " + "FROM table u WHERE  u.status = '1'  AND u.loginname=? AND u.password = ?" ;
212     // list(sql, new Object[][]{{"u", User.class}}, null, new Object[]{loginName, passWord});
213     //------------------上种方法必须配置VO实体类表映射xml文件 下面则不用--------------------------------------------------
214     // String sql = "SELECT rdf.PKID AS PKID,rdf.ORGAN_ID AS ORGAN_ID FROM table rdf WHERE rdf.report_id = ?  AND rdf.report_date = ? AND rdf.organ_id ='"+organId +"'";
215     // Object[][] scalaries = {{"PKID", Hibernate.LONG}, {"ORGAN_ID", Hibernate.STRING}};
216     // List result = list(sql, null, scalaries, new Object[]{reportId, reportDate});
217     // ------------------下面的方法结果解析麻烦-----------------------------
218     // for (Iterator it = result.iterator(); it.hasNext();)
219     // {
220     //         Object[] oa = (Object[])it.next();
221     //         (Long)oa[0];
222     //         (String)oa[1];
223     // }
224     protected List list(String sql, Object[][] entities, Object[][] scalaries, Object[] values) {
225         return list(sql, entities, scalaries, values, 0);
226     }
227 
228     // 方法重载
229     protected List list(String sql, Object[][] entities, Object[][] scalaries, Object[] values, int maxResults) {
230         return list(sql, entities, scalaries, values, 0, maxResults);
231     }
232 
233     // 方法重载
234     protected List page(String sql, Object[][] entities, Object[][] scalaries, Object[] values, int pageNo, int pageSize) {
235         return list(sql, entities, scalaries, values, (pageNo - 1) * pageSize, pageSize);
236     }
237 
238     /**
239      * 执行HQL或SQL的带分页功能的查询(数据量大时,分页有效率问题),返回多件结果
240      * 
241      * @param sql
242      *            HQL或者SQL查询语句
243      * @param entities
244      *            表别名和映射BEAN的类型
245      * @param scalaries
246      *                SQL列类型映射
247      * @param values
248      *            参数列表,替换语句中的?参数
249      * @param firstResult
250      *            分页参数 起始位置
251      * @param maxResults
252      *            分页参数 最大上限
253      * @return list 查询结果集
254      */
255     protected List list(final String sql, final Object[][] entities,
256             final Object[][] scalaries, final Object[] values, final int firstResult,
257             final int maxResults) {
258         try {
259             HibernateCallback callback = new HibernateCallback() {
260                 public Object doInHibernate(Session session) throws HibernateException,
261                         SQLException {
262                     // Query query = session.createQuery(sql);
263                     // Query只能执行HQL语句,但是以Hibernate生成的Bean为对象装入List返回
264                     // SQLQuery 可以执行原生SQL语句,以对象数组返回,可以用addEntity()方法指定映射Bean
265                     SQLQuery query = session.createSQLQuery(sql);
266                     // 追加结果映射的BEAN
267                     if (entities != null) {
268                         for (int i = 0; i < entities.length; i++) {
269                             query.addEntity(entities[i][0].toString(),
270                                     (Class) entities[i][1]);
271                         }
272                     }
273                     //
274                     if (scalaries != null) {
275                         for (int i = 0; i < scalaries.length; i++) {
276                             query.addScalar(scalaries[i][0].toString(), (Type) scalaries[i][1]);
277                         }
278                     }
279                     // 设置查询参数
280                     setQueryParameters(query, values);
281                     // 分页起始位置
282                     if (firstResult > 0) {
283                         query.setFirstResult(firstResult);
284                     }
285                     // 分页上位置
286                     if (maxResults > 0) {
287                         query.setMaxResults(maxResults);
288                     }
289                     return query.list();
290                 }
291             };
292             return (List) getHibernateTemplate().execute(callback); // execute
293         } catch (Exception e) {
294             // log.error(" BaseDAOHIBERNATE list is error" + e.getMessage());
295             return null;
296         }
297     }
298 
299     /**
300      * 执行HQL查询,返回唯一结果
301      * 
302      * @param hql
303      *            HQL查询语句
304      * @return 查询结果对象
305      */
306     protected Object uniqueResult(final String hql) {
307         HibernateCallback callback = new HibernateCallback() {
308             public Object doInHibernate(Session session) throws HibernateException,
309                     SQLException {
310                 return session.createQuery(hql).uniqueResult();
311             }
312         };
313         return getHibernateTemplate().execute(callback); // execute
314     }
315 
316     /**
317      * 执行HQL查询,返回唯一结果
318      * 
319      * @param hql
320      *            HQL查询语句
321      * @param parameters
322      *            HQL语句Map类型的参数
323      * @return 查询结果对象
324      */
325     protected Object uniqueResult(final String hql, final Map parameters) {
326         HibernateCallback callback = new HibernateCallback() {
327             public Object doInHibernate(Session session) throws HibernateException,
328                     SQLException {
329                 Query query = session.createQuery(hql);
330                 setQueryParameters(query, parameters);
331                 return query.uniqueResult();
332             }
333         };
334         return getHibernateTemplate().execute(callback); // execute
335     }
336 
337     /**
338      * 执行HQL查询,返回唯一结果
339      * 
340      * @param hql
341      *            HQL查询语句
342      * @param values
343      *            HQL语句数组类型的参数
344      * @return 查询结果对象
345      */
346     protected Object uniqueResult(final String hql, final Object[] values) {
347         HibernateCallback callback = new HibernateCallback() {
348             public Object doInHibernate(Session session) throws HibernateException,
349                     SQLException {
350                 Query query = session.createQuery(hql);
351                 setQueryParameters(query, values);
352                 return query.uniqueResult();
353             }
354         };
355         return getHibernateTemplate().execute(callback); // execute
356     }
357 
358     private void setQueryParameters(Query query, Object[] values) {
359         if (values != null) {
360             for (int i = 0; i < values.length; i++) {
361                 query.setParameter(i, values[i]);
362             }
363         }
364     }
365 
366     private void setQueryParameters(Query query, Map parameters) {
367         if (parameters != null) {
368             for (Iterator it = parameters.entrySet().iterator(); it.hasNext();) {
369                 Map.Entry entry = (Map.Entry) it.next();
370                 String paramName = (String) entry.getKey();
371                 Object paramValue = entry.getValue();
372                 if (paramValue instanceof Collection) {
373                     query.setParameterList(paramName, (Collection) paramValue);
374                 } else if (paramValue instanceof Object[]) {
375                     query.setParameterList(paramName, (Object[]) paramValue);
376                 } else {
377                     query.setParameter(paramName, paramValue);
378                 }
379             }
380         }
381     }
382     
383     /**
384      * 更新,删除或插入数据
385      * 
386      * @param sql
387      *            HQL或者SQL查询语句
388      * @return boolean 是否有影响的记录
389      */
390     public boolean save(final String sql) {
391         Integer result = (Integer) getHibernateTemplate().execute( // execute
392                 new HibernateCallback() {
393                     public Object doInHibernate(Session session) throws HibernateException,
394                             SQLException {
395                         Query query = session.createQuery(sql);
396                         int rowCount = query.executeUpdate();
397                         session.flush();
398                         return rowCount;
399                     }
400                 });
401         if (result > 0) {
402             return true;
403         } else {
404             return false;
405         }
406     }
407 }

 

推荐阅读