第一篇,整体架构hibernate dao篇

对于架构,我的目标是简单,好用,写少量的代码。
到目前为止,我的目标基本达到了。
目前架构是struts2+spring3+hibernate3,大量使用注解,尽可能少的xml配置文件。
典型的MVC架构。
1、先看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接口中的方法如下:

  /**
* 保存对象
* @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;

外部xml的方式截图如:

第一篇,整体架构hibernate dao篇_第1张图片

      query.xml里的内容如:

      第一篇,整体架构hibernate dao篇_第2张图片

       oa.query.xml里的内容:

       第一篇,整体架构hibernate dao篇_第3张图片

                  在service中,同一个queryName,调用不同的方法,可返回单一实体对象、分页、List、Map和数据量统计。

你可能感兴趣的:(HQL,通用Dao,简化hibernate)