最近的项目中,在使用spring+springJBDC 开发时,从一开始的一脸懵逼到越来越顺手,着一切,都归功于一大堆的封装方法.在这里,记录两个非常有用方法以便查阅学习
一. 组合查询的基础类(BaseCondition)
该类中,抽取了常用的组合查询的公共属性和方法,例如:分页查询中使用的
pagaSize// 页大小、pageNumber// 当前页码、rowCount;// 记录总数
rowCount;// 记录总数
拼接sql语句使用的多个重载add()方法,更据不同数据类型重载;
最重要的是获取最终拼接条件sql的getCondition()方法,此处使用模板方法,子类在继承该基础类之后需要重写模板中的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() 方法,在方法中按照项目要求拼接条件
/** *功能:实现分页查询 */ 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 其实是由 处理器传递给service,service传//递给dao层的,(参数中的map是用来共享数据的,在BaseDao中可以看到)
|
我们看到,在service层中,我们只需要关心主要业务即可,开发变得异常简单。当然,前提是理解了众多如上述的基础方法。实现业务,完成项目不在困难。