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 }