通用查询分页

思维导图

 一、后端

加载驱动(驱动包由MySQL版本决定)

       mysql5.7--com.mysql.jdbc.Driver

        mysql8--com.mysql.cj.jdbc.Driver

工具类(可以匹配多个数据源)

一(1)简单查询

1.1步骤

1、建立数据库连接
2、预定义对象prepareStartement
3、执行查询sql
4、处理结果集

代码:


	public List<Book> list(Book book) throws Exception{
		List<Book> list=new ArrayList<Book>();
		String sql="select * from t_mvc_book where 1=1";
		//书籍名称
		String bname=book.getBname();
		//书籍名称模糊查询
		if(StringUtils.isNotBlank(bname)) {
			sql+=" and bname like '%"+bname+"%'";
		}
		con=DBAccess.getConnection();
		ps=con.prepareStatement(sql);
		rs=ps.executeQuery();
		while(rs.next()) {
			list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
		}
		return list;
	}
	

1.2分析不足


        1.2.1、以上3步(建立数据库连接、PrepareStatement、查询结果集)都是需要                     重复的,代码重复的
        1.2.2、都是要返回数据库对应的集合
        1.2.3、都是要处理结果集ResultSet rs
                 代码不一样:具体体现在,不同表会有不同字段,那么是体内对应的属性就                   会 不一样;
      总结:需要写大量重复代码,系统中的查询功能越来越多,重复代码量变大
     

一(2)通用查询功能

          提供解决方案
             1、抽取变化部分作为参数:sql、Class(Book.class,article.class)
              2、抽取公共的父类,把重复的代码剥离出来(作为父类被子类继承供其使用)
    如下:(所有dao层父类)

package com.DHM.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.DHM.util.DBAccess;
import com.DHM.util.PageBean;
/**
 * 所有dao层的父类
 * @author T440s
 *
 * @param <T>
 */
public class BaseDao<T> {
	/**
	 * 提供解决方案:
	 * 1、抽取变化部分作为参数:sql、Class(Book.class,article.class)
	 * 2、抽取公共的父类,把重复的代码剥离出来
	 */
	
	private Connection con;
	private PreparedStatement ps;
	private ResultSet rs;
	
	public List<T> list(String sql,Class<T> clz, PageBean pageBean) throws Exception{
		//不确定List集合中装了什么东西 子类Dao继承BaseDao<T>,子类传递什么类.class,那么List集合中放什么。
		List<T> list=new ArrayList<T>();
		 con=DBAccess.getConnection();
		ps=con.prepareStatement(sql);
		rs=ps.executeQuery();
		while(rs.next()) {
			//代码不一样:具体体现在,不同表会有不同字段,那么是体内对应的属性就会不一样;
			//list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
			/**
			 * 1、实例化一个对象
			 * 2、从ResultSet对象的属性(bid)获取值,赋值给了前面的实例化的对象
			 * 3、把已经赋值的对象,添加到List集合中
			 */
			//实例化
			T t=clz.newInstance();
			//从ResultSet对象的属性(bid)获取值,赋值给了前面的实例化的对象
			Field[] fields = clz.getDeclaredFields();
			for (Field f : fields) {
				//打开权限
				f.setAccessible(true);
				f.set(t, rs.getObject(f.getName()));
			}
			//把已经赋值的对象,添加到List集合中
			list.add(t);
		}
		return list;
	}

继承的子类:

bookDao

package com.DHM.Dao;

public class BookDao extends BaseDao<Book>{
	
	public List<Book> list2(Book book) throws Exception{
		String sql="select * from t_mvc_book where 1=1";
		//书籍名称
		String bname=book.getBname();
		//书籍名称模糊查询
		if(StringUtils.isNotBlank(bname)) {
			sql+=" and bname like '%"+bname+"%'";
		}
		
		return super.list(sql, Book.class, class);
	}
}

ActicleDao 

public class ActicleDao extends BaseDao<Acticle>{
	private Connection con;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值