文章目錄
- 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);
}
}
輸出成功!謝謝大家~