思维导图
一、后端
加载驱动(驱动包由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;