query()
JdbcTemplate类中还提供了大量的query()方法来处理各种对数据库表的查询操作。其中,常用的几个query()方法如表1所示。
表1 JdbcTemplate中常用的query()方法
方法 | 说明 |
---|---|
List query(String sql, RowMapper rowMapper) | 执行String类型参数提供的SQL语句,并通过RowMapper返回一个List类型的结果。 |
List query(String sql, PreparedStatementSetter pss, RowMapper rowMapper) | 根据String类型参数提供的SQL语句创建PreparedStatement对象,通过RowMapper将结果返回到List中。 |
List query(String sql, Object[] args, RowMapper rowMapper) | 使用Object[]的值来设置SQL语句中的参数值,采用RowMapper回调方法可以直接返回List类型的数据。 |
queryForObject(String sql, RowMapper rowMapper, Object… args) | 将args参数绑定到SQL语句中,并通过RowMapper返回一个Object类型的单行记录 。 |
queryForList(String sql,Object[] args, class<T> elementType) | 该方法可以返回多行数据的结果,但必须是返回列表,elementType参数返回的是List元素类型。 |
了解了几个常用的query()方法后,接下来通过一个具体的案例来演示query()方法的使用,其实现步骤如下。
(1)向数据表account中插入几条数据(也可以使用数据库图形化工具手动向表中插入数据),插入后account表中的数据如图1所示。
图1 account表
(2)在AccountDao中,分别创建一个通过id查询单个账户和查询所有账户的方法,其代码如下所示。
// 通过id查询
public Account findAccountById(int id);
// 查询所有账户
public List<Account> findAllAccount();
(3)在AccountDao接口的实现类AccountDaoImpl中,实现接口中的方法,并使用query()方法分别进行查询,其代码如下所示。
// 通过id查询账户数据信息
public Account findAccountById(int id) {
//定义SQL语句
String sql = "select * from account where id = ?";
// 创建一个新的BeanPropertyRowMapper对象
RowMapper<Account> rowMapper =
new BeanPropertyRowMapper<Account>(Account.class);
// 将id绑定到SQL语句中,并通过RowMapper返回一个Object类型的单行记录
return this.jdbcTemplate.queryForObject(sql, rowMapper, id);
}
// 查询所有账户信息
public List<Account> findAllAccount() {
// 定义SQL语句
String sql = "select * from account";
// 创建一个新的BeanPropertyRowMapper对象
RowMapper<Account> rowMapper =
new BeanPropertyRowMapper<Account>(Account.class);
// 执行静态的SQL查询,并通过RowMapper返回结果
return this.jdbcTemplate.query(sql, rowMapper);
}
在上面两个方法代码中,BeanPropertyRowMapper是RowMapper接口的实现类,它可以自动的将数据表中的数据映射到用户自定义的类中(前提是用户自定义类中的字段要与数据表中的字段相对应)。创建完BeanPropertyRowMapper对象后,在findAccountById()方法中通过queryForObject()方法返回了一个Object类型的单行记录,而在findAllAccount()方法中通过query()方法返回了一个结果集合。
(4)在测试类JdbcTemplateTest中,添加一个测试方法findAccountByIdTest()来测试条件查询,其代码如下所示。
@Test
public void findAccountByIdTest() {
// 加载配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取AccountDao实例
AccountDao accountDao =
(AccountDao) applicationContext.getBean("accountDao");
// 执行findAccountById()方法
Account account = accountDao.findAccountById(1);
System.out.println(account);
}
上述代码通过执行findAccountById()方法获取了id为1的对象信息,并通过输出语句输出。
使用JUnit4测试运行后,控制台的输出结果如图2所示。
图2 运行结果
(5)测试完条件查询单个数据的方法后,接下来测试查询所有用户账户信息的方法。在测试类JdbcTemplateTest中,添加一个测试方法findAllAccountTest(),其代码如下所示。
@Test
public void findAllAccountTest() {
// 加载配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取AccountDao实例
AccountDao accountDao =
(AccountDao) applicationContext.getBean("accountDao");
// 执行findAllAccount()方法,获取Account对象的集合
List<Account> account = accountDao.findAllAccount();
// 循环输出集合中的对象
for (Account act : account) {
System.out.println(act);
}
}
在上述代码中,调用了AccountDao对象的findAllAccount()方法查询所有用户账户信息集合,并通过for循环输出查询结果。
使用JUnit4成功运行findAllUserTest()方法后,控制台的显示信息如图3所示。
图3 运行结果
从图3可以看出,数据表account中的4条记录都已经被查询出来。