package com.bin.dao;
import com.bin.utils.DBHelper;
import com.bin.utils.PageBean;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 父类 封装jdbc
* 泛型: 第一种写到类名后面 比如: BaseDao<T>
* 第2中写到方法名中 public <T> T test(){}
*/
public class BaseDao {
/**
* 查所有
* @param sql sql语句
* @param clz 当前类的Class类型 ,可以通过 具体类.class User.class
* @param param 可变参数 ,表示 0 到无限多 就是占位符
* @param <T> 具体返回的类型
* @return
*/
public <T> List<T> findList(String sql,Class<T> clz,Object...param){
Connection conn = DBHelper.getConnection();
ResultSet rs =null;
PreparedStatement ps=null;
List<T> list = new ArrayList<T>();
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < param.length; i++) {
ps.setObject(i+1,param[i]); //给占位符赋值
}
rs = ps.executeQuery();
while(rs.next()){
// User user = new User();
// user.setId(rs.getInt("id"));
// user.setReal_name(rs.getString("real_name"));
//
T bean = rsToBean(rs,clz);
list.add(bean);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper.close(conn,ps,rs);
}
return null;
}
/**
* 通过结果集 rs 给 clz对象 中的属性赋值
* @param rs
* @param clz
* @param <T>
* @return
*/
private <T> T rsToBean(ResultSet rs, Class<T> clz) {
try {
T t = clz.newInstance(); //通过反射拿到一个 类的实例 ,当前类可能是User ,或者是别的类
// 从rs 取值 ,赋值到 t中的 成员变量
ResultSetMetaData metaData = rs.getMetaData(); //获取当前表的 元数据 (表的结构信息)
int columnCount = metaData.getColumnCount(); //拿到列的总数量
for (int i = 0; i < columnCount; i++) {
String columnLabel = metaData.getColumnLabel(i + 1);//拿到 表中 列的名称 ,比如: id user_name/ password/ create_time.....
//user.setId(rs.getInt("id")); rs.getInt("id")===rs.getObject(columnLabel)
Object value = rs.getObject(columnLabel); //取出列名 对应的值
// getDeclaredField() 拿到当前类所有属性
Field field = clz.getDeclaredField(columnLabel); //根据 列名 拿到 类对应的 属性名 ,比如:id user_name/ password/ create_time
field.setAccessible(true); //提高 反射 效率
//赋值
field.set(t,value); //
}
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 查询单个对象
* @param sql
* @param clz
* @param param
* @param <T>
* @return
*/
public <T> T findOne(String sql,Class<T> clz,Object...param){
List<T> list = findList(sql, clz, param);
if(list!=null&&list.size()==1){
return list.get(0);
}
return null;
}
/**
* 删除 (伪删除 ,实际上执行的是更新操作)
* @param sql
* @return
*/
public boolean del(String sql){
Connection conn = DBHelper.getConnection();
PreparedStatement ps =null;
try {
ps = conn.prepareStatement(sql);
int i = ps.executeUpdate();
return i>0;
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper.close(conn,ps);
}
return false;
}
public boolean del(String sql,Integer id){
Connection conn = DBHelper.getConnection();
PreparedStatement ps=null;
try {
ps = conn.prepareStatement(sql);
ps.setObject(1,id);
int i = ps.executeUpdate();
return i>0;
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper.close(conn,ps);
}
return false;
}
/**
* 更新
* @param sql
* @return
*/
public boolean update(String sql,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 i = ps.executeUpdate();
return i>0;
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper.close(conn,ps);
}
return false;
}
/**
* 保存
* @param sql
* @param param
* @return
*/
public int insert(String sql,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 i = ps.executeUpdate();
return i;
/* ResultSet rs = ps.getGeneratedKeys(); //拿到当前自增的主键
if(rs.next()){
return rs.getInt(1); //1代表第1列的名称
}*/
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper.close(conn,ps);
}
return 0;
}
/**
*
* @param sql
* @param page 当前页
* @param limit 每页显示几条?
* @param clz 对应哪一个 表的分页
* @param <T>
* @return
*/
// select * from table limit currentpage, pageSize
/**
* currentpage 在数据库取数据时,从第0个为开始取值 .
* 0 10
* 10 10
* 20 10
*
*/
public <T> PageBean<T> findByPage(String sql, Integer page, Integer limit, Class<T> clz){
int totalCount = getCount(sql); //查询某个表的 所有数据量
// 100个糖果, 分给10个人 . 整好每人10个 , 相当于10页 ,每页10个糖果
//101 /10 =10 , 应该分11份 = 10+1
int totalPages = totalCount%limit==0 ?(totalCount/limit): (totalCount/limit)+1; //总页数
//select * from t_user limit 0,10
int startIndex = (page-1)*limit;
sql = sql+" limit "+startIndex+","+limit;
List<T> data = findList(sql,clz);
PageBean<T> pageBean = new PageBean<T>(page,limit,totalCount,totalPages,data);
return pageBean;
}
//查询某个表的 所有数据量
private int getCount(String str) {
Connection conn = DBHelper.getConnection();
PreparedStatement ps =null;
ResultSet rs=null;
str = "select count(1) from ("+str+") as a"; //查询某个表的 总数量 ,起别名 a
try {
ps = conn.prepareStatement(str);
rs = ps.executeQuery();
if(rs.next()){
return rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper.close(conn,ps,rs);
}
return 0;
}
}
servlet BaseDao 增删改查和分页查询
最新推荐文章于 2022-07-19 20:25:43 发布