通用的查操作步骤:
①获取连接
②PreparedStatement预编译
③执行查询,获取结果集
④获取结果集的元数据ResultSetMetaData
⑤通过ResultSetMetaData获取结果集中的列数
⑥处理结果集一行数据中的每一个列:给t对象指定的属性赋值
⑦获取列值
⑧获取每个列的列名
⑨给T对象指定的columnName属性,赋值为columnValue,通过反射
⑩资源关闭
注:这里的数据库连接以及资源的关闭的方法封装到了Utils包中
package preparedstatement.crud;
import bean.stuinfo;
import org.junit.Test;
import util.JDBCUtils;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author LTH
* @create 2021/1/31 - 16:15
*/
public class MyPreparedStatementQueryTest {
@Test
public void testGetForList() throws Exception {
String sql = "select id, name ,birthday from stuinfo where id <= ?";
List<stuinfo> list = getForList(stuinfo.class, sql, 6);
for (stuinfo s : list) {
System.out.println(s);
}
}
//通用的查询操作
public <T> List<T> getForList(Class<T> clazz, String sql, Object... args) throws Exception {
//1.获取连接
Connection connection = JDBCUtils.getConnection();
//2.PreparedStatement预编译
PreparedStatement ps = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
//3.执行查询,获取结果集
ResultSet rs = ps.executeQuery();
//4.获取结果集的元数据ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
//5.通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
//6.处理结果集一行数据中的每一个列:给t对象指定的属性赋值
ArrayList<T> list = new ArrayList<>();
while(rs.next()){
T t = clazz.getConstructor().newInstance();
for (int i = 0; i < columnCount; i++) {
//7.获取列值
Object columnValue = rs.getObject(i + 1);
//8.获取每个列的列名
String columnLabel = rsmd.getColumnLabel(i + 1);
//9.给T对象指定的columnName属性,赋值为columnValue,通过反射
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
list.add(t);
}
//10.资源关闭
JDBCUtils.clossResource(connection,ps,rs);
return list;
}
}