package com.hope.dao;
import com.hope.util.DBHelper;
import com.hope.util.PageBean;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 抽取CRUD_BaseDao工具类 所有操作
*/
public class BaseDao {
/*
关闭资源
*/
public void close(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (conn != null) {
conn.close();
}
if (ps != null) {
conn.close();
}
if (rs != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* @param sql
* @param cls 通过反射可以拿到具体类
* @param param 可变参数,内部是数组
* @param <T>
* @return
*/
public <T> List<T> findList(String sql, Class<T> cls, Object... param) {
List<T> list = new ArrayList<T>();
Connection conn = DBHelper.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取数据库操作对象
ps = conn.prepareStatement(sql);
//占位符赋值
for (int i = 0; i < param.length; i++) {
ps.setObject(i + 1, param[i]);
}
//执行SQL 返回结果集
rs = ps.executeQuery();
//循环判断指定当前游标是第一行 是否有下一个值
while (rs.next()) {
//通过查询的结果集 转换成一个具体的实体类 进行给对象赋值
T bean = rsToBean(rs, cls);
list.add(bean);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(conn, ps, rs);
}
return null;
}
/**
* 测试连接数据库
*
* @param args
*/
public static void main(String[] args) {
System.out.println(DBHelper.getConnection());
}
/**
* 将结果集中的 数据 转成一个 具体实体类
*
* @param rs 数据集
* @param cls class对象
* @param <T> 具体实例
* @return
*/
private <T> T rsToBean(ResultSet rs, Class<T> cls) {
try {
//将传过来的类对象实例化 给t实例化
T t = cls.newInstance();
ResultSetMetaData metaData = rs.getMetaData();//元数据 拿到表的结构
int columnCount = metaData.getColumnCount();//数据表的所有列的数量
for (int i = 0; i < columnCount; i++) {
String columnLabel = metaData.getColumnLabel(i + 1);//metaData.getColumnLabel(i+1) 拿到第几列 例如:获取到列名 id/user_name/password
//通过获取的字段名 获取值
Object value = rs.getObject(columnLabel);
//通过数据表中获取到的字段名 拿到 对象类中的属性名 field==com.hope.entity.User.id属性
//getDeclaredField() 仅能获取类本身的属性成员(包括私有、共有、保护)
Field field = cls.getDeclaredField(columnLabel);
//setAccessible(true)进行暴力访问 忽略掉修饰符
field.setAccessible(true);
//给t类的field属性赋值value
field.set(t, value);
}
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 查询单个对象
*
* @param sql
* @param cls
* @param param
* @param <T>
* @return
*/
public <T> T findOne(String sql, Class<T> cls, Object... param) {
List<T> list = findList(sql, cls, param);
if (list != null && list.size() == 1) {
return list.get(0);
}
return null;
}
/**
* 伪删除
*
* @param sql
* @param cls
* @param param
* @param <T>
* @return
*/
public <T> boolean falseDel(String sql, Class<T> cls, Object... param) {
Connection conn = DBHelper.getConnection();
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < param.length; i++) {
ps.setObject(i + 1, param[i]);
}
int num = ps.executeUpdate();
return num > 0;
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(conn,ps,null);
}
return false;
}
/** CRUD 通用 只需修改sql语句
* 添加用户方法
* @param sql
* @param cls
* @param param
* @param <T>
* @return
*/
public <T> boolean CRUD(String sql, Class<T> cls, Object... param) {
Connection conn = DBHelper.getConnection();
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < param.length; i++) {
ps.setObject(i + 1, param[i]);
}
int num = ps.executeUpdate();
return num > 0;
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(conn,ps,null);
}
return false;
}
public <T> PageBean<T> findPageBean(String sql,Integer page,Integer limit,Class<T> clz){
PageBean<T> pageBaen=null;
/**这里需要准备 PageBean 缺失的 参数 .
* Integer page, Integer limit, Integer totalCount, Integer totalPages, List<T> list
*/
int totalCount=getSql_Conut(sql);//查询当前表的总条数
int totalPages=totalCount%limit==0?(totalCount/limit):(totalCount/limit)+1; //总页数
//sql语句 == select * from t_user limit 0,10;
int starIndex=(page+1)*limit;//起始页
sql=sql+" limit "+starIndex+","+limit;
List<T> list=findList(sql,clz);
pageBaen=new PageBean<T>(page,limit,totalCount,totalPages,list);
return null;
}
/**
* 查询 总条数 select count(*) from 表名
* @param sql
* @return
*/
private int getSql_Conut(String sql) {
// 查询 表中 所有条数 并给一个别名
sql="select count(*) from ("+sql+") as count";
Connection conn = DBHelper.getConnection();
PreparedStatement ps = null;
ResultSet rs=null;
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if (rs.next()){
//返回的是 count(*) 计数的值
return rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(conn,ps,rs);
}
return 0;
}
}
Servlet抽取增删改查做BaseDao父类
最新推荐文章于 2022-05-06 20:36:32 发布