對於架構,個人目標是簡單,好用,寫少許的代碼。
到目前爲止,個人目標基本達到了。
目前架構是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和數據量統計。