学科分类
目录
SSM框架

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条记录都已经被查询出来。

点击此处
隐藏目录