跟着尚硅谷的jdbc视频写了一个查询的工具类,但是具体使用的时候出了点问题。
具体代码
package com.glut.api.utils;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BaseDao {
public <T> List<T> excuteQuery(Class<T> clazz, String sql, Object... params) throws SQLException, InstantiationException, IllegalAccessException, NoSuchFieldException {
//获取连接
Connection connection = JdbcUtilsV2.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//?赋值
if(params!=null&¶ms.length!=0){
for (int i = 1; i <= params.length; i++) {
preparedStatement.setObject(i,params[i-1]);
}
}
//接收结果
ResultSet resultSet = preparedStatement.executeQuery();
//解析结果
List<T> list=new ArrayList<>();
//metaData 装的当前结果集列的信息对象
ResultSetMetaData metaData = resultSet.getMetaData();
//可以这样水平遍历列
int columnCount = metaData.getColumnCount();
while(resultSet.next()){
//一行数据对应一个T类型对象
T t =clazz.newInstance();//调用类的无参构造函数实例化对象
//自动遍历列 要从1开始,并且小于等于总列数
for(int i=1;i<=columnCount;i++){
//获取指定对象下角标的值 resultSet
Object value = resultSet.getObject(i);
//获取指定列的下角标的列的名称 ResultSetMetaData
//getColumnLabel:会获取别名,没有别名才是列名 getColumnName:只会获取名称
String propertyName = metaData.getColumnLabel(i);
//反射,给对象的属性值赋值
Field field = clazz.getDeclaredField(propertyName);
field.setAccessible(true);//属性可以设置,打破private的修饰限制
/**
* 参数1:要赋值的对象 如果属性是静态,第一个参数可以为null
* 参数2:具体的属性值
*/
field.set(t, value);
}
list.add(t);
}
//关闭资源
resultSet.close();
preparedStatement.close();
if(connection.getAutoCommit()){
//没有事务,可以关闭
JdbcUtilsV2.freeConnection();
}
return list;
}
}
这是创建数据库的sql语句,一共有两条数据。
CREATE TABLE t_bank (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'账号主键',
account VARCHAR(20)NOT NULL UNIQUE COMMENT'账号',
money INT UNSIGNED COMMENT'金额,不能为负值');
INSERT INTO t_bank (account , money) VALUES
( 'ergouzi',1000), ( 'lvdandan',1000) ;
接下来写了一个类,
package com.glut.api.utils;
public class BnakCustomer {
Integer id;
String account;
Integer money;
}
就是我用下面这个方法运行,会出错,错误码是Can not set java.lang.Integer field com.glut.api.utils.BnakCustomer.money to null value,可能是我自己写的代码的问题,最上面的那个查询的工具类应该是没有问题,因为是跟着敲的,我想问一下,如果我想使用上面那个工具类查询,我应该怎么写?
@Test
public void testSelect() throws Exception {
//3.编写SQL语句
String sql = "select * from t_bank where id =?";
//BnakCustomer u =new BnakCustomer();
List<BnakCustomer> users = excuteQuery(BnakCustomer.class, sql,1);
System.out.println(users);
}