一.思维导图:
二.需要用到的架包
三.简单的查询功能
1.编码思路 :
①建立数据库连接
②定义预定义对象preparestatement
③.查询结果集
④返回结果集
2.代码举例:
package com.pjl.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;
import com.zy.entity.Book;
import com.zy.util.DBAccess;
import com.zy.util.PageBean;
import com.zy.util.StringUtils;
/**
* 所有dao层的父类
* @author zjjt
*
* @param <T>
*/
public class BaseDao<T> {
/*1抽取变化部分作为参数
* sql,Class对象(Book,Article)
* 2.抽取公共的父类:把重复性代码剥离出来啊
* s
* @throws Exception
*/
public List<T> list(String sql,Class<T> clz) throws Exception{
List<T> list=new ArrayList<T>();
//不确定list集合装了什么东西
Connection con=DBAccess.getConnection();
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
//1实例化了一个对象 2从ResultSet的对象的属性(bid)获取值赋值给了前面赋值的实例化对象
//books.add(new Book(rs.getInt("bid"),rs.getString("bname"), rs.getFloat("price")));
T t=clz.newInstance();
Field[] fields = clz.getDeclaredFields();
for (Field f : fields) {
//打开权限
f.setAccessible(true);
f.set(t,rs.getObject(f.getName()));
}
//3把已经赋值了的对象添加到list集合中
list.add(t);
}
return list;
}
}
package com.pjl.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.zy.entity.Book;
import com.zy.util.DBAccess;
import com.zy.util.PageBean;
import com.zy.util.StringUtils;
public class bookDao extends BaseDao<Book>{
/**
* 简单的查询
* 思路 :1建立数据库连接
* 2定义预定义对象preparestatement
* 3查询结果集
* 4返回结果集
* @throws Exception
*/
普通方法 没有继承父类
public List<Book> list(Book book) throws Exception{
List<Book> books=new ArrayList<Book>();
String sql="select * from t_mvc_book where 1=1 ";
//书籍名称
String bname = book.getBname();
//书籍名称模糊查询 圣墟最终是通过jsp页面传递过来的
if(StringUtils.isNotBlank(bname)) {
sql+=" and bname like '%"+bname+"%'";
}
Connection con=DBAccess.getConnection();
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
books.add(new Book(rs.getInt("bid"),rs.getString("bname"), rs.getFloat("price")));
}
return books;
}
继承了父类的方法 代码明显要少,
public List<Book> list1(Book book) throws Exception{
String sql="select * from t_mvc_book where 1=1";
String bname = book.getBname();
//书籍名称模糊查询 圣墟最终是通过jsp页面传递过来的
if(StringUtils.isNotBlank(bname)) {
sql+=" and bname like '%"+bname+"%'";
}
return super.list(sql, Book.class);
}
测试
public static void main(String[] args) throws Exception {
bookDao bo=new bookDao();
Book book=new Book();
book.setBname("圣墟");
List<Book> list=bo.list(book);
for (Book book2 : list) {
System.out.println(book2);
}
}
}
3.不足之处:
①数据库连接 定义预定义对象 查询结果集 都是重复代码
②都是要返回数据库表对应的集合
③都是要处理结果集
4.代码不一样在于:
①具体体现在 不同表有不同的字段,那么实体类对应的属性就会不一样
② 需要写大量的重复代码,系统的查询功能越多重复代码量越大
4. 解决方案:
①:抽取变化部分作为参数 ②抽取公共的父类,把重复性的代码抽出来
四.通用前台分页
PageBean类:
package com.pjl.util;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
/**
* 分页工具类
*
*/
public class PageBean {
private int page = 1;// 页码
private int rows = 10;// 页大小
private int total = 0;// 总记录数
private boolean pagination = true;// 是否分页
private String url;//保存上一次请求的url
private Map<String, String[]> paraMap