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