前言:最近在看视频学习的时候,发现在操作数据库的时候,经常写这两个语句
一:
public User findByUsernameAndPassword(String Username,String Password) {
User user=null;
try {
String sql="select * from tab_user where username = ? and password = ?";
user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), Username, Password);
}catch (Exception e){
}
return user;
}
二:
public List<Category> findAll() {
String sql="select * from tab_category";
return jdbcTemplate.query(sql,new BeanPropertyRowMapper<Category>(Category.class));
}
所以就非常好奇这两个方法到底有什么区别,我们一探究竟。
而自我感觉是:
queryForObject(String sql, RowMapper rowMapper, Object... args) 只返回一条记录
query(String sql, RowMapper rowMapper) 可以返回一组记录
去查看源代码
queryForObject(ctrl+鼠标左击)
可以看到它是通过一个List集合来存储了结果,返回的时候又调用了一个方法,如果返回数据不符合规定就抛出异常,而不是直接返回被取出不符合规定的数据。进一步看源码
通过查看源码我们可以看到,用size存储按 sql语句 从数据库中返回的结果集 results,如果 结果集为 null,size就为0。否则 size 就为结果集长度。
然后判断 size :
1. ==0:抛出空结果集异常。
2. >1:抛出不正确的结果集长度异常
3. ==1:因为返回结果集不可能为负数,所以else判断的肯定是size==1的情况。这时候返回结果集的迭代器的next(),即让迭代器的指针指向下一位。
也就是说:queryForObject 只返回了一个User对象,如果长度不是1就会抛出异常。
queryForObject(ctrl+鼠标左击)
这个就是直接返回了一个List集合。
通过查看其他文章,然后自己就当做笔记记录了下。