DAO层封装 2 JDBCTemplate 分页查询、参数包装,简化查询

JdbcTemplageSupport 继承自 org.springframework.jdbc.core.JdbcTemplate;

包括了3组方法:

1、传入的参数是List形式,推荐首选这2个方法

public  PageResult pagedQuery(String sql, List sqlArgs, Class mappedClass, PageParam pageParam) 
  

sql:查询语句

sqlArgs:查询参数List,顺序需要与sql中的?一一对应

mappedClass:查询的结果返回的封装Class

pageParam:page的参数,包括pageIndex,pageSize


public  PageResult pagedQuery(String sql, List sqlArgs, Class mappedClass, int page, int rows) page:查询的页码 
  
rows: 一页显示的行数


2、传入的参数是Object[]形式

public  PageResult pagedQuery(String sql, Object[] sqlArgs, Class mappedClass, int page, int rows)
public  PageResult pagedQuery(String sql, Object[] sqlArgs, Class mappedClass, PageParam pageParam)

参数定义与上述2个方法一样,只是sqlArgs不同


3、传入的参数是Object...形式

public  PageResult pagedQuery(String sql, Class mappedClass, PageParam pageParam, Object... sqlArgs) 
public  PageResult pagedQuery(String sql, Class mappedClass, int page, int rows, Object... sqlArgs)


在spring配置文件中定义:


    

在BaseDaoImpl中注入:

@Resource(name = "jdbcTemplate")
private JdbcTemplageSupport jdbcTemplate;// 注入JDBC模板


使用方式

这里使用2个类:PageParam和PageResult

PageParam:
只需要传入page 和 rows,在传入的同时,该类就会自动计算startIndex和endIndex,在分页查询语句中便可直接使用startIndex和endIndex
这里使用page和rows这2个变量名是因为datagrid向后台传递参数时默认的就使用的这2个参数名
这样就不需要再繁琐地把参数再set一边了,框架自动就帮我们set好了
如果还需要传入其他参数的时候,可以建立一个新的param类继承PageParam
例如class DatagridDemoParam extends PageParam
在该类中,无需再写page和rows,直接继承了父类,专注于界面传入的参数即可

PageResult
使用了泛型,包括了2个成员变量,total和rows
这样命名变量的好处是,使用PageResult作为返回值返回给前台JS,不需要任何转化,datagrid就可以直接读取到分页查询的结果


在action层中的分页查询可以极大的简化:

1、加上@ResponseBody
2、返回值使用PageResult T是希望返回的对象,在查询结果比较简单时,使用数据库表对应的entity,在查询结果组合了很多表的时候,可以自己定义的VO,将每一列定义到该VO中即可
@RequestMapping("getDatagridJson2")
@ResponseBody
public PageResult getDatagridJson2(@ModelAttribute DatagridDemoParam datadgridDemoParam) throws IOException {
	PageResult page = jdbcDemoService.pagedQuery(datadgridDemoParam);
	return page;
}



参考代码:

PageParam

package com.fhzz.core.vo;


/**
 * @author: YangYi
 * @CreateTime: 2018年2月13日 上午11:13:49
 * @Copyright: FHZZ
 */
public class PageParam{
	private int page = 1; // 当前页码
	private int rows = 10; // 每页的记录数
	private int startIndex;// SQL查询起始INDEX
	private int endIndex;// SQL查询结束INDEX

	private void calculateIndex() {
		this.startIndex = (page - 1) * rows;
		this.endIndex = startIndex + rows;
	}

	public PageParam() {
		super();
		this.calculateIndex();
	}

	public PageParam(int page, int rows) {
		super();
		this.page = page;
		this.rows = rows;
		this.calculateIndex();
	}

	public void setPage(int page) {
		this.page = page;
		this.calculateIndex();
	}

	public void setRows(int rows) {
		this.rows = rows;
		this.calculateIndex();
	}

	@Override
	public String toString() {
		return "PageParam [page=" + page + ", rows=" + rows + "]";
	}

	public int getStartIndex() {
		return startIndex;
	}

	public int getEndIndex() {
		return endIndex;
	}
	public int getPage() {
		return page;
	}
	
	public int getRows() {
		return rows;
	}
}
DatagridDemoParam
public class DatagridDemoParam extends PageParam {
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	private Date startTime;

	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	private Date endTime;

	private String name;

	private Integer countNum;

PageResult

package com.fhzz.core.vo;

import java.io.Serializable;
import java.util.List;

/**
 * 
 * @author: YangYi
 * @CreateTime: 2018年2月13日 下午12:22:10
 * @Copyright: FHZZ
 */
public class PageResult implements Serializable {
	private static final long serialVersionUID = -1750386840274995765L;
	
	private long total; // 总记录数
	private List rows; // 查询出的结果数

	public PageResult() {
		super();
	}

	public PageResult(long total, List rows) {
		super();
		this.total = total;
		this.rows = rows;
	}

	@Override
	public String toString() {
		return "PageResult [total=" + total + ", rows=" + rows + "]";
	}

	public long getTotal() {
		return total;
	}

	public void setTotal(long total) {
		this.total = total;
	}

	public List getRows() {
		return rows;
	}

	public void setRows(List rows) {
		this.rows = rows;
	}

}

JdbcTemplageSupport

package com.fhzz.core.dao.impl.support;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import com.fhzz.core.vo.PageParam;
import com.fhzz.core.vo.PageResult;

/**
 * @author: YangYi
 * @CreateTime: 2018年2月13日 上午11:35:19
 * @Copyright: FHZZ
 */
public class JdbcTemplageSupport extends JdbcTemplate {

	/**
	 * 
	 * @param sql
	 *            查询语句
	 * @param sqlArgs
	 *            查询参数List,顺序需要与sql中的?一一对应
	 * @param mappedClass
	 *            查询的结果返回的封装CLASS
	 * @param pageParam
	 *            page的参数,包括pageIndex,pageSize
	 * @return
	 */
	public  PageResult pagedQuery(String sql, List sqlArgs,
			Class mappedClass, PageParam pageParam) {
		return this.pagedQuery(sql, sqlArgs.toArray(), mappedClass, pageParam);
	}

	/**
	 * 
	 * @param sql
	 *            查询语句
	 * @param sqlArgs
	 *            查询参数List,顺序需要与sql中的?一一对应
	 * @param mappedClass
	 *            查询的结果返回的封装CLASS
	 * @param page
	 *            查询的页码
	 * @param rows
	 *            一页显示的行数
	 * @return
	 */
	public  PageResult pagedQuery(String sql, List sqlArgs,
			Class mappedClass, int page, int rows) {
		return this.pagedQuery(sql, sqlArgs.toArray(), mappedClass, page, rows);
	}

	/**
	 * 
	 * @param sql
	 *            查询语句
	 * @param sqlArgs
	 *            查询参数Object数组,顺序需要与sql中的?一一对应
	 * @param mappedClass
	 *            查询的结果返回的封装CLASS
	 * @param page
	 *            查询的页码
	 * @param rows
	 *            一页显示的行数
	 * @return
	 */
	public  PageResult pagedQuery(String sql, Object[] sqlArgs,
			Class mappedClass, int page, int rows) {
		return this.pagedQuery(sql, sqlArgs, mappedClass, new PageParam(page,
				rows));
	}

	/**
	 * 
	 * @param sql
	 *            查询语句
	 * @param sqlArgs
	 *            查询参数Object数组,顺序需要与sql中的?一一对应
	 * @param mappedClass
	 *            查询的结果返回的封装CLASS
	 * @param pageParam
	 *            page的参数,包括pageIndex,pageSize
	 * @return
	 */
	public  PageResult pagedQuery(String sql, Object[] sqlArgs,
			Class mappedClass, PageParam pageParam) {
		// 查询总条数
		int totalCount = this.queryForObject(this.buildCountSql(sql),
				Integer.class, sqlArgs);
		// 查询数据
		RowMapper rowMapper = BeanPropertyRowMapper.newInstance(mappedClass);
		List list = this.query(this.buildDataSql(sql, pageParam), sqlArgs,
				rowMapper);
		// 组装PageResult
		PageResult page = new PageResult(totalCount, list);
		return page;
	}

	/**
	 * 
	 * @param sql
	 *            查询语句
	 * @param mappedClass
	 *            查询的结果返回的封装CLASS
	 * @param pageParam
	 *            page的参数,包括pageIndex,pageSize
	 * @param sqlArgs
	 *            查询语句传入的参数
	 * @return
	 */
	public  PageResult pagedQuery(String sql, Class mappedClass,
			PageParam pageParam, Object... sqlArgs) {
		// 查询总条数
		int totalCount = this.queryForObject(this.buildCountSql(sql),
				Integer.class, sqlArgs);
		// 查询数据
		RowMapper rowMapper = BeanPropertyRowMapper.newInstance(mappedClass);
		List list = this.query(this.buildDataSql(sql, pageParam), rowMapper,
				sqlArgs);
		// 组装PageResult
		PageResult page = new PageResult(totalCount, list);
		return page;
	}

	/**
	 * 
	 * @param sql
	 *            查询语句
	 * @param mappedClass
	 *            查询的结果返回的封装CLASS
	 * @param page
	 *            查询的页码
	 * @param rows
	 *            一页显示的行数
	 * @param sqlArgs
	 *            查询语句传入的参数
	 * @return
	 */
	public  PageResult pagedQuery(String sql, Class mappedClass,
			int page, int rows, Object... sqlArgs) {
		return this.pagedQuery(sql, mappedClass, new PageParam(page, rows),
				sqlArgs);
	}

	/**
	 * 去除SELECT *语句,便于SELECT count(*)
	 */
	private String removeSelect(String sql) {
		int beginPosition = sql.toLowerCase().indexOf("from");
		return sql.substring(beginPosition);
	}

	/**
	 * 去除order by 提高select count(*)的速度
	 */
	private String removeOrders(String sql) {
		Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*",
				Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(sql);
		StringBuffer sb = new StringBuffer();
		while (m.find()) {
			m.appendReplacement(sb, "");
		}
		m.appendTail(sb);
		return sb.toString();
	}

	private String buildCountSql(String sql) {
		StringBuffer countSql = new StringBuffer();
		countSql.append("SELECT COUNT(*) ");
		countSql.append(this.removeOrders(this.removeSelect(sql)));
		return countSql.toString();
	}

	private String buildDataSql(String sql, PageParam pageParam) {
		StringBuffer dataSql = new StringBuffer();
		dataSql.append("SELECT");
		dataSql.append("	*");
		dataSql.append("FROM");
		dataSql.append("	(");
		dataSql.append("		SELECT");
		dataSql.append("			temp.*,");
		dataSql.append("			ROWNUM num");
		dataSql.append("		FROM");
		dataSql.append("			(").append(sql).append(") temp");
		dataSql.append("		WHERE");
		dataSql.append("			ROWNUM <= ").append(pageParam.getEndIndex());
		dataSql.append("	) WHERE num > ").append(pageParam.getStartIndex());
		return dataSql.toString();
	}

}
 
  

你可能感兴趣的:(DAO)