Jdbctemplate中query、queryForObject、queryForList、queryForMap方法使用

     程序猿的成长其实是很苦逼的,怎么说呢,就是一路打怪升级,当遇到好多怪都打不动了,那么也就无法升级了;或者说就是不断入坑出坑的过程,一旦一个或多个坑都无法跳出来,也就over了。

    最近工作中这个jdbctemplate中方法的使用问题就遇到过2次基本相同的问题,一次是自己遇到,一次是同事问我时;md,还是赶快跳出这个坑吧,只能认真研究总结下了。

    Jdbctemplate中这些query、queryForObject、queryForList、queryForMap方法大家可能都不陌生,都用过。那么都要哪些坑呢?

 【query方法】返回结果是list,且list中元素必须是自定义bean;不能是list<String>。至于为什么,看了几次这个方法的源码没有找到答案,还望高手指点一二。

    那么,你遇到过利用query执行select name from tabName; 类似sql时的坑吗?我是遇到过了。经过是这样的,我要查询一个保单号在是否发生过冻结,如果发生过冻结把冻结日期取出来。我开始利用queryForObject,结果有的保单没有发生过冻结查不到记录,抛出了异常,好吧,我利用query,返回的list<String>,sql是这么写的 select  createDate as 冻结时间  from tabName where cntrno=? and status='冻结' ; 问题出现了,query不能返回list<String>。

 【queryForObject】查询出一条记录并封装到一个对象中。可以返回的是String、Integer、Double或者自定义bean。但是如果查询的记录为0条或者大于1条,对不起抛出异常。

      源码如下:

     

   

【queryForList】这个方法返回一个list,这个方法比较特殊,可以返回List<String> ,还可以返回list<Map<String,Objec>>。为什么呢?看源码:

    

     从源码可以看出,看调用的是singleColumnRowMapper还是ColumnMapRowMapper。那这2个有什么区别呢?前者是

 映射单个列(字段)的,后者是将结果集映射为map。

   也就是说,你sql是select * fromtabName;这返回时list<map>,如果你sql是select name from tabName;或者select max(score) from tabName;则返回就是list<基本类型>

  【queryForMap】查询一行数据封装到Map中。如果查询多行记录抛出异常

     源码分析如下:

    

【总结】

     //1.查询一行数据并返回int型结果  
    jdbcTemplate.queryForInt("select count(*) from test");  


   //2. 查询一行数据并将该行数据转换为Map返回  
   jdbcTemplate.queryForMap("select * from test where name='name5'");  


   //3.查询一行任何类型的数据,最后一个参数指定返回结果类型  
   jdbcTemplate.queryForObject("select count(*) from test", Integer.class);  


   //4.查询一批数据,默认将每行数据转换为Map       
   jdbcTemplate.queryForList("select * from test");  


     //5.只查询一列数据列表,列类型是String类型,列名字是name  
      jdbcTemplate.queryForList("  
        select name from test where name=?", new Object[]{"name5"}, String.class);  


      //6.查询一批数据,返回为SqlRowSet,类似于ResultSet,但不再绑定到连接上  
      SqlRowSet rs = jdbcTemplate.queryForRowSet("select * from test");     

猜你喜欢

转载自blog.csdn.net/dhklsl/article/details/103510888
今日推荐