jdbcTemplate的queryForList

本文详细介绍了jdbcTemplate的各种查询方法,包括queryForInt、queryForObject、queryForList等,并提供了具体的使用示例。同时,还解释了如何配置jdbcTemplate以及一些注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jdbcTemplate的queryForList的使用方法如下,它不一样的地方是,它获得的结果,会再放到一个map里去:

  • List rows = jdbcTemplate.queryForList("SELECT * FROM USER");   
  • Iterator it = rows.iterator();   
  • while(it.hasNext()) {   
  •     Map userMap = (Map) it.next();   
  •     System.out.print(userMap.get("user_id") + "\t");   
  •     System.out.print(userMap.get("name") + "\t");   
  •     System.out.print(userMap.get("sex") + "\t");   
  •     System.out.println(userMap.get("age") + "\t");   
  •  

    我的一个例子中,得到的结果只有一列数字类型的数据(targer_id),但使用queryForList得到的结果集个数与数据库的内容一致,但每一项都是null。不清楚其原因,修改成

    jdbcTemplate.query(sql, 

    才能正确得到结果。



    附上带用的一些方法

    使用jdbcTemplate查询数据的时候可以使用queryForXXX等方法。下面我们就一一解析一下:
    1、jdbcTemplate.queryForInt()和jdbcTemplate.queryForLong()
    --使用queryForInt返回user表中的记录数量,queryForInt搭配这样的sql可以在分页的时候计算总记录数
    jdbcTemplate.queryForInt("select count(*) from user");

    2、jdbcTemplate.queryForObject()
    --本质上和queryForInt相同,只是可以返回不同的对象,例如返回一个String对象
    String name = (String) jdbcTemplate.queryForObject(  --3个参数,1、sql 2、要传递的参数数组 3、返回来的对象class
    "SELECT name FROM USER WHERE id = ?",  
    new Object[] {id},  
    java.lang.String.class);

    3、jdbcTemplate.queryForList(???)
    --返回一个装有map的list,每一个map是一条记录,map里面的key是字段名
    List rows = jdbcTemplate.queryForList("SELECT * FROM user");  --得到装有map的list
    for(int i=0;i<rows.size();i++){                   --遍历
    Map userMap=rows.get(i);
    System.out.println(userMap.get("id"));  
    System.out.println(userMap.get("name"));  
    System.out.println(userMap.get("age"));
    }


    4、jdbcTemplate.queryForMap(SQL)
    --这个查询只能是查询一条记录的查询,返回一个map,key的值是column的值
    Map map = jdbcTemplate.queryForMap("select count(*) as keyval from user");
    map.get("keyval")


    5、jdbcTemplate.queryForRowSet(???)
    --返回一个RowSet   然后调用.getString或者getInt等去取值




    6、jdbc1.query(sql, new RowCallbackHandler()
    --返回一个ResultSet对象, processRow有自动循环的机制,它会自动执行processRow中的语句直到
    --rs的size执行完了为止。我们可以在这其中用list完成对象的转移,只不过list要用final来修饰
    jdbc1.query(sql, new RowCallbackHandler() { //editing
                public void processRow(ResultSet rs) throws SQLException {
            VideoSearch vs = new VideoSearch();
            vs.setRECORDINGFILENAME(rs.getString("RECORDINGFILENAME"));
            vs.setCALLID(rs.getString("CALLID"));
            list.add(vs);

        }
        }

    说明:
    JDBCTemplate的使用方法:
    在ApplicationContext.xml中定义一个jdbcTemplate的节点,使用POJO注入,获得注入后可以执行操作
    不需要继承什么基类

    <bean id="jdbcTemplate"
    class="org.springframework.jdbc.core.JdbcTemplate">            
          <property name="dataSource" ref="dataSource"/>         
    </bean>

    SqlRowSet rs = jdbcTemplate.queryForRowSet(sql, params);
    jdbcTemplate有很多的ORM化回调操作将返回结果转为对象列表,
    但很多时候还是需要返回ResultSet,Spring有提供一个类似ResultSet的,实现JDBC3.0 RowSet接口的Spring SqlRowSet
    注意
    jdbcTemplate尽量只执行查询操作,莫要进行更新,否则会破坏Hibernate的二级缓存体系
     

<think>我们正在讨论Spring框架中的JdbcTemplate类,特别是queryForList方法。根据用户需求,需要提供该方法的使用指南和示例代码。同时,根据系统指令,需要正确使用LaTeX格式,生成相关问题,并在回答中引用相关段落时添加引用标识。首先,回顾一下JdbcTemplatequeryForList方法:-queryForList用于执行SQL查询并返回一个List,其中每个元素是一个Map,代表一行数据,键是列名,值是对应的数据。-该方法有多个重载版本,常用的包括:1.`List<Map<String,Object>>queryForList(Stringsql)`2.`List<Map<String,Object>>queryForList(Stringsql,Object...args)`3.`<T>List<T>queryForList(Stringsql,Class<T>elementType)`4.`<T>List<T>queryForList(Stringsql,Class<T>elementType,Object...args)`接下来,根据引用内容,我们可以参考:-引用[1]和[3]提到了如何配置数据源和创建JdbcTemplate实例。-引用[2]是响应式编程的内容,与当前问题无关。-引用[4]是SpringMVC视图解析,无关。-引用[5]是缓存配置,无关。因此,我们将主要参考引用[1]和[3]来构建回答。回答结构:1.简要介绍queryForList方法。2.展示如何配置数据源和JdbcTemplate(参考引用[1]和[3])。3.提供不同重载方法的使用示例。4.注意事项。同时,生成相关问题。注意:所有行内数学表达式用$...$,独立公式用$$...$$(但这里可能用不上数学公式,所以主要关注代码示例)。最后,生成相关问题。</think>### Spring JdbcTemplate queryForList 方法使用指南 `queryForList` 是 Spring JdbcTemplate 的核心查询方法之一,用于执行 SQL 查询并将结果映射为 `List` 集合。根据返回数据类型可分为两种主要形式: #### 一、基础配置(参考引用[1][3]) 1. **配置数据源**(application.properties): ```properties spring.datasource.url=jdbc:mysql://localhost:3306/testdb spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 2. **注入 JdbcTemplate**: ```java @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } // [^1] ``` #### 二、方法重载及示例 ##### 1. 返回 `List<Map<String, Object>>` 每行数据以 `Map` 形式存储(键=列名,值=数据): ```java // 无参数查询 List<Map<String, Object>> result = jdbcTemplate.queryForList( "SELECT id, name FROM users" ); // 带参数查询(预防SQL注入) List<Map<String, Object>> result = jdbcTemplate.queryForList( "SELECT * FROM products WHERE price > ?", 50.0 // 参数值 ); ``` **结果示例**: ```json [ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"} ] ``` ##### 2. 返回 `List<T>`(指定元素类型) 直接映射为基本类型或包装类的集合: ```java // 获取单列数据(如List<String>) List<String> names = jdbcTemplate.queryForList( "SELECT name FROM departments", String.class // 元素类型 ); // 带参数的单列查询 List<Integer> ids = jdbcTemplate.queryForList( "SELECT id FROM orders WHERE status = ?", Integer.class, // 元素类型 "SHIPPED" // SQL参数 ); ``` #### 三、注意事项 1. **结果集要求**: - 返回 `List<Map>` 时:适用于多列查询 - 返回 `List<T>` 时:**SQL必须仅查询单列**,否则抛出 `IncorrectResultSizeDataAccessException` 2. **参数绑定**: 使用 `?` 占位符传递参数,自动处理类型换和 SQL 注入防护: ```java jdbcTemplate.queryForList( "SELECT email FROM users WHERE age BETWEEN ? AND ?", String.class, 18, // 第一个参数 30 // 第二个参数 ); ``` 3. **空结果处理**: - 当查询无结果时返回**空集合**(非 `null`),可直接调用 `size()` 判断 #### 四、完整示例 ```java @Repository public class UserDao { private final JdbcTemplate jdbcTemplate; public UserDao(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } // 获取所有用户ID(单列) public List<Long> getAllUserIds() { return jdbcTemplate.queryForList( "SELECT id FROM users", Long.class ); } // 按角色查询用户详情(多列) public List<Map<String, Object>> getUsersByRole(String role) { return jdbcTemplate.queryForList( "SELECT * FROM users WHERE role = ?", role ); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值