使用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。这种方式由于是自己手动的getset,所以即使实体类中的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了。

在这里我们不用再手动地通过getset来对实体进行初始化,只需要传递一个结果集的处理类BeanListHandler的实例来把结果集中的每条记录封装到指定的实体类中,再把这些实体封装到一个List里,就能得到学生集合。对于其他对结果集的处理方法,可以查看它的文档。

由于是自动的封装,我也没有学习过它的源码,所以不知道它的具体实现,但是我在项目中设计的实体类变量名跟表中的字段名不同的情况下,查询到的int类型的结果都是0。

我尝试过其他网上的方法,比如说把字段类型int改成Integer,但是没有用。

在把变量名改成和表中的字段名相同后,问题解决。

很好,这是一个完整的Java Web项目的实现。我将逐一回答你的问题。 1. 在mysql数据库中创建mydb数据库,创建用户表t_user ,表字段如下: ```sql CREATE DATABASE mydb; USE mydb; CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, password VARCHAR(20) NOT NULL, email VARCHAR(20) DEFAULT NULL ); ``` 2. 创建User类,用于封装表数据; ```java public class User { private int id; private String name; private String password; private String email; // getter and setter methods } ``` 3. 编写JDBCUtils工具类,类中要包含获取连接和释放资源的方法 ```java public class JDBCUtils { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false"; private static final String USERNAME = "root"; private static final String PASSWORD = "password"; public static Connection getConnection() throws SQLException, ClassNotFoundException { Class.forName(DRIVER); return DriverManager.getConnection(URL, USERNAME, PASSWORD); } public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException se2) { } try { if (stmt != null) { stmt.close(); } } catch (SQLException se2) { } try { if (conn != null) { conn.close(); } } catch (SQLException se) { se.printStackTrace(); } } } ``` 4. 创建一个UserDao类,在该类中编写对数据库进行增删改查的方法,包括insert(User user)、update(User user)、delete(int id)、queryAll( )等方法,分别实现插入、更新、删除和查询所有记录的方法。 ```java public class UserDao { public void insert(User user) { Connection conn = null; PreparedStatement stmt = null; try { conn = JDBCUtils.getConnection(); String sql = "INSERT INTO t_user(name, password, email) VALUES (?, ?, ?)"; stmt = conn.prepareStatement(sql); stmt.setString(1, user.getName()); stmt.setString(2, user.getPassword()); stmt.setString(3, user.getEmail()); stmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.close(conn, stmt, null); } } public void update(User user) { Connection conn = null; PreparedStatement stmt = null; try { conn = JDBCUtils.getConnection(); String sql = "UPDATE t_user SET name=?, password=?, email=? WHERE id=?"; stmt = conn.prepareStatement(sql); stmt.setString(1, user.getName()); stmt.setString(2, user.getPassword()); stmt.setString(3, user.getEmail()); stmt.setInt(4, user.getId()); stmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.close(conn, stmt, null); } } public void delete(int id) { Connection conn = null; PreparedStatement stmt = null; try { conn = JDBCUtils.getConnection(); String sql = "DELETE FROM t_user WHERE id=?"; stmt = conn.prepareStatement(sql); stmt.setInt(1, id); stmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.close(conn, stmt, null); } } public List<User> queryAll() { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; List<User> userList = new ArrayList<>(); try { conn = JDBCUtils.getConnection(); String sql = "SELECT * FROM t_user"; stmt = conn.prepareStatement(sql); rs = stmt.executeQuery(); while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); user.setEmail(rs.getString("email")); userList.add(user); } } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.close(conn, stmt, rs); } return userList; } } ``` 5. 创建测试类Test1,对上述UserDao中定义的方法进行测试输出。 ```java public class Test1 { public static void main(String[] args) { UserDao userDao = new UserDao(); // 测试插入 User user1 = new User(); user1.setName("user1"); user1.setPassword("123456"); user1.setEmail("user1@test.com"); userDao.insert(user1); // 测试更新 User user2 = new User(); user2.setId(1); user2.setName("user2"); user2.setPassword("654321"); user2.setEmail("user2@test.com"); userDao.update(user2); // 测试查询 List<User> userList = userDao.queryAll(); for (User user : userList) { System.out.println(user.getId() + "\t" + user.getName() + "\t" + user.getPassword() + "\t" + user.getEmail()); } // 测试删除 userDao.delete(1); } } ``` 6. 尝试使用C3P0数据库连接池和DBUtils工具,完成上述一样的操作,对应dao类为C3P0UserDao,C3P0Utils工具类获取数据源。 ```java public class C3P0Utils { private static ComboPooledDataSource dataSource; static { try { dataSource = new ComboPooledDataSource(); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb?useSSL=false"); dataSource.setUser("root"); dataSource.setPassword("password"); } catch (Exception e) { e.printStackTrace(); } } public static DataSource getDataSource() { return dataSource; } } ``` ```java public class C3P0UserDao { private QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); public void insert(User user) { String sql = "INSERT INTO t_user(name, password, email) VALUES (?, ?, ?)"; try { queryRunner.update(sql, user.getName(), user.getPassword(), user.getEmail()); } catch (SQLException e) { e.printStackTrace(); } } public void update(User user) { String sql = "UPDATE t_user SET name=?, password=?, email=? WHERE id=?"; try { queryRunner.update(sql, user.getName(), user.getPassword(), user.getEmail(), user.getId()); } catch (SQLException e) { e.printStackTrace(); } } public void delete(int id) { String sql = "DELETE FROM t_user WHERE id=?"; try { queryRunner.update(sql, id); } catch (SQLException e) { e.printStackTrace(); } } public List<User> queryAll() { String sql = "SELECT * FROM t_user"; try { return queryRunner.query(sql, new BeanListHandler<>(User.class)); } catch (SQLException e) { e.printStackTrace(); } return null; } } ``` 7. 在C3P0UserDao类中编写对数据库进行增删改查的方法,包括insert(User user)、update(User user)、delete(int id)、queryAll( )等方法,分别实现插入、更新、删除和查询所有记录的方法。 ```java public class C3P0UserDao { private QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource()); public void insert(User user) { String sql = "INSERT INTO t_user(name, password, email) VALUES (?, ?, ?)"; try { queryRunner.update(sql, user.getName(), user.getPassword(), user.getEmail()); } catch (SQLException e) { e.printStackTrace(); } } public void update(User user) { String sql = "UPDATE t_user SET name=?, password=?, email=? WHERE id=?"; try { queryRunner.update(sql, user.getName(), user.getPassword(), user.getEmail(), user.getId()); } catch (SQLException e) { e.printStackTrace(); } } public void delete(int id) { String sql = "DELETE FROM t_user WHERE id=?"; try { queryRunner.update(sql, id); } catch (SQLException e) { e.printStackTrace(); } } public List<User> queryAll() { String sql = "SELECT * FROM t_user"; try { return queryRunner.query(sql, new BeanListHandler<>(User.class)); } catch (SQLException e) { e.printStackTrace(); } return null; } } ``` 8. 创建测试类Test2,对上述C3P0UserDao中定义的方法进行测试输出。 ```java public class Test2 { public static void main(String[] args) { C3P0UserDao userDao = new C3P0UserDao(); // 测试插入 User user1 = new User(); user1.setName("user1"); user1.setPassword("123456"); user1.setEmail("user1@test.com"); userDao.insert(user1); // 测试更新 User user2 = new User(); user2.setId(1); user2.setName("user2"); user2.setPassword("654321"); user2.setEmail("user2@test.com"); userDao.update(user2); // 测试查询 List<User> userList = userDao.queryAll(); for (User user : userList) { System.out.println(user.getId() + "\t" + user.getName() + "\t" + user.getPassword() + "\t" + user.getEmail()); } // 测试删除 userDao.delete(1); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值