<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    【永恒的瞬間】
    ?Give me hapy ?
    說明:這里的代碼是我參考了springside的源代碼后作了一些比較小的改動,這里沒有給出完整的例子,只是討論一下核心的代碼)
    這里想說的代碼主要是泛型DAO層的應用與分頁的寫法.

    分頁,采用了hibernate的一些API來分頁,這里同時采用了兩種分頁方式,CriteriaPage分頁方式,適用于多表單時查詢后分頁用的,而第二種方式是采用Hql語句查詢后分頁的.代碼如下:

    CriteriaPage.java文件:
    1. package?org.mmc.commons; ??
    2. ??
    3. import?java.util.ArrayList; ??
    4. import?java.util.List; ??
    5. ??
    6. import?org.hibernate.Criteria; ??
    7. import?org.hibernate.criterion.CriteriaSpecification; ??
    8. import?org.hibernate.criterion.Projection; ??
    9. import?org.hibernate.criterion.Projections; ??
    10. import?org.hibernate.impl.CriteriaImpl; ??
    11. import?org.hibernate.impl.CriteriaImpl.OrderEntry; ??
    12. import?org.mmc.utils.BeanUtils; ??
    13. ??
    14. /** ?
    15. ?*?使用Hql查詢的的分頁查詢類. ?
    16. ?*?支持執行Count查詢取得總記錄條數 ?
    17. ?*?本類參考了springside項目的分頁設計 ?
    18. ?*/??
    19. public?class?CriteriaPage?{ ??
    20. ??
    21. ????/** ?
    22. ?????*?得到一個PageInstance實例,. ?
    23. ?????*/??
    24. ????public?static?Page?getPageInstance(Criteria?criteria,?int?pageNo,?int?pageSize)?{ ??
    25. ??????? ??
    26. ????????????return?CriteriaPage.getPageInstanceByCount(criteria,?pageNo,?pageSize); ??
    27. ????} ??
    28. ??
    29. ????/** ?
    30. ?????*?以查詢Count的形式獲取totalCount的函數 ?
    31. ?????*/??
    32. ????protected?static?Page?getPageInstanceByCount(Criteria?criteria,?int?pageNo,?int?pageSize)?{ ??
    33. ????????CriteriaImpl?impl?=?(CriteriaImpl)?criteria; ??
    34. ??
    35. ????????//先把Projection和OrderBy條件取出來,清空兩者來執行Count操作 ??
    36. ????????Projection?projection?=?impl.getProjection(); ??
    37. ????????List?orderEntries; ??
    38. ????????try?{ ??
    39. ????????????orderEntries?=?(List)?BeanUtils.getPrivateProperty(impl,?"orderEntries"); ??
    40. ????????????BeanUtils.setPrivateProperty(impl,?"orderEntries",?new?ArrayList()); ??
    41. ????????} ??
    42. ????????catch?(Exception?e)?{ ??
    43. ????????????throw?new?InternalError("?Runtime?Exception?impossibility?throw?"); ??
    44. ????????} ??
    45. ??
    46. ????????//執行查詢 ??
    47. ????????int?totalCount?=?(Integer)?criteria.setProjection(Projections.rowCount()).uniqueResult(); ??
    48. ??
    49. ????????//將之前的Projection和OrderBy條件重新設回去 ??
    50. ????????criteria.setProjection(projection); ??
    51. ????????if?(projection?==?null)?{ ??
    52. ????????????criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); ??
    53. ????????} ??
    54. ??
    55. ????????try?{ ??
    56. ????????????BeanUtils.setPrivateProperty(impl,?"orderEntries",?orderEntries); ??
    57. ????????}?catch?(Exception?e)?{ ??
    58. ????????????throw?new?InternalError("?Runtime?Exception?impossibility?throw?"); ??
    59. ????????} ??
    60. ??
    61. ????????return?getPageResult(criteria,?totalCount,?pageNo,?pageSize); ??
    62. ????} ??
    63. ???? ??
    64. ????/** ?
    65. ?????*?取得totalCount后,根據pageNo和PageSize,?執行criteria的分頁查詢,取得Page變量 ?
    66. ?????*/??
    67. ????private?static?Page?getPageResult(Criteria?criteria,?int?totalCount,?int?pageNo,?int?pageSize)?{ ??
    68. ????????if?(totalCount?<?1)?return?new?Page(); ??
    69. ??
    70. ????????int?startIndex?=?Page.getStartOfPage(pageNo,?pageSize); ??
    71. ????????List?list?=?criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); ??
    72. ??
    73. ????????return?new?Page(startIndex,?totalCount,?pageSize,?list); ??
    74. ????} ??
    75. ??
    76. } ??
    77. ??


    HqlPage.java文件的代碼


    Page.java文件的源代碼如下:
    1. package?org.mmc.commons; ??
    2. ??
    3. import?java.util.ArrayList; ??
    4. ??
    5. /** ?
    6. ?*?分頁對象.?包含數據及分頁信息. ?
    7. ?*? ?
    8. ?*?@author?lighter?天馬行空 ?
    9. ?*/??
    10. public?class?Page?implements?java.io.Serializable?{ ??
    11. ?/** ?
    12. ??*?當前頁第一條數據的位置,從0開始 ?
    13. ??*/??
    14. ?private?int?start; ??
    15. ??
    16. ?/** ?
    17. ??*?每頁的記錄數 ?
    18. ??*/??
    19. ?private?int?pageSize?=?Constants.DEFAULT_PAGE_SIZE; ??
    20. ??
    21. ?/** ?
    22. ??*?當前頁中存放的記錄 ?
    23. ??*/??
    24. ?private?Object?data; ??
    25. ??
    26. ?/** ?
    27. ??*?總記錄數 ?
    28. ??*/??
    29. ?private?int?totalCount; ??
    30. ??
    31. ?/** ?
    32. ??*?構造方法,只構造空頁 ?
    33. ??*/??
    34. ?public?Page()?{ ??
    35. ??this(0,?0,?Constants.DEFAULT_PAGE_SIZE,?new?ArrayList()); ??
    36. ?} ??
    37. ??
    38. ?/** ?
    39. ??*?默認構造方法 ?
    40. ??*? ?
    41. ??*?@param?start ?
    42. ??*????????????本頁數據在數據庫中的起始位置 ?
    43. ??*?@param?totalSize ?
    44. ??*????????????數據庫中總記錄條數 ?
    45. ??*?@param?pageSize ?
    46. ??*????????????本頁容量 ?
    47. ??*?@param?data ?
    48. ??*????????????本頁包含的數據 ?
    49. ??*/??
    50. ?public?Page(int?start,?int?totalSize,?int?pageSize,?Object?data)?{ ??
    51. ??this.pageSize?=?pageSize; ??
    52. ??this.start?=?start; ??
    53. ??this.totalCount?=?totalSize; ??
    54. ??this.data?=?data; ??
    55. ?} ??
    56. ??
    57. ?/** ?
    58. ??*?取數據庫中包含的總記錄數 ?
    59. ??*/??
    60. ?public?int?getTotalCount()?{ ??
    61. ??return?this.totalCount; ??
    62. ?} ??
    63. ??
    64. ?/** ?
    65. ??*?取總頁數 ?
    66. ??*/??
    67. ?public?int?getTotalPageCount()?{ ??
    68. ??if?(totalCount?%?pageSize?==?0) ??
    69. ???return?totalCount?/?pageSize; ??
    70. ??else??
    71. ???return?totalCount?/?pageSize?+?1; ??
    72. ?} ??
    73. ??
    74. ?/** ?
    75. ??*?取每頁數據容量 ?
    76. ??*/??
    77. ?public?int?getPageSize()?{ ??
    78. ??return?pageSize; ??
    79. ?} ??
    80. ??
    81. ?/** ?
    82. ??*?當前頁中的記錄 ?
    83. ??*/??
    84. ?public?Object?getResult()?{ ??
    85. ??return?data; ??
    86. ?} ??
    87. ??
    88. ?/** ?
    89. ??*?取當前頁碼,頁碼從1開始 ?
    90. ??*/??
    91. ?public?int?getCurrentPageNo()?{ ??
    92. ??return?(start?/?pageSize)?+?1; ??
    93. ?} ??
    94. ??
    95. ?/** ?
    96. ??*?是否有下一頁 ?
    97. ??*/??
    98. ?public?boolean?hasNextPage()?{ ??
    99. ??return?(this.getCurrentPageNo()?<?this.getTotalPageCount()?-?1); ??
    100. ?} ??
    101. ??
    102. ?/** ?
    103. ??*?是否有上一頁 ?
    104. ??*/??
    105. ?public?boolean?hasPreviousPage()?{ ??
    106. ??return?(this.getCurrentPageNo()?>?1); ??
    107. ?} ??
    108. ??
    109. ?/** ?
    110. ??*?獲取任一頁第一條數據的位置,每頁條數使用默認值 ?
    111. ??*?關鍵字設為pretected ?
    112. ??*/??
    113. ?protected?static?int?getStartOfPage(int?pageNo)?{ ??
    114. ??return?getStartOfPage(pageNo,?Constants.DEFAULT_PAGE_SIZE); ??
    115. ?} ??
    116. ??
    117. ?/** ?
    118. ??*?獲取任一頁第一條數據的位置,startIndex從0開始 ?
    119. ??*?關鍵字設為pretected ?
    120. ??*/??
    121. ?protected?static?int?getStartOfPage(int?pageNo,?int?pageSize)?{ ??
    122. ??return?(pageNo?-?1)?*?pageSize; ??
    123. ?} ??
    124. } ??
    125. ??


    分頁的改造已經完成,現在重構一下DAO層的寫法,利用了spring對hibernate支持的一些的API.
    DAO層:
    AbstractHibernateDao.java的源代碼
    1. package?org.mmc.dao; ??
    2. ??
    3. import?org.apache.commons.beanutils.PropertyUtils; ??
    4. import?org.apache.commons.lang.StringUtils; ??
    5. import?org.apache.commons.logging.Log; ??
    6. import?org.apache.commons.logging.LogFactory; ??
    7. import?org.hibernate.Criteria; ??
    8. import?org.hibernate.criterion.MatchMode; ??
    9. import?org.hibernate.criterion.Order; ??
    10. import?org.hibernate.criterion.Projections; ??
    11. import?org.hibernate.criterion.Restrictions; ??
    12. import?org.springframework.orm.ObjectRetrievalFailureException; ??
    13. import?org.springframework.orm.hibernate3.support.HibernateDaoSupport; ??
    14. import?org.springframework.util.Assert; ??
    15. import?org.springframework.util.CollectionUtils; ??
    16. import?org.mmc.utils.GenericsUtils; ??
    17. ??
    18. import?java.io.Serializable; ??
    19. import?java.util.List; ??
    20. import?java.util.Map; ??
    21. import?java.util.Set; ??
    22. ??
    23. /** ?
    24. ?*?純Hibernate?Entity?DAO基類. ?
    25. ?*?通過泛型,子類無需擴展任何函數即擁有完整的CRUD操作. ?
    26. ?* ?
    27. ?*/??
    28. abstract?public?class?AbstractHibernateDao?extends?HibernateDaoSupport?{ ??
    29. ??
    30. ????protected?Log?logger?=?LogFactory.getLog(getClass()); ??
    31. ??
    32. ????/** ?
    33. ?????*?Dao所管理的Entity類型. ?
    34. ?????*/??
    35. ????protected?Class?entityClass; ??
    36. ??
    37. ????/** ?
    38. ?????*?取得entityClass的函數. ?
    39. ?????*?JDK1.4不支持泛型的子類可以拋開Class?entityClass,重新實現此函數達到相同效果。 ?
    40. ?????*/??
    41. ????protected?Class?getEntityClass()?{ ??
    42. ????????return?entityClass; ??
    43. ????} ??
    44. ??
    45. ????/** ?
    46. ?????*?在構造函數中將泛型T.class賦給entityClass ?
    47. ?????*/??
    48. ????public?AbstractHibernateDao()?{ ??
    49. ????????entityClass?=?GenericsUtils.getGenericClass(getClass()); ??
    50. ????} ??
    51. ??
    52. ????public?T?get(Serializable?id)?{ ??
    53. ????????T?o?=?(T)?getHibernateTemplate().get(getEntityClass(),?id); ??
    54. ????????if?(o?==?null) ??
    55. ????????????throw?new?ObjectRetrievalFailureException(getEntityClass(),?id); ??
    56. ????????return?o; ??
    57. ????} ??
    58. ??
    59. ????public?List?getAll()?{ ??
    60. ????????return?getHibernateTemplate().loadAll(getEntityClass()); ??
    61. ????} ??
    62. ??
    63. ????public?void?save(Object?o)?{ ??
    64. ????????getHibernateTemplate().saveOrUpdate(o); ??
    65. ????} ??
    66. ??
    67. ????public?void?removeById(Serializable?id)?{ ??
    68. ????????remove(get(id)); ??
    69. ????} ??
    70. ??
    71. ????public?void?remove(Object?o)?{ ??
    72. ????????getHibernateTemplate().delete(o); ??
    73. ????} ??
    74. ??
    75. ????public?List?find(String?hsql,?Object...?values)?{ ??
    76. ????????if?(values.length?==?0) ??
    77. ????????????return?getHibernateTemplate().find(hsql); ??
    78. ????????else??
    79. ????????????return?getHibernateTemplate().find(hsql,?values); ??
    80. ????} ??
    81. ??
    82. ????/** ?
    83. ?????*?根據屬性名和屬性值查詢對象. ?
    84. ?????* ?
    85. ?????*?@return?符合條件的唯一對象 ?
    86. ?????*/??
    87. ????public?T?findUniqueBy(String?name,?Object?value)?{ ??
    88. ????????Criteria?criteria?=?getSession().createCriteria(getEntityClass()); ??
    89. ????????criteria.add(Restrictions.eq(name,?value)); ??
    90. ????????return?(T)?criteria.uniqueResult(); ??
    91. ????} ??
    92. ??
    93. ????/** ?
    94. ?????*?根據屬性名和屬性值查詢對象. ?
    95. ?????* ?
    96. ?????*?@return?符合條件的對象列表 ?
    97. ?????*/??
    98. ????public?List?findBy(String?name,?Object?value)?{ ??
    99. ????????Assert.hasText(name); ??
    100. ????????Criteria?criteria?=?getSession().createCriteria(getEntityClass()); ??
    101. ????????criteria.add(Restrictions.eq(name,?value)); ??
    102. ????????return?criteria.list(); ??
    103. ????} ??
    104. ??
    105. ????/** ?
    106. ?????*?根據屬性名和屬性值以Like?AnyWhere方式查詢對象. ?
    107. ?????*/??
    108. ????public?List?findByLike(String?name,?String?value)?{ ??
    109. ????????Assert.hasText(name); ??
    110. ????????Criteria?criteria?=?getSession().createCriteria(getEntityClass()); ??
    111. ????????criteria.add(Restrictions.like(name,?value,?MatchMode.ANYWHERE)); ??
    112. ????????return?criteria.list(); ??
    113. ????} ??
    114. ??
    115. ????/** ?
    116. ?????*?根據Map中過濾條件進行查詢. ?
    117. ?????* ?
    118. ?????*?@param?filter????????過濾條件. ?
    119. ?????*?@param?criteriaSetup?將Map中條件轉換為criteria的call?back類 ?
    120. ?????*/??
    121. ????public?List?findBy(Map?filter,?CriteriaSetup?criteriaSetup)?{ ??
    122. ????????Criteria?criteria?=?getEntityCriteria(); ??
    123. ????????if?(!CollectionUtils.isEmpty(filter))?{ ??
    124. ????????????criteriaSetup.setup(criteria,?filter); ??
    125. ????????} ??
    126. ????????return?criteria.list(); ??
    127. ????} ??
    128. ??
    129. ????/** ?
    130. ?????*?函數作用同{@link?#findBy(Map,CriteriaSetup)} ?
    131. ?????*?如果不需要分頁,子類可直接重載此函數. ?
    132. ?????*/??
    133. ????public?List?findBy(Map?filter)?{ ??
    134. ????????return?findBy(filter,?getDefaultCriteriaSetup()); ??
    135. ????} ??
    136. ??
    137. ????protected?CriteriaSetup?getDefaultCriteriaSetup()?{ ??
    138. ????????return?new?CriteriaSetup()?{ ??
    139. ????????????public?void?setup(Criteria?criteria,?Map?filter)?{ ??
    140. ????????????????if?(filter?!=?null?&&?!filter.isEmpty())?{ ??
    141. ????????????????????Set?keys?=?filter.keySet(); ??
    142. ????????????????????for?(Object?key?:?keys)?{ ??
    143. ????????????????????????String?value?=?(String)?filter.get(key); ??
    144. ????????????????????????if?(StringUtils.isNotBlank(value)) ??
    145. ????????????????????????????criteria.add(Restrictions.eq((String)?key,?value)); ??
    146. ????????????????????} ??
    147. ????????????????} ??
    148. ????????????} ??
    149. ????????}; ??
    150. ????} ??
    151. ??
    152. ????/** ?
    153. ?????*?取得Entity的Criteria. ?
    154. ?????*/??
    155. ????protected?Criteria?getEntityCriteria()?{ ??
    156. ????????return?getSession().createCriteria(getEntityClass()); ??
    157. ????} ??
    158. ??
    159. ????/** ?
    160. ?????*?構造Criteria的排序條件默認函數.可供其他查詢函數調用 ?
    161. ?????* ?
    162. ?????*?@param?criteria?Criteria實例. ?
    163. ?????*?@param?sortMap??排序條件. ?
    164. ?????*?@param?entity???entity對象,用于使用反射來獲取某些屬性信息 ?
    165. ?????*/??
    166. ????protected?void?sortCriteria(Criteria?criteria,?Map?sortMap,?Object?entity)?{ ??
    167. ????????if?(!sortMap.isEmpty())?{ ??
    168. ????????????for?(Object?o?:?sortMap.keySet())?{ ??
    169. ????????????????String?fieldName?=?o.toString(); ??
    170. ????????????????String?orderType?=?sortMap.get(fieldName).toString(); ??
    171. ??
    172. ????????????????//處理嵌套屬性如category.name,modify_user.id,暫時只處理一級嵌套 ??
    173. ????????????????if?(fieldName.indexOf('.')?!=?-1)?{ ??
    174. ????????????????????String?alias?=?StringUtils.substringBefore(fieldName,?"."); ??
    175. ????????????????????String?aliasType?=?alias; ??
    176. ????????????????????try?{ ??
    177. ????????????????????????aliasType?=?PropertyUtils.getProperty(entity,?alias).getClass().getSimpleName(); ??
    178. ????????????????????}?catch?(Exception?e)?{ ??
    179. ????????????????????????logger.error("Get?property"?+?alias?+?"?error"); ??
    180. ????????????????????} ??
    181. ????????????????????criteria.createAlias(aliasType,?alias); ??
    182. ????????????????} ??
    183. ??
    184. ????????????????if?("asc".equalsIgnoreCase(orderType))?{ ??
    185. ????????????????????criteria.addOrder(Order.asc(fieldName)); ??
    186. ????????????????}?else?{ ??
    187. ????????????????????criteria.addOrder(Order.desc(fieldName)); ??
    188. ????????????????} ??
    189. ????????????} ??
    190. ????????} ??
    191. ????} ??
    192. ??
    193. ????/** ?
    194. ?????*?判斷對象某列的值在數據庫中不存在重復 ?
    195. ?????* ?
    196. ?????*?@param?names?在POJO里相對應的屬性名,列組合時以逗號分割 ?
    197. ?????*??????????????如"name,loginid,password" ?
    198. ?????*/??
    199. ????public?boolean?isNotUnique(Object?entity,?String?names)?{ ??
    200. ????????Assert.hasText(names); ??
    201. ????????Criteria?criteria?=?getSession().createCriteria(entity.getClass()).setProjection(Projections.rowCount()); ??
    202. ????????String[]?nameList?=?names.split(","); ??
    203. ????????try?{ ??
    204. ????????????for?(String?name?:?nameList)?{ ??
    205. ????????????????criteria.add(Restrictions.eq(name,?PropertyUtils.getProperty(entity,?name))); ??
    206. ????????????} ??
    207. ??
    208. ????????????String?keyName?=?getSessionFactory().getClassMetadata(entity.getClass()).getIdentifierPropertyName(); ??
    209. ????????????if?(keyName?!=?null)?{ ??
    210. ????????????????Object?id?=?PropertyUtils.getProperty(entity,?keyName); ??
    211. ????????????????//如果是update,排除自身 ??
    212. ????????????????if?(id?!=?null) ??
    213. ????????????????????criteria.add(Restrictions.not(Restrictions.eq(keyName,?id))); ??
    214. ????????????} ??
    215. ????????} ??
    216. ????????catch?(Exception?e)?{ ??
    217. ????????????logger.error(e.getMessage()); ??
    218. ????????????return?false; ??
    219. ????????} ??
    220. ????????return?((Integer)?criteria.uniqueResult())?>?0; ??
    221. ????} ??
    222. } ??
    posted on 2007-02-07 08:45 ???MengChuChen 閱讀(2216) 評論(3)  編輯  收藏 所屬分類: hibernate

    FeedBack:
    # import org.mmc.utils.BeanUtils; 是什么包里面的啊?
    2008-05-27 15:17 | 急與分頁
    如題,
    請問import org.mmc.utils.BeanUtils; 是在什么包里面的啊?什么地方可以下載?  回復  更多評論
      
    # re: 研究一下springside的核心部分源代碼
    2008-08-14 10:29 | Timon
    hibernate criteria分頁是有問題的 如果要distinct 加分頁會比較麻煩,這里直接使用就會出問題  回復  更多評論
      
    # re: 研究一下springside的核心部分源代碼
    2012-08-27 18:16 | 美麗說
    主站蜘蛛池模板: 国产精品亚洲四区在线观看| 亚洲一区二区三区国产精品| 久久久久久久亚洲Av无码 | 久久成人永久免费播放| 亚洲精品无码永久在线观看| 看成年女人免费午夜视频| 国产禁女女网站免费看| 一级做a爰片久久毛片免费陪| yy6080亚洲一级理论| 2022国内精品免费福利视频| 情人伊人久久综合亚洲| 免费av片在线观看网站| 亚洲精品电影天堂网| 永久免费的网站在线观看| 亚洲日本VA中文字幕久久道具| 国产成人免费a在线视频色戒| 美女被免费网站在线视频免费| 国产精品亚洲αv天堂无码| 曰批全过程免费视频在线观看无码| 婷婷亚洲综合五月天小说| 999国内精品永久免费视频| 亚洲欧美自偷自拍另类视| 亚洲精品人成无码中文毛片| a级男女仿爱免费视频| 亚洲精品午夜在线观看| 国产精品久久香蕉免费播放| 国产在线观看无码免费视频| 亚洲一区二区三区四区在线观看| 99久久这里只精品国产免费| 国产精品亚洲精品久久精品| 久久久亚洲精品视频| 天堂在线免费观看中文版| 国产精品午夜免费观看网站| 亚洲综合色丁香麻豆| 国产大片51精品免费观看| 日韩精品无码一区二区三区免费| 亚洲私人无码综合久久网| 亚洲色大成网站WWW久久九九| 四虎在线最新永久免费| 日本一区二区三区在线视频观看免费 | 中文字幕免费人成乱码中国|