jdbcTemplate学习(二)
前面讲了增加、删除、更新操作,这节讲一下查询。
查询操作:
(一)查询一个值(不需要注入参数)
queryForObject(String sql, Class<T> requiredType);
注意:参数requiredType只能是String,Integer这种类型,不能是自定义的实体类型,只能返回一个值,不能映射对象(映射对象下面会说);
sql:预处理sql;requiredType:查询单列结果的类型;
- public void test() {
- String sql = "select count(*) from test";
- int count = jdbcTemplate.queryForObject(sql, Integer.class);
- }
(二)查询一个值(使用预处理sql,需要注入参数)
queryForObject(String sql, Object[] args, Class<T> requiredType);
- public void test(Integer id) {
- String sql = "select name from test where id = ?";
- String name = jdbcTemplate.queryForObject(sql, new Object[]{id}, String.class);
- }
还有如下方式:queryForObject(String sql, Object[] args, int[] argTypes, Class<T> requiredType);
(三)查询单行记录,转换成一个对象(固定sql,不需要参数)
<T> T queryForObject(String sql, RowMapper<T> rowMapper)
- public void test() {
- String sql = "select name,age from test where id = 10";
- Customer customer = jdbcTemplate.queryForObject(sql, new RowMapper<Customer>() {
- @Override
- public Customer mapRow(ResultSet rs, int i)
- throws SQLException {
- Customer c = new Customer();
- c.setName(rs.getString("name"));
- c.setAge(rs.getInt("age"));
- return c;
- }
- });
- }
(四)查询单行记录,转换成一个对象(预处理sql,需要注入参数)
<T> T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper)
- public void test(Integer id) {//参数也是局部变量,也必须用final修饰,内部类中才能访问(全局变量不用)
- String sql = "select name,age from test where id = ?";
- Customer customer = jdbcTemplate.queryForObject(sql, new Object[]{id}, new RowMapper<Customer>() {
- @Override
- public Customer mapRow(ResultSet rs, int paramInt)
- throws SQLException {
- Customer c = new Customer();
- c.setName(rs.getString("name"));
- c.setAge(rs.getInt("age"));
- return c;
- }
- });
- }
也可以使用如下方式:(1)<T> T queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper);
(2)<T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args);
(五)查询数据库中一列多行数据,即查询数据库中单列数据存入一个list中,方式如下:(固定sql,没参数)
(a)List<Map<String, Object>> queryForList(String sql)
这个方法封装成map放入list中,key:列名(Oracle数据库sql执行结果列名默认为大写,需要小写用as取别名,别名用双引号) value:列的值
- public void test() {//如果Oracle用这个sql查询,返回的列名就是NAME(大写的),对应Map里面的key就是NAME
- String sql = "select name from test where id > 0";
- //如果用这个sql查询,返回的列名就是name(小写的),对应Map里面的key就是name
- String sql2 = "select name as \"name\" from test where id > 0";
- List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);//这里用的是第一个sql
- }
(b)<T> List<T> queryForList(String sql, Class<T> elementType)
这个方法就是直接将单类型数据存入List中。
注意:这个T虽然是泛型,但是只支持Integer.class String.class 这种单数据类型的,自己定义的Bean不支持。(所以用来查询单列数据)
- public void test() {
- String sql = "select name from test where id > 0";
- List<String> list = jdbcTemplate.queryForList(sql, String.class);
- }
(六)查询数据库中一列多行数据,即查询数据库中单列数据存入一个list中,方式如下:(预处理sql,需要注入参数)
(a)<T> List<T> queryForList(String sql, Object[] args, Class<T> elementType)
注意:这个T虽然是泛型,但是只支持Integer.class String.class 这种单数据类型的,自己定义的Bean不支持。(所以用来查询单列数据,同前面一个意思,后面不再解释)
- public void test(Integer id) {
- String sql = "select name from test where id > ?";
- List<String> list = jdbcTemplate.queryForList(sql, new Object[]{id}, String.class);
- }
还有如下方式实现:(1)<T> List<T> queryForList(String sql, Object[] args, int[] argTypes, Class<T> elementType);
(2)<T> List<T> queryForList(String sql, Class<T> elementType, Object... args);
(b)List<Map<String, Object>> queryForList(String sql, Object... args)
封装成map存入List,和之前一样,要注意Oracle数据库返回的列名默认是大写的,如果需要,用别名变小写。
- public void test(Integer id) {
- String sql = "select name from test where id > ?";
- List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, new Object[]{id});
- }
还有一种方式实现:List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes);
(七)查询多条数据(固定sql,没有参数)
(a)<T> List<T> query(String sql, RowMapper<T> rowMapper)
每条数据映射为java对象,放入List中。
- public void test() {
- String sql = "select name,age from test where id > 10";
- List<Customer> list = jdbcTemplate.query(sql, new RowMapper<Customer>() {
- @Override
- public Customer mapRow(ResultSet rs, int rowNum)
- throws SQLException {
- //这里必须new对象,不能在方法外new,然后用同一个,因为是一个List,查询出来多个对象映射,
- //必须保证每一次调用都使用一个新的。
- //如果不new,而是使用同一个对象,会导致存入到List中的都是一样的对象(都是最后一个对象)。
- Customer customer = new Customer();
- customer.setName(rs.getString("name"));
- customer.setAge(rs.getInt("age"));
- return customer;
- }
- });
- }
该方法也可以把每一行数据转换为自定义key-value的map对象放入list中,如下:(所以说使用回调类比简单方法更强大,里面逻辑自己按需求写)
- public void test() {
- String sql = "select name,age from test where id > 10";
- List<Map<Integer,Object>> list = jdbcTemplate.query(sql, new RowMapper<Map<Integer,Object>>() {
- @Override
- public Map<Integer,Object> mapRow(ResultSet rs, int rowNum)
- throws SQLException {
- Map<Integer, Object> map = new HashMap<Integer, Object>();
- map.put(rowNum, rs.getString("name"));
- map.put(rowNum, rs.getInt("age"));
- return map;
- }
- });
- }
map中的key,value类型根据需要自定义,非常方便。像这种实现RowMapper<T>接口的匿名类,T可以为Map,也可以为自定义的对象类型,如上两种,根据需要选择。
(b) void query(String sql, RowCallbackHandler rch)
注意:如果使用RowCallbackHandler 回调类,这个方法是没有返回值的,而是在回调类中将结果放入预先定义的List中,用法如下:
- public void test() {
- String sql = "select name,age from test where id > 10";
- //局部变量,必须用final修饰,内部类中才能访问(全局变量不用)
- final List<Customer> list = new ArrayList<Customer>();
- jdbcTemplate.query(sql, new RowCallbackHandler() {
- @Override
- public void processRow(ResultSet rs) throws SQLException {
- Customer customer = new Customer();
- customer.setName(rs.getString("name"));
- customer.setAge(rs.getInt("age"));
- list.add(customer);
- }
- });
- }
当然,这种方式也可以转换为map,存入list中,和上面a方式一样,这里就不详解了。
(c)<T> T query(final String sql, final ResultSetExtractor<T> rse)
ResultSetExtractor使用回调方法extractData(ResultSet rs)提供给用户整个结果集,让用户决定如何处理该结果集。
- public void test() {
- String sql = "select name,age from test where id > 10";
- List<Customer> list = jdbcTemplate.query(sql, new ResultSetExtractor<List<Customer>>() {
- @Override
- public List<Customer> extractData(ResultSet rs)
- throws SQLException, DataAccessException {
- List<Customer> result = new ArrayList<Customer>();
- while(rs.next()) {
- Customer customer = new Customer();
- customer.setName(rs.getString("name"));
- customer.setAge(rs.getInt("age"));
- result.add(customer);
- }
- return result;
- }
- });
- }
同样也可以转换为map对象放入list中,如下:
- public void test() {
- String sql = "select name,age from test where id > 10";
- List<Map<String, Integer>> list = jdbcTemplate.query(sql, new ResultSetExtractor<List<Map<String, Integer>>>() {
- @Override
- public List<Map<String, Integer>> extractData(ResultSet rs)
- throws SQLException, DataAccessException {
- List<Map<String, Integer>> result = new ArrayList<Map<String, Integer>>();
- while(rs.next()) {
- Map<String, Integer> map = new HashMap<String, Integer>();
- map.put(rs.getString("name"), rs.getInt("age"));
- result.add(map);
- }
- return result;
- }
- });
- }
(d)<T> List<T> query(PreparedStatementCreator psc, RowMapper<T> rowMapper)
- public void test() {//局部变量,必须用final修饰,内部类中才能访问(全局变量不用)
- final String sql = "select name,age from test where id > 10";
- List<Customer> list = jdbcTemplate.query(new PreparedStatementCreator() {
- @Override
- public PreparedStatement createPreparedStatement(Connection conn)
- throws SQLException {
- PreparedStatement ps = conn.prepareStatement(sql);
//如果sql是预处理的,需要传入参数,可以在这里写jdbc代码传入,后面就不列举这种方法了- return ps;
- }
- }, new RowMapper<Customer>() {
- @Override
- public Customer mapRow(ResultSet rs, int rowNum)
- throws SQLException {
- Customer customer = new Customer();
- customer.setAge(rs.getInt("age"));
- customer.setName(rs.getString("name"));
- return customer;
- }
- });
- }
可以将RowMapper换成ResultSetExtractor或者RowCallbackHandler回调类,和前面一样,因此还有下面两种方法:
(1)void query(PreparedStatementCreator psc, RowCallbackHandler rch);
(2)<T> T query(PreparedStatementCreator psc, ResultSetExtractor<T> rse);
(八)查询多条数据(预处理sql,需要传入参数)
(a)<T> List<T> query(String sql, PreparedStatementSetter pss, RowMapper<T> rowMapper)
- public void test(final Integer id) {//参数也是局部变量,也必须用final修饰,内部类中才能访问(全局变量不用)
- String sql = "select name,age from test where id > ?";
- List<Customer> list = jdbcTemplate.query(sql, new PreparedStatementSetter() {
- @Override
- public void setValues(PreparedStatement ps)
- throws SQLException {
- ps.setInt(1, id);
- }
- }, new RowMapper<Customer>() {
- @Override
- public Customer mapRow(ResultSet rs, int rowNum)
- throws SQLException {
- Customer customer = new Customer();
- customer.setName(rs.getString("name"));
- customer.setAge(rs.getInt("age"));
- return customer;
- }
- });
- }
用RowMapper回调类还有三种方法:
(1)<T> List<T> query(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper);
(2)<T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper);
(3)<T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args);
而如果把回调类换成ResultSetExtractor或者RowCallbackHandler回调类,又有八种方法(像上面一样各有四种),这里就不举出来了,和前面用法一致。
jdbcTemplate学习(二)的更多相关文章
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
- JdbcTemplate学习笔记
JdbcTemplate学习笔记 1.使用JdbcTemplate的execute()方法执行SQL语句 Java 代码 jdbcTemplate.execute("CREATE TABLE ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- SpringCloud学习(二):微服务入门实战项目搭建
一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...
- DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...
随机推荐
- Gerrit使用感受
CodeReivew好工具,可以随业务需求灵活配置权限等.
- codeforces675D Tree Construction
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- poj2778 ac自动机+矩阵快速幂
给m个子串,求长度为n的不包含子串的母串数,最直接的应该是暴搜,肯定tle,考虑用ac自动机 将子串建成字典树,通过next表来构造矩阵,然后用矩阵快速幂求长度为n的数量 邻接矩阵https://we ...
- HTTP通道
通过httptunnel技术进行入侵示例 httptunnel是通过HTTP通道来传输其他协议数据的工具软件,下载地址为:www.http-tunnel. com,目前最新版本3.0.5 工具/原料 ...
- secureCRT如何设置眼睛舒适的颜色
1.会话选项 设置背景颜色 Options => Sessions options => Terminal => Emulation, 在 Terminal下拉列表下选择Linux, ...
- Red hat linux 下配置Java环境(jdk)
1.把jdk-6u25-linux-i586-rpm.bin 复制到redhat linux中,放到/usr/java 目录下,该目录是mkdir 的,并chmod 755 jdk-6u25-li ...
- Shell check IP
#! /bin/bash checkip() { if echo $1 |egrep -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3 ...
- BEC translation exercise 1
U.S. oil drillers have made major efficiency improvements with a speed that has repeatedly surprised ...
- uva11806(容斥原理)
11806 - Cheerleaders Time limit: 2.000 seconds In most professional sporting events, cheerleaders pl ...
- loj #161 子集卷积
求不相交集合并卷积 sol: 集合并卷积?看我 FWT! 交一发,10 以上的全 T 了 然后经过参考别人代码认真比对后发现我代码里有这么一句话: rep(s, , MAXSTATE) rep(i, ...