天天看點

JSP——通用分頁——1Dao方法通用dao

文章目錄

  • Dao方法
  • 通用dao

大家好,今天為大家帶來的是jsp的通用分頁,何為通用分頁,一般來說,就是為了友善使用者觀看,減少頁面展示空間用的,但今天所講的内容,可以把 查詢所有和 模糊查詢,還有 分頁查和三為一,且 任何實體類都可以使用!

Dao方法

首先第一步,是編寫實體類的dao方法,每個實體類Dao方法調的表也是不同的,是以初始sql語句每個表都是不同的!

public class bookDao {
	
	/**
	 * 
	 * @param book 是從jsp傳過來的參數封裝成對象作為參數查詢并執行sql
	 * @param pageBean	決定是否分頁
	 * @return
	 */
	public List<Book> list(Book book,PageBean pageBean){
			String sql = "select * from t_mvc_book where 1=1 ";
			if(StringUtils.isNotBlank(book.getBname())) {
				sql += " and bname like '%"+book.getBname()+"%'";
			}
	}
}
           

在定義sql語句時,得判斷是不是模糊查,是以這裡調用了StringUtils包的一個方法:

public class StringUtils {
	// 私有的構造方法,保護此類不能在外部執行個體化
	private StringUtils() {
	}

	/**
	 * 如果字元串等于null或去空格後等于"",則傳回true,否則傳回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isBlank(String s) {
		boolean b = false;
		if (null == s || s.trim().equals("")) {
			b = true;
		}
		return b;
	}
	
	/**
	 * 如果字元串不等于null或去空格後不等于"",則傳回true,否則傳回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNotBlank(String s) {
		return !isBlank(s);
	}

}
           

這個類主要功能就是判斷是否為空。

通用dao

在所有的查詢dao方法中,為例避免重複編寫過多的代碼,是以建立一個通用的dao方法類。

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class BaseDao<T> {
	
	/**
	 * 
	 * @param sql		決定查詢哪張表的資料
	 * @param clz		決定資料類型和屬性
	 * @param pageBean
	 * @return
	 */
	@SuppressWarnings("resource")
	public List<T> executeQuery(String sql,Class clz,PageBean pageBean) {
		List<T> ls = new ArrayList<>();
		PreparedStatement ps = null;
		Connection con = null;
		ResultSet rs = null;
		try {
			con = DBAccess.getConnection();
			if(pageBean!=null && pageBean.isPagination()) {
				//分頁
				String countSql = getCountSql(sql);
				ps = con.prepareStatement(countSql);
				rs = ps.executeQuery();
				if(rs.next()) {
					pageBean.setTotal(rs.getLong(1)+"");
				}
				String pageSql = getPageSql(sql,pageBean);
				ps = con.prepareStatement(pageSql);
				rs = ps.executeQuery();
				
			}else {
				//不分頁
				ps = con.prepareStatement(sql);
				rs = ps.executeQuery();
			}
			while(rs.next()) {
//				ls.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
				/**
				 * 1,建立一個Book對象
				 * 2,從resultset結果集中獲值放入
				 * 3,将已經指派的對象,加入集合
				 */
				T t = (T) clz.newInstance();
				Field[] fields = clz.getDeclaredFields();
				for (Field field : fields) {
					field.setAccessible(true);
					field.set(t, rs.getObject(field.getName()));
				}
				ls.add(t);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBAccess.close(con, ps, rs);
		}
		return ls;
	}
	
	/**
	 * 将原生sql拼接出符合條件的某一頁的資料查詢sql
	 * @param sql
	 * @param pageBean
	 * @return
	 */
	private String getPageSql(String sql, PageBean pageBean) {
		return sql+" limit "+pageBean.getStartIndex()+","+pageBean.getRows();
	}

	/**
	 * 用原生sql拼接出查詢符合條件的記錄數
	 * @param sql
	 * @return
	 */
	private String getCountSql(String sql) {
		// TODO Auto-generated method stub
		return "select count(1) from ("+sql+") t";
	}
}
           

在這通用方法類中,有三個參數,前面兩個代碼有介紹,第三個pageBean是一個實體類,用來控制查詢時是否需要分頁的,因為有時候查詢時并不需要分頁,就比如下拉框:

/**
 * 分頁工具類
 *
 */
public class PageBean {

	private int page = 1;// 頁碼

	private int rows = 10;// 頁大小

	private int total = 0;// 總記錄數

	private boolean pagination = true;// 是否分頁

	public PageBean() {
		super();
	}

	public int getPage() {
		return page;
	}

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

	public int getRows() {
		return rows;
	}

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

	public int getTotal() {
		return total;
	}

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

	public void setTotal(String total) {
		this.total = Integer.parseInt(total);
	}

	public boolean isPagination() {
		return pagination;
	}

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

	/**
	 * 獲得起始記錄的下标
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (this.page - 1) * this.rows;
	}

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

}



           

建立好通用dao方法類之後,在之前的實體類中繼承通用方法類且調用通用方法,:

public class bookDao extends BaseDao<Book>{
	
	/**
	 * 
	 * @param book 是從jsp傳過來的參數封裝成對象作為參數查詢并執行sql
	 * @param pageBean	決定是否分頁
	 * @return
	 */
	public List<Book> list(Book book,PageBean pageBean){
			String sql = "select * from t_mvc_book where 1=1 ";
			if(StringUtils.isNotBlank(book.getBname())) {
				sql += " and bname like '%"+book.getBname()+"%'";
			}
		return super.executeQuery(sql, Book.class, pageBean);
	}
}
           

到這裡就可以運用這個方法啦,接下來實驗一下:

public static void main(String[] args) {
		bookDao bd = new bookDao();
		Book b  = new Book();
		PageBean pageBean = new PageBean();
		//設定查找結果集的第幾頁
//		pageBean.setPage(2);
		//設定不分頁
//		pageBean.setPagination(false);
		//設定查找關鍵字
		b.setBname("不死不滅");
		//設定分頁個數
		pageBean.setRows(10);
		List<Book> ls = bd.list(b, pageBean);
		for (Book book : ls) {
			System.out.println(book);
		}
	}
           
JSP——通用分頁——1Dao方法通用dao

輸出成功!謝謝大家~

繼續閱讀