zoukankan      html  css  js  c++  java
  • 实际开发中的模板设计模式

      最近的项目中,在使用spring+springJBDC 开发时,从一开始的一脸懵逼到越来越顺手,着一切,都归功于一大堆的封装方法.在这里,记录两个非常有用方法以便查阅学习

          

    一. 组合查询的基础类(BaseCondition)

    该类中,抽取了常用的组合查询的公共属性和方法,例如:分页查询中使用的 

    pagaSize// 页大小、pageNumber// 当前页码、rowCount;// 记录总数 

    rowCount;// 记录总数 

    拼接sql语句使用的多个重载add()方法,更据不同数据类型重载;

    最重要的是获取最终拼接条件sqlgetCondition()方法,此处使用模板方法,子类在继承该基础类之后需要重写模板中的addCondition()方法来拼接查询条件。

    
    import java.lang.reflect.Method;
    
    import java.math.BigDecimal;
    
    import java.util.ArrayList;
    
    import java.util.Date;
    
    import java.util.List;
    
    import org.apache.commons.logging.Log;
    
    import org.apache.commons.logging.LogFactory;
    
    import com.common.constant.Constant;
    
    import com.common.util.DataUtil;
    
     
    
    /**
    
     * @功能说明:拼加页面查询条件的基础类
    
     * @author gzz
    
     */
    
    public abstract class BaseCondition {
    
    private Log logger = LogFactory.getLog(getClass());// 日志类
    
    private List<Object> paramList = new ArrayList<Object>();// 参数值
    
    private StringBuffer condition = new StringBuffer();// 条件语句
     
    private Integer pageSize = 15;// 页大小(每页记录条)
    
    private Integer rowCount;// 记录总数
    
    private Integer rowCount;// 记录总数
    
    private Integer curPage = 1;// 当前页码
    /**
    
     * @功能: 拼加条件使用等于大于小于....运算符(String类型)
    
     */
    
    protected void add(String value, String strSQL) {
    
    if (null != strSQL && null != value && !"".equals(strSQL) && !"".equals(value)) {
    
    condition.append(" " + strSQL);
    
    paramList.add(value);
    
    }
    
    }
    /**
    
     * @功能: 拼加条件使用等于大于小于....运算符(Long类型)
    
     */
    protected void add(Long value, String strSQL) {
    
    if (null != strSQL && null != value && !"".equals(strSQL) && !"".equals(value)) {
    
    condition.append(" " + strSQL);
    
    paramList.add(value);
    
    }
    
    }
    /**
    
     * @功能: 拼加条件使用等于大于小于....运算符(Boolean类型)
    
     */
    
    protected void add(Boolean value, String strSQL) {
    
    if (null != strSQL && null != value && !"".equals(strSQL) && !"".equals(value)) {
    
    condition.append(" " + strSQL);
    
    paramList.add(value);
    
    }
    
    }
    /**
    
     * @功能: 拼加条件使用等于大于小于....运算符(BigDecimal类型)
    
     */
    
    protected void add(BigDecimal value, String strSQL) {
    
    if (null != strSQL && null != value && !"".equals(strSQL) && !"".equals(value)) {
    
    condition.append(" " + strSQL);
    
    paramList.add(value);
    
    }
    
    }
    /**
    
     * @功能: 拼加条件使用等于大于小于....运算符(Integer类型)
    
     */
    
    protected void add(Integer value, String strSQL) {
    
    if (null != value && !"".equals(strSQL) && null != strSQL) {
    
    condition.append(" " + strSQL);
    
    paramList.add(value);
    
    }
    
    }
    /**
    
     * @功能: 拼加条件使用等于大于小于....运算符(Date类型)
    
     */
    
    protected void add(Date value, String strSQL) {
    
    if (null != value && !"".equals(strSQL) && null != strSQL) {
    
    condition.append(" " + strSQL);
    
    paramList.add(value);
    
    }
    
    }
    /**
    
     * @功能: 拼加条件
    
     */
    
    protected void add(String strSQL) {
    
    if (null != strSQL && !"".equals(strSQL)) {
    
    condition.append(" " + strSQL);
    
    }
    
    }
    /**
    
     * @功能: 拼加条件使用like关键字模糊查询时
    
     * 
    
     * @param value
    
     *            :属性名称
    
     * @param strSQL
    
     *            :参数SQL字符
    
     * @param posLike
    
     *            :字句中百分号出现位置
    
     * @return strSQL:拼加后SQL字符包括占位符
    
     */
    
    protected void add(String value, String strSQL, int pos) {
    
    if (null != strSQL && null != value && !"".equals(strSQL) && !"".equals(value)) {
    
    condition.append(" " + strSQL);
    
    if (pos == 1) {
    
    paramList.add("%" + value);
    
    } else if (pos == 2) {
    
    paramList.add(value + "%");
    
    } else if (pos == 3) {
    
    paramList.add("%" + value + "%");
    
    }
    
    }
    
    }
    /**
    
     * @功能: 拼加IN字句条件
    
     */
    
    protected void addIn(String value, String strSQL) {
    
    if (null != strSQL && null != value && !"".equals(strSQL) && !"".equals(value)) {
    
    condition.append(" " + strSQL);
    
    }
    
    }
    /**
    
     * @功能: 将List转为数组
    
     */
    
    public Object[] getArray() {
    
    return paramList.toArray();
    
    }
    /**
    
     * @功能: 取条件字符串(模板设计模式)
    
     */
    
    public String getCondition() {
    
    // 清除查询条件
    
    condition.setLength(0);
    
    paramList.clear();
    addCondition();
    
    return condition.toString();
    
    }
    /**
    
     * @功能: 拼加条件方法
    
     */
    
    public abstract void addCondition();
    public BaseCondition() {
    
    }
    public BaseCondition(Object[][] obj) {
    
    Method method;
    
    Class<?> paraClass;
    
    try {
    
    for (Object[] o : obj) {
    
    if (o[1].getClass().getName().contains("Integer")) {
    
    paraClass = Integer.class;
    
    } else if (o[1].getClass().getName().contains("Date")) {
    
    paraClass = Date.class;
    
    } else {
    
    paraClass = String.class;
    
    }
    
    method = this.getClass().getDeclaredMethod("set" + DataUtil.firstUpper(o[0].toString()), paraClass);
    
    method.invoke(this, o[1]);
    
    }
    
    } catch (Exception e) {
    
    logger.error("构造条件赋值时发生的错误,请核对条件字段名称.");
    
    e.printStackTrace();
    
    }
    
    }
    public Integer getPageSize() {
    
    return pageSize;
    
    }
    public void setPageSize(Integer pageSize) {
    
    this.pageSize = pageSize;
    
    }
    public Integer getRowCount() {
    
    return rowCount;
    
    }
    public void setRowCount(Integer rowCount) {
    
    this.rowCount = rowCount;
    
    }
    public Integer getPageCount() {
    
    return pageCount;
    
    }
    public void setPageCount(Integer pageCount) {
    
    this.pageCount = pageCount;
    
    }
    
     
    public Integer getCurPage() {
    
    return curPage;
    
    }
    public void setCurPage(Integer curPage) {
    
    this.curPage = curPage;
    
    }
    
    }
    
     

    二.dao公共类(BaseDao)

    本项目中,使用了springJDBC,为避免在实现过程中产生了大量的冗余代码,本类诞生了。

    该类中注入了每个dao都会用的JdbcTemplate,以及分页查询的方法。

    import java.util.List;

    import java.util.Map;

    import org.apache.commons.logging.Log;

    import org.apache.commons.logging.LogFactory;

    import org.springframework.beans.factory.annotation.Autowired;

    import org.springframework.jdbc.core.BeanPropertyRowMapper;

    import org.springframework.jdbc.core.JdbcTemplate;

    import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

    import com.common.condition.BaseCondition;

    /**

     * @功能描述:dao类公共类

     * @author 

     * @param <T>

     */

    public class BaseDao<T> {

    protected final Log logger = LogFactory.getLog(BaseDao.class);// 日志类

    @Autowired

    protected JdbcTemplate jdbcTemplate;// jdbc模版类

    @Autowired

    protected NamedParameterJdbcTemplate namedJdbcTemplate;// jdbc模版类

    protected void queryPage(Map<String, Object> map, String sql, BaseCondition cond, Class<T> clazz) {

    String countSQL = "SELECT count(1) FROM (" + sql + ") t";// 统计记录个数的SQL语句

    int rowCount = jdbcTemplate.queryForObject(countSQL, cond.getArray(), Integer.class);// 查询记录个数

    cond.setRowCount(rowCount);

    int pageSize = cond.getPageSize();// 页大小

    int curPage = cond.getCurPage();// 当前页

    cond.setPageCount(rowCount % pageSize == 0 ? rowCount / pageSize : rowCount / pageSize + 1);// 页数

    String listSql = sql + " LIMIT " + (curPage - 1) * pageSize + "," + pageSize;// 查询分页数据列表的SQL语句

    List<T> dataList = jdbcTemplate.query(listSql.toString(), cond.getArray(), new BeanPropertyRowMapper<T>(clazz));

    map.put("dataList", dataList);

    方法使用实例:

    //这是public class BannerDaoImpl extends BaseDao<Banner> implements IBannerDao

    //中的一个方法,它继承了BaseDao; 同样BannerCond继承了BaseCondition,BannerCond

    //中重写了模板中的addCondition() 方法,在方法中按照项目要求拼接条件

    //BannerCond中的方法addCondition()实现

    public void addCondition() {

    add(name_c,"and name like ?",3);//模糊查询

    add(order_num_c,"and order_num=?");

    add(picture_path_c,"and picture_path=?");

    .......................//等等别的属性拼接

    add(name_v,"and name=?");//精确查询

    add(id_c,"and id!=?");

    }

    /**

    *功能:实现分页查询

    */

    public void queryList(BannerCond cond, Map<String, Object> map) {

    StringBuffer sb =new StringBuffer();

    sb.append("select * from cms_banner where 1=1 ");

    sb.append(cond.getCondition());

    sb.append(" order by id");

    queryPage(map, sb.toString(), cond, Banner.class);

    }

    //该方法处于dao层,其中的BannerCond cond 其实是由 处理器传递给serviceservice//递给dao层的,(参数中的map是用来共享数据的,在BaseDao中可以看到)

    //service层调用dao代码

    public void queryList(BannerCond cond, Map<String, Object> map) {

    dao.queryList(cond, map);

    }

    我们看到,在service层中,我们只需要关心主要业务即可,开发变得异常简单。当然,前提是理解了众多如上述的基础方法。实现业务,完成项目不在困难。

  • 相关阅读:
    在Ubuntu下安装Apache
    linux 安装jdk 配置tomcat
    linux命令——rmdir
    linux命令——rm
    WebApi路由解析增加版本控制
    eclipse Dynamic web module相关问题
    mysql 5.7.18 windows zip安装
    微信扫描二维码登录网站技术原理
    Maven实战(八)——常用Maven插件介绍(下)
    Maven实战(七)——常用Maven插件介绍(上)
  • 原文地址:https://www.cnblogs.com/he-shao/p/6213315.html
Copyright © 2011-2022 走看看