关于jdbc

package com.jdbc.dao;

import com.jdbc.util.DBUtil;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

public class BaseDao {
public static <T> List<T> findAll(String sql,Class<T> cla,Object... obj){
//1、获取数据库连接
Connection conn = DBUtil.getConnection();
//2、定义批处理对象
PreparedStatement ps=null;
//3、定义结果集对象
ResultSet rs=null;
//4、定义返回值集合
List<T> list=new ArrayList<>();
try {
//5、获取批处理对象
ps = conn.prepareStatement(sql);
//6、如果有参数那就把值设置进去,比如我查询一个id,如果id为1
//那么ps.setObject(i+1,obj[i])=ps.setInt(1,obj[0])
//obj[o]=1
for (int i = 0; i < obj.length; i++) {
ps.setObject(i+1,obj[i]);
}
//7、执行,并把值返回到结果集
rs=ps.executeQuery();
//8、现在有了列名但是每个列没有值,所以,我们需要从结果集里面获取
while (rs.next()){
//每一行就相当于一个javaBean对象
T t=rsToBean(rs,cla);
//通过上面的操作我们已经获取到了指定的JavaBean对象,把他添加进集合就完成了
list.add(t);
}
}catch (Exception e){
e.printStackTrace();
}finally {
DBUtil.close(conn,ps,rs);
}
return list;
}

public static <T> T selectOne(String sql,Class<T> cla,Object... obj) {
//先执行全查询
List<T> list = findAll(sql, cla, obj);
//如果集合里面有参数,那么返回第一位
if (list.size()>0){
return list.get(0);
}
//否则返回null
return null;
}

public static int editBase(String sql,Object... obj){
//1、获取数据库连接
Connection conn = DBUtil.getConnection();
//2、定义批处理对象
PreparedStatement ps=null;
try {
//5、获取批处理对象
ps = conn.prepareStatement(sql);
for (int i = 0; i < obj.length; i++) {
ps.setObject(i+1,obj[i]);
}
//7、执行
ps.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
DBUtil.close(conn,ps);
}
return -1;
}

public static <T> T rsToBean(ResultSet rs, Class<T> cla) {
T t=null;
try {
//1、首先实例化指定的类
t=cla.newInstance();
//2、通过结果集获得结果集里的源数据
ResultSetMetaData metaData = rs.getMetaData();
//3、由于我们不知道这个表有多少列,所以我们要获取到列数
int columnCount = metaData.getColumnCount();
//4、我们有了列数,就可以从源数据中循环,给每一列赋值
for (int i = 0; i < columnCount; i++) {
//那么首先我们需要获取到列名,因为getColumnLabel的下标是从1开始,
// 而我们的循环是从0开始,所以为了字段和值一一对应,所以我们要i+1
String columnLabel = metaData.getColumnLabel(i+1);
//现在有了列名,然后需要获取列值,我们依旧从源数据中获取列值
//我们需要根据列名获取到对应的列值
Object object = rs.getObject(columnLabel);
//根据表的列名找到 参数cla 的属性
Field declaredField = cla.getDeclaredField(columnLabel);
//由于我们要在外面操作,所以我们需要设置权限,这样我们就可以操作了
declaredField.setAccessible(true);
//现在我们已经通过反射把表的列名和JavaBean的属性对应了起来,
//而且我们也获取到了列名和列值对应的数据,接下来我们把数据写进去,
//就获得了JavaBean对象中的一个属性值
declaredField.set(t,object);
}
}catch (Exception e){
e.printStackTrace();
}
return t;
}
}
原文地址:https://www.cnblogs.com/zhboke/p/13962150.html