前面讲了增加、删除、更新操作,这节讲一下查询。

查询操作:

(一)查询一个值(不需要注入参数)

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学习(二)的更多相关文章

  1. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  2. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  3. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  4. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  5. JdbcTemplate学习笔记

    JdbcTemplate学习笔记 1.使用JdbcTemplate的execute()方法执行SQL语句 Java 代码 jdbcTemplate.execute("CREATE TABLE ...

  6. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  7. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  8. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  9. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  10. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

随机推荐

  1. WINSOCK 传送文件

    SERVER: // send_server.cpp : Defines the entry point for the console application. // #include " ...

  2. jquery01-简介+语法+选择器+事件

    jQuery是一个JavaScript函数库,是一个轻量级的"写的少,做的多"的JavaScript库,包含以下功能: HTML 元素选取 HTML 元素操作 CSS 操作 HTM ...

  3. psd文件中截取固定大小的图片

    1.选择需要操作的图层 使用选框工具, 设置固定大小和固定大小的值,在图层上拉取选区 2.使用移动工具  使用垂直.水平居中 使选择的icon在选区块中间 3.再选择好块区域调整好位置后 使用截取工具 ...

  4. JavaWeb -- 自定义标签实例, 防盗链, JSTL 核心标签

    1. 自定义标签应用实例1: 防盗链 标签处理类 public class RefererTag extends SimpleTagSupport { private String site; pri ...

  5. AODH: ALARM EVENTS IN OPENSTACK

    AODH是从Ceilometer分离出来的一个子项目,开始于OpenStack Liberty,用来提供alarm机制. 除了之前Ceilometer有的基于sample的警报机制,AODH还添加了基 ...

  6. jquery jsonp模版

    $.ajax({ dataType: "jsonp", url: "http://www.b.com/b.php", jsonp: "callback ...

  7. Dom节点操作常用方法

    1.访问/获取节点 document.getElementById(id); //返回对拥有指定id的第一个对象进行访问 document.getElementsByName(name); //返回带 ...

  8. middle school

    One of the most difficult transitions faced by parents and youth is that of going from elementary to ...

  9. 学习汤姆大叔《深入理解JavaScript系列》有感(1) —— 立即调用的函数表达式

    一. 下面代码用于理解函数的声明和调用. function makeCounter() { // 只能在makeCounter内部访问i var i = 0; return function () { ...

  10. IP地址的基础划分

    1.基础知识 1.1  IP地址是由网络号(net ID)与主机号(host ID)两部分组成的. 1.2  IP地址的分类 IP地址长度为32位,点分十进制(dotted decimal)地址: 采 ...