使用QueryRunner对象的query方法进行查询时,int类型的字段查询结果为0
首先说结论,使用QueryRunner的query()
方法来查询数据库数据的时候,设计的实体类里面的成员变量的变量名一定要跟数据库表中的字段名相同。
以前我都是使用原生的方法来查询数据库,先获取Connection对象,然后通过它的createStatement()
方法创建Statement对象,或者通过它的prepareStatement()
方法创建PreparedStatement对象,然后通过Statement对象的executeQuery()
方法来获取一个ResultSet结果集。
然后我们需要手动的从结果集中使用对应的getString("字段名")
等方法来获取结果集中的数据,然后再通过实体类的setter初始化对应的成员变量,最后就获取到了一个封装好的实体对象,或是一个实体对象集合。
一个简单的使用PreparedStatement对象来查询数据的例子
// JdbcUtil是一个工具类,可以返回Connection对象
Connection conn = JdbcUtil.getConnection();
if (conn != null) {
// 创建PreparedStatement对象
PreparedStatement pstmt = conn.prepareStatement("select * from student");
// 获取ResultSet对象
rs = pstmt.executeQuery();
// 为学生数据集合创建一个ArrayList对象
List<Student> studentList = new ArrayList<>();
// 遍历结果集
while (rs.next()) {
// 创建学生数据对象
Student student = new Student();
// 把结果集中的数据保存到学生数据对象中
student.setNo(rs.getString("Sno"));
student.setName(rs.getString("Sname"));
// 把学生数据对象添加到集合中
studentList.add(student);
}
}
这样我们就能获得一个学生对象的集合studentList
。这种方式由于是自己手动的get
和set
,所以即使实体类中的int类型的学生学号是no
,而student表中int类型的字段为Sno
,也不会出现问题。
但是在我使用QueryRunner对象的query()
方法进行查询时
// 同样是通过工具类来获取到Connection对象
Connection connection = JdbcUtil.getConnection();
// 获取QueryRunner的实例
QueryRunner queryRunner = new QueryRunner();
String sql = "select * from `student`";
List<Student> studentList = queryRunner.query(connection, sql, new BeanListHandler<Student>(Student.class));
这样我们就能获取到一个学生对象集合studentList
了。
在这里我们不用再手动地通过get
和set
来对实体进行初始化,只需要传递一个结果集的处理类BeanListHandler
的实例来把结果集中的每条记录封装到指定的实体类中,再把这些实体封装到一个List里,就能得到学生集合。对于其他对结果集的处理方法,可以查看它的文档。
由于是自动的封装,我也没有学习过它的源码,所以不知道它的具体实现,但是我在项目中设计的实体类变量名跟表中的字段名不同的情况下,查询到的int类型的结果都是0。
我尝试过其他网上的方法,比如说把字段类型int
改成Integer
,但是没有用。
在把变量名改成和表中的字段名相同后,问题解决。
上一篇: Pawn's Revenge (暴力)
下一篇: MySQL优化GROUP BY方案