第一篇,總體架構hibernate dao篇

對於架構,個人目標是簡單,好用,寫少許的代碼。
到目前爲止,個人目標基本達到了。
目前架構是struts2+spring3+hibernate3,大量使用註解,儘量少的xml配置文件。
典型的MVC架構。
一、先看dao層,dao層採用兩種方式:hibernate和dbubits,大部分狀況下都將採用hibernate。
   先看hibernate的dao:com.jroo.base.dao.hibernate.BaseHibernateDao<T extends Serializable>
   裏面的方法有包含了:保存、修改、刪除、查詢操做,其中查詢操做有:返回List、Map、分頁、單一實體對象和數量統計等,
   查詢操做都採用了兩種方式:在java裏寫hql語句和在外部xml裏寫hql。
   HqlBuilder:用於在java裏寫hql語句,它的使用方式和StringBuilder相似。
   如:
   HqlBuilder hqlBuilder = new HqlBuilder("select log from SysLoginLog as log where 1=1");
      if(StringUtils.isNotEmpty(loginUserId)){
           hqlBuilder.append(" and log.loginUser.id=:loginUserId ").setParam("loginUserId", loginUserId);
      }
      if(StringUtils.isNotEmpty(loginUserName)){
           hqlBuilder.append(" and log.loginUser.userName like:loginUserName ").setParam("loginUserName", "%"+loginUserName+"%");
      }
      page = pageQueryHqlBuilder(page, hqlBuilder);


   演示應用中,全部的hql語句都寫在外部xml中,如:
   <!-- 查詢系統規則設置 -->
<query name="system.findSysRuleSettings">
   <hql>
   <![CDATA[
             from SysRuleSetting where 1=1 
             <#if ruleType??>
                 and ruleType =:ruleType
             </#if>
        ]]>
   </hql>
</query>

在java裏調用:page = pageQueryHqlBuilder(page, system.findSysRuleSettings,paramMap);


BaseHibernateDao接口中的方法以下: java

  /**
* 保存對象
* @param entity
* @return 實體對象
*/
public T save(T entity) throws Exception;

/**
* 更新對象
* @param entity
* @return 實體對象
*/
public T update(T entity) throws Exception;


/**
* 保存或更新對象
* @param entity
* @return 實體對象
*/
public T saveOrUpdate(T entity) throws Exception;


/**
* 刪除對象
* @param entity
*/
public void delete(T entity) throws Exception;

/**
* 由主鍵得到實體實例
* @param t
* @param id
* @return
*/
public T get(Class<T> t,Serializable id) throws Exception;
 
/**
* HqlBuilder方式批量更新/批量刪除
*/
public int batch(HqlBuilder hqlBuilder) throws Exception;

/**
* 外部hql方式批次更新或刪除
* @param queryName 查詢name
* @param paramMap 參數名值對
* @return
*/
public int batch(String queryName,Map<String,?> paramMap) throws Exception;



/**
* HqlBuilder查詢,數量統計
* @param hqlBuilder
* @return
*/
public int findCount(HqlBuilder hqlBuilder) throws Exception;
 
/**
 * 外部hql查詢,數量統計
 * @param queryName 查詢name
 * @param paramMap
 * @return
 */
public int findCount(String queryName,Map<String,?> paramMap) throws Exception;
 
/**
 * HqlBuilder查詢,返回一個
 * @param hqlBuilder
 * @return
 */
public T findOne(HqlBuilder hqlBuilder) throws Exception;
 
/**
 * 外部hql查詢,返回一個
 * @param queryName 查詢name
 * @param paramMap 參數名值對
 * @return
 */
public T findOne(String queryName,Map<String,?> paramMap) throws Exception;


/**
 * HqlBuilder查詢,返回Map
 * @param hqlBuilder hql構建器
 * @param keyPropertyName 做爲Map結果集的key
 * @param clazzOrPropertyName 做爲Map結果集的value,實體或實體中的屬性名稱
 * @return 返回map結果集
 */
public Map<?,?> findMap(HqlBuilder hqlBuilder,String keyPropertyName,Object clazzOrPropertyName) throws Exception;

/**
*  外部hql查詢,返回Map
 * @param queryName 查詢name
 * @param keyPropertyName 做爲Map結果集的key
 * @param clazzOrPropertyName 做爲Map結果集的value,實體或實體中的屬性名稱
 * @param paramMap 參數名值對
 * @return 返回map結果集
 */
public Map<?,?> findMap(String queryName,String keyPropertyName,Object clazzOrPropertyName,Map<String,?> paramMap) throws Exception;

/**
 * HqlBuilder查詢,返回List
 * @param hqlBuilder hql構建器
 * @return 返回List結果集
 */
@SuppressWarnings("unchecked")
public List findList(HqlBuilder hqlBuilder) throws Exception;

/**
 * 外部 hql查詢,返回List
 * @param queryName 查詢name
 * @paramMap 參數名值對
 * @return 返回List結果集
 */
@SuppressWarnings("unchecked")
public List findList(String queryName,Map<String,?> paramMap) throws Exception;

/**
* HqlBuilder分頁查詢,直接返回分頁對象。
* @param hqlBuilder hql構建器
* @param page:當前分頁對象
* @return
*/
public Page findPage(Page page,HqlBuilder hqlBuilder) throws Exception;

/**
* 外部 hql分頁查詢,直接返回分頁對象。
* @param hqlBuilder hql構建器
* @param page:當前分頁對象
* @return
*/

public Page findPage(Page page,String queryName,Map<String,?> paramMap) throws Exception; spring

外部xml的方式截圖如: 架構

      query.xml裏的內容如: app

      

       oa.query.xml裏的內容: ui

       

                  在service中,同一個queryName,調用不一樣的方法,可返回單一實體對象、分頁、List、Map和數據量統計。
相關文章
相關標籤/搜索