对于架构,我的目标是简单,好用,写少量的代码。
到目前为止,我的目标基本达到了。
目前架构是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的方式截图如:
query.xml里的内容如:
oa.query.xml里的内容:
在service中,同一个queryName,调用不同的方法,可返回单一实体对象、分页、List、Map和数据量统计。