跟着尚硅谷的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 List excuteQuery(Class 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 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 users = excuteQuery(BnakCustomer.class, sql,1);
System.out.println(users);
}
参考GPT和自己的思路:
根据您提供的代码和错误信息分析,问题出在了 BnakCustomer 类的 money 属性上,这个属性的类型是 Integer,但是查询结果中出现了 NULL 值,导致 NullPointerException。解决方法是将 money 属性改成 int 类型即可,或者在查询时对这个字段进行判空处理。
至于您想要使用工具类进行查询的问题,您可以在测试类中调用 BaseDao 类的 excuteQuery 方法,并传入对应的参数,即可使用这个工具类进行查询。具体示例代码如下:
@Test
public void testSelect() throws Exception {
// 编写 SQL 语句
String sql = "SELECT * FROM t_bank WHERE account=?";
// 调用工具类查询数据
List<BnakCustomer> customers = new BaseDao().excuteQuery(BnakCustomer.class, sql, "ergouzi");
// 打印查询结果
System.out.println(customers);
}
BaseDao dao = new BaseDao();
dao.excute(...)