java通用分页(一)

为什么使用通用分页

我们在查询显示数据时,如果数据比较多,那么用到分页会使我们整个界面数据显示更加简洁,这里我是截图的是某度的分页

在这里插入图片描述

通用分页的流程

看到别人的分页好像挺棒,自己动手写一个出来,下面给大家介绍一下小编的分页流程:

1. 首先是导入jar包和数据库连接的配置文件:

这里小编是web项目,所以jar包放在web-inf文件夹下:
在这里插入图片描述
properties配置文件:

#oracle9i
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#pwd=/马赛克/


#sql2005
#driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
#url=jdbc:sqlserver://localhost:1433;DatabaseName=test1
#user=sa
#pwd=/马赛克/


#sql2000
#driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
#url=jdbc:microsoft:sqlserver://localhost:1433;databaseName=unit6DB
#user=sa
#pwd=/马赛克/
//以上为注释内容,这里小编用的是mysql

#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/t243?useUnicode=true&characterEncoding=UTF-8
user=root
pwd=/马赛克/

上面的配置文件数据库连接字符串和加载驱动字符串都有,有想用的小伙伴可以拿过去直接用,加入配置后,解析就可以用了

2.配置好后,下一步就是解析配置文件内容,连接数据库了:

public class  DBAccess{
	private static String driver;
	private static String url;
	private static String user;
	private static String password;

	static {// 静态块执行一次,加载 驱动一次
		try {
			InputStream is = DBAccess.class
					.getResourceAsStream("config.properties");

			Properties properties = new Properties();
			properties.load(is);

			driver = properties.getProperty("driver");
			url = properties.getProperty("url");
			user = properties.getProperty("user");
			password = properties.getProperty("pwd");

			Class.forName(driver);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	/**
	 * 获得数据连接对象
	 * 
	 * @return
	 */
	public static Connection getConnection() {
		try {
			Connection conn = DriverManager.getConnection(url, user, password);
			return conn;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	public static void close(ResultSet rs) {
		if (null != rs) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}

	public static void close(Statement stmt) {
		if (null != stmt) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}

	public static void close(Connection conn) {
		if (null != conn) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
	}

	public static void close(Connection conn, Statement stmt, ResultSet rs) {
		close(rs);
		close(stmt);
		close(conn);
	}

	public static boolean isOracle() {
		return "oracle.jdbc.driver.OracleDriver".equals(driver);
	}

	public static boolean isSQLServer() {
		return "com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver);
	}
	
	public static boolean isMysql() {
		return "com.mysql.jdbc.Driver".equals(driver);
	}

写个main方法测试运行一下,看连接成功没:

public static void main(String[] args) {
		Connection conn = DBAccess.getConnection();
		DBAccess.close(conn);
		System.out.println("isOracle:" + isOracle());
		System.out.println("isSQLServer:" + isSQLServer());
		System.out.println("isMysql:" + isMysql());
		System.out.println("数据库连接(关闭)成功");
	}
isOracle:false
isSQLServer:false
isMysql:true
数据库连接(关闭)成功

3.数据库连接成功后,就可以建实体类和通用方法类了:

实体类:

public class Job implements Serializable{

	private String id;
	private String job;
	private String company;
	private String address;
	private String salary;
	private String url;
	private String limits;
	private String time;
	private String descs;
	private String jobHandle;
	private String addressHandle;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getSalary() {
		return salary;
	}
	public void setSalary(String salary) {
		this.salary = salary;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getLimits() {
		return limits;
	}
	public void setLimits(String limit) {
		this.limits = limit;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	public String getDescs() {
		return descs;
	}
	public void setDescs(String desc) {
		this.descs = desc;
	}
	public String getJobHandle() {
		return jobHandle;
	}
	public void setJobHandle(String jobHandle) {
		this.jobHandle = jobHandle;
	}
	public String getAddressHandle() {
		return addressHandle;
	}
	public void setAddressHandle(String addressHandle) {
		this.addressHandle = addressHandle;
	}
	public Job(String id, String job, String company, String address, String salary, String url, String limit, String time,
			String desc, String jobHandle, String addressHandle) {
		this.id = id;
		this.job = job;
		this.company = company;
		this.address = address;
		this.salary = salary;
		this.url = url;
		this.limits = limit;
		this.time = time;
		this.descs = desc;
		this.jobHandle = jobHandle;
		this.addressHandle = addressHandle;
	}
	
	
	@Override
	public String toString() {
		return "Job [id=" + id + ", job=" + job + ", company=" + company + ", address=" + address + ", salary=" + salary
				+ ", url=" + url + ", limits=" + limits + ", time=" + time + ", descs=" + descs + ", jobHandle="
				+ jobHandle + ", addressHandle=" + addressHandle + "]";
	}
	}

通用方法实体类:

public class PageBean {

	private int page = 1;// 页码
	private int rows = 10;// 页大小,每页显示多少条数据
	private int total = 0;// 总记录数,从数据库中统计

	private boolean pagination = true;

	private String url;// 请求路径
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String[]> getParameterMap() {
		return ParameterMap;
	}

	public void setParameterMap(Map<String, String[]> parameterMap) {
		ParameterMap = parameterMap;
	}

	// 存储页面传的参数
	private Map<String, String[]> ParameterMap = new HashMap<String, String[]>();

	public int getPage() {
		return page;
	}

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

	public void setPage(String page) {
		if (null != page && !"".equals(page.trim())) {
			this.page = Integer.parseInt(page);
		}
	}

	public int getRows() {
		return rows;
	}

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

	public void setRows(String rows) {
		if (null != rows && !"".equals(rows.trim())) {
			this.rows = Integer.parseInt(rows);
		}
	}

	public int getTotal() {
		return total;
	}

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

	public boolean isPagination() {
		return pagination;
	}

	public void setPagination(boolean pagination) {
		this.pagination = pagination;
	}

	public void setPagination(String pagination) {
		if ("false".equals(pagination)) {
			this.pagination = Boolean.parseBoolean(pagination);
		}
	}

	public PageBean() {
		super();
	}

	public PageBean(int page, int rows, int total, boolean pagination) {
		super();
		this.page = page;
		this.rows = rows;
		this.total = total;
		this.pagination = pagination;
	}

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

回调接口,遍历方法:

public interface Callback<k> {

	public List<k> foreach(ResultSet rs) throws SQLException;
}

通用分页方法类:

public class BaseDao<k> {
	public List<k> executeQuery(String sql, PageBean pageBean, Callback<k> callBack) {
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		if (null != pageBean && pageBean.isPagination()) {
			try {	
				con = DBAccess.getConnection();
				String countSql = this.getCountSql(sql);
				ps = con.prepareStatement(countSql);
				rs = ps.executeQuery();
				if (rs.next()) {
					int total = rs.getInt(1);// 总记录数
					pageBean.setTotal(total);// 给pagebean的总记录数赋值
				}
			} catch (Exception e) {
				throw new RuntimeException(e);
			} finally {
				DBAccess.close(null, ps, rs);
			}
		}
		// 2.查询指定页码并满足条件的总记录数
		try {
			if(con==null) {
				con=DBAccess.getConnection();
			}
			String pageSql =sql;
			if(null!=pageBean&&pageBean.isPagination()) {
				pageSql = this.getPageSql(sql, pageBean);
			}
			ps = con.prepareStatement(pageSql);
			rs = ps.executeQuery();
			// 不同内容
			return callBack.foreach(rs);
		} catch (Exception e) {
			throw new RuntimeException();
		} finally {
			DBAccess.close(con, ps, rs);
		}
	}


	/**
	 * 专门写一个方法用来拼接查询语句的统计满足条件的总行数
	 * 
	 * @param sql
	 * @return
	 */
	public String getCountSql(String sql) {
		return "select count(*) from (" + sql + ") t1";
	}

	/**
	 * 专门写一个方法用来存储拼接分页的sql
	 * 
	 * @param sql
	 * @param pageBean
	 * @return
	 */
	public String getPageSql(String sql, PageBean pageBean) {
		return sql + " limit " + pageBean.getStartsIndex() + "," + pageBean.getRows();

	}

}

4.因为是通用分页,所以类的类型都用了泛型数据,dao方法继承通用分页类:

public class JobDao extends BaseDao<Job>{
	/**
	 * 查询方法 模糊查询和查询全部
	 * 
	 * @param stu
	 * @return
	 */
	public List<Job> find(Job job, PageBean pageBean) {
		List<Job> jobList = new ArrayList<Job>();
		String sql = "select * from t_solr_job where 1=1 ";
		return this.executeQuery(sql, pageBean, new Callback<Job>() {
			@Override
			public List<Job> foreach(ResultSet rs) throws SQLException {//通用分页遍历
				List<Job> jobList = new ArrayList<Job>();
				Job job1 = null;
				while (rs.next()) {
					job1 = new Job();
					job1.setId(rs.getString(1));
					job1.setJob(rs.getString(2));
					job1.setCompany(rs.getString(3));
					job1.setAddress(rs.getString(4));
					job1.setSalary(rs.getString(5));
					job1.setUrl(rs.getString(6));
					job1.setLimits(rs.getString(7));
					job1.setTime(rs.getString(8));
					job1.setDescs(rs.getString(9));
					job1.setJobHandle(rs.getString(10));
					job1.setAddressHandle(rs.getString(11));
					jobList.add(job1);
				}
				return jobList;
			}
		});
	}
}

尾言

是不是好奇为啥没有效果图,哈哈哈,不要着急,因为是抢先版,所以还有很多细节没处理和优化,明天写好了第一时间分享出来溜了溜了…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值