JdbcTemplate类声明了几个重载的query()模板方法来控制整个查询过程,就像进行更新数据操作一样,通过实现PreparedStatementCreator和PreparedStatementSetter接口,也可以覆盖语句创建任务。

1,用RowCallbackHandler提取数据

RowCallbackHandler是允许处理结果集当前行的主要接口,JdbcTemplate中的一个query()方法能替你迭代结果集,并为每一行调用RowCallbackHandler,因此,对于返回结果集中的每一行,processRow()方法都会被调用一次

  1. public class JdbcUserDao implements UserDao{
  2. public User findByUserId(int id){
  3. String sql ="select *from user where id =?";
  4. JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
  5. final User user = new User();
  6. jdbcTemplate.query(sql,new Objcet[]{id},new RowCallbackHandler(){
  7. public void processRow(ResultSet rs)throws Exception{
  8. user.setUsername(rs.getString("username"));
  9. user.setPassword(rs.getString("password"));
  10. }
  11. });
  12. return user;
  13. }
  14. }
public class JdbcUserDao implements UserDao{

	public User findByUserId(int id){

		String sql ="select *from user where id =?";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); final User user = new User();
jdbcTemplate.query(sql,new Objcet[]{id},new RowCallbackHandler(){ public void processRow(ResultSet rs)throws Exception{ user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
}); return user;
}
}

由于最多只能返回SQL查询结果中的一行记录,因此可以以局部变量的形式创建一个User对象,并从结果集中提取数据来设置它的属性,对于不止一行的结果集来说,应该将对象收集成一个列表,

2,用RowMapper提取数据

RowMapper比RowCallbackHandler更为通用,它的目的是将结果集的单独一行映射到自定义的对象上,因此它适用于单行和多行结果集,从重用的角度考虑,最好将RowMapper接口实现为一般通用的类,而非内部类,在这个接口的mapRow()方法中,必须构建表示行数据的对象,并将它作为方法的返回值

  1. public class UserRowMapper implements RowMapper{
  2. public Object mapRow(ResultSet rs ,int rowNum)throws SQLException{
  3. User user  = new User();
  4. user.setId(rs.getInt("id"));
  5. user.setUsername(rs.getString("username"));
  6. user.setPassword(rs.getString("password"));
  7. return user;
  8. }
  9. }
public class UserRowMapper implements RowMapper{

	public Object mapRow(ResultSet rs ,int rowNum)throws SQLException{

		User user  = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password")); return user;
}
}

RowMapper可以用于单行或者多行的结果集,比如在像findByUserId()这样的方法中,查询唯一对象时,必须调用JdbcTemplate的queryForObject()方法,

  1. public class JdbcUserDao implements UserDao{
  2. ...........
  3. public User findByUserId(int id){
  4. String sql ="select *from user where id =?";
  5. JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
  6. User user =(User)jdbcTemplate.queryForObject(sql,new Object[]{id},new UseRowMapper());
  7. return user;
  8. }
  9. }
public class JdbcUserDao implements UserDao{

	...........

	public User findByUserId(int id){

		String sql ="select *from user where id =?";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); User user =(User)jdbcTemplate.queryForObject(sql,new Object[]{id},new UseRowMapper());
return user;
}
}

spring2.5提供了一个更便利的RowMapper实现--BeanPropertyRowMapper,它可以自动的将某一行数据映射到指定类的新实例中,它首先将这个类实例化,然后通过名称匹配的方法,将每个列的值都映射到属性中。

  1. public class JdbcUserDao implements UserDao{
  2. public User findByUserId(int id){
  3. String sql ="select *from user where id = ?";
  4. JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
  5. User user =(User)jdbcTemplate.queryForObject(sql,new Object[]                                   {id},BeanPropertyRowMapper.newInstance(User.class));
  6. return user;
  7. }
  8. }
public class JdbcUserDao implements UserDao{

	public User findByUserId(int id){

		String sql ="select *from user where id = ?";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); User user =(User)jdbcTemplate.queryForObject(sql,new Object[] {id},BeanPropertyRowMapper.newInstance(User.class));
return user;
}
}

3,查询多行

现在我们来看看如何查询一个带有多行记录的结果集。

  1. public interface UserDao{
  2. public List<User> findAll();
  3. }
public interface UserDao{

	public List<User> findAll();
}

没哟RowMapper的帮助,仍然可以调用queryForList()方法,传递一个sql语句,返回的结果集是Map列表,每个Map保存结果集中的一个行,用列名称做键。

  1. public class JdbcUserDao implements UserDao{
  2. public List<User> findAll(){
  3. String sql ="select *from user";
  4. JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
  5. List<User> lists = new ArrayList<User>();
  6. List<Map> rows = jdbcTemplate.queryForList(sql);
  7. for(Map row: rows){
  8. User user  = new User();
  9. user.setId((int)row.get("id"));
  10. user.setUsername((String)row.get("username"));
  11. user.setPasword((String)row.get("password"));
  12. lists.add(user);
  13. }
  14. return lists;
  15. }
  16. }
public class JdbcUserDao implements UserDao{

	public List<User> findAll(){

		String sql ="select *from user";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); List<User> lists = new ArrayList<User>();
List<Map> rows = jdbcTemplate.queryForList(sql); for(Map row: rows){ User user = new User();
user.setId((int)row.get("id"));
user.setUsername((String)row.get("username"));
user.setPasword((String)row.get("password"));
lists.add(user);
}
return lists;
}
}

通过下面的代码测试findAll方法

  1. public class Main{
  2. public static void main(String[] args){
  3. UserDao userdao = new JdbcUserDao();
  4. List<User> user =userdao.findAll();
  5. for(User u: user){
  6. System.out.println("id :"+user.getId());
  7. System.out.println("username :"+user.getUsername());
  8. System.out.println("password :"+user.getPassword());
  9. }
  10. }
  11. }
public class Main{

	public static void main(String[] args){

		UserDao userdao = new JdbcUserDao();
List<User> user =userdao.findAll(); for(User u: user){ System.out.println("id :"+user.getId());
System.out.println("username :"+user.getUsername());
System.out.println("password :"+user.getPassword());
}
}
}

如果使用RowMapper对象映射结果对象中的数据行,就能从query()方法中得到一个映射对象的列表,

  1. public class JdbcUserDao implements UserDao{
  2. public List<User> findAll(){
  3. String sql = "select *from user";
  4. JdbcTemplate jdbcTemplate  = new JdbcTemplate(dataSource);
  5. List<User> users = jdbcTemplate.query(sql,BeanPropertyRowMapper.newInstance(User.class));
  6. return users;
  7. }
  8. }
public class JdbcUserDao implements UserDao{

	public List<User> findAll(){

		String sql = "select *from user";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); List<User> users = jdbcTemplate.query(sql,BeanPropertyRowMapper.newInstance(User.class));
return users;
}
}

4,查询单值

最后,看看如何查询单行和单列的结果集。

  1. public interface UserDao{
  2. public String getUsername(int id);
  3. public int countAll();
  4. }
public interface UserDao{

	public String getUsername(int id);
public int countAll();
}

要查询单独的字符串值,可以调用重载的queryForObject方法,对于整型值而言,可以调用queryForInt()方法,

  1. public class JdbcUserDao implements UserDao{
  2. public String getUsername(int id){
  3. String sql = "select username from user where id =?";
  4. JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
  5. String username =(String)jdbcTempalte.queryForObject(sql,new Object[]{id},String.class);
  6. return username;
  7. }
  8. public int countAll(){
  9. String sql ="select count(*) from user";
  10. JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
  11. int count = jdbcTemplate.queryForInt(sql);
  12. return count;
  13. }
  14. }
public class JdbcUserDao implements UserDao{

	public String getUsername(int id){

		String sql = "select username from user where id =?";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String username =(String)jdbcTempalte.queryForObject(sql,new Object[]{id},String.class);
return username;
} public int countAll(){ String sql ="select count(*) from user";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); int count = jdbcTemplate.queryForInt(sql);
return count;
}
}

可以通过下面的代码测试上面的数据

  1. public class Main{
  2. public static void main(String[] args){
  3. UserDao dao =new JdbcUserDao();
  4. int count = dao.countAll();
  5. System.out.println("user count :"+count);
  6. String username = dao.getUsername(1);
  7. System

使用spring的jdbcTemplate-----用JDBC模板查询数据库的更多相关文章

  1. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. JdbcTemplate:Jdbc模板和数据库元数据

    通过 Jdbc .C3P0 .Druid 的使用我们会发现即使我们做了工具的封装,但重复性的代码依旧很多.我们可以通过 JdbcTemplate 即 Jdbc 模板来使我们的代码更加简洁,逻辑更加清晰 ...

  3. 【Spring】JdbcTemplate的使用,查询,增、删、改

    数据库名:taobaodb 配置文件: JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdat ...

  4. Spring框架学习10——JDBC Template 实现数据库操作

    为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件. 1.添加依赖 添加Spring核心依赖,MySQL驱动 <!--Spring核心基础依赖--> ...

  5. jdbcTemplate之jdbc模板技术

    1:为什么要使用jdbcTemplate? 在实际开发中使用jdbc技术太过复杂,为了减少代码冗余,操作简单 步骤一:创建实体类 package beans; public class Book { ...

  6. 使用JdbcTemplate简化JDBC操作 实现数据库操作

    使用Spring JDBC框架方遍简单的完成JDBC操作,满足性能的需求且灵活性高. Spring JDBC框架由4个部分组成,即core.datasource.object.support. org ...

  7. awt可视化界面上传数据到mysql,jsp通过jdbc方式查询数据库,并将结果打印在网页上

    今天尝试写一个小demo实现下之前看过的代码,目的了解不同文件的数据访问,掌握如何获取前台数据,如何将数据库的数据在前端页面展示. awt可视化界面可已实现提交数据到数据库,也可查询数据在控制台打印. ...

  8. 使用jdbc,查询数据库数据,并将其封装为对象输出

    package cn.itcast.jdbc;import cn.itcast.domain.User;import java.sql.*;import java.util.ArrayList;imp ...

  9. JDBC简单查询数据库

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6543890367761089031/ 1.我们先新建一个数据库作为测试库 数据库名称为test.测试表为perso ...

随机推荐

  1. Hive sql 语法解读

    一. 创建表 在官方的wiki里,example是这种: Sql代码   CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name d ...

  2. BringWindowToTop(), SetForegroundWindow(), SetActiveWindow()

    1. SetActiveWindow() 原型: <span style="font-size:14px;">CWnd* SetActiveWindow(); HWND ...

  3. Android自定义“图片+文字”控件四种实现方法之 二--------个人最推荐的一种

    http://blog.csdn.net/yanzi1225627/article/details/8633872 第二种方法也要新建一个图片+文字的xml布局文件,然后写一个类继承自LinearLa ...

  4. HTTP 404 - 未找到文件 怎么样解决

    找不到网页  您要查看的网页可能已被删除.名称已被更改,或者临时不可用.  -------------------------------------------------------------- ...

  5. Linux学习笔记总结--CentOS 设置静态IP

    1.修改网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth ...

  6. ubuntu 14.04/15.10 安装基于eclipse的android app开发环境

    一开始是装了ubuntu15.10,不知道是我的x200机器太old还是iso镜像有问题,总是各种莫名的引导不起来.有时候刚刚装好的干净系统,只install了一个vim和openssh,重启,然后就 ...

  7. 利用jquery实现百度新闻导航菜单滑动动画

    前言 前两天,群里有人问百度新闻导航是如何实现的,当时由于忙于工作,没有来得及细看,恰好今天有空闲时间,索性就实现一下这个效果吧: 思路与步骤 1.利用UL创建简单横向导航: <!DOCTYPE ...

  8. 3. NHibernate基础知识 - 你必须知道的一些事情

    首先介绍一下框架结构(这个有个概念就可以): 然后我们会介绍一个很重要的概念(一定要好看)!! 这节对 NHibernate 架构做一个介绍,首先要了解一下该框架在应用程序中的位置: 先来一个简单的图 ...

  9. Java 输入

    1.使用Scanner 使用时需要引入包import java.util.Scanner;首先定义Scanner对象 Scanner sc = new Scanner(System.in);如果要输入 ...

  10. js - SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data jquery-1.9.1.min.js:3:4315

    FF中时不时报这个错, 就近段做项目来看,  一般是我通过 jquery获取form中的参数(或直接获取参数,并通过ajax进行异步请求的时候,如果有错,就抱该错误! 而对应的, 如果在 Google ...