使用spring的jdbcTemplate-----用JDBC模板查询数据库
JdbcTemplate类声明了几个重载的query()模板方法来控制整个查询过程,就像进行更新数据操作一样,通过实现PreparedStatementCreator和PreparedStatementSetter接口,也可以覆盖语句创建任务。
1,用RowCallbackHandler提取数据
RowCallbackHandler是允许处理结果集当前行的主要接口,JdbcTemplate中的一个query()方法能替你迭代结果集,并为每一行调用RowCallbackHandler,因此,对于返回结果集中的每一行,processRow()方法都会被调用一次
- 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;
- }
- }
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()方法中,必须构建表示行数据的对象,并将它作为方法的返回值
- 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;
- }
- }
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()方法,
- 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;
- }
- }
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,它可以自动的将某一行数据映射到指定类的新实例中,它首先将这个类实例化,然后通过名称匹配的方法,将每个列的值都映射到属性中。
- 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;
- }
- }
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,查询多行
现在我们来看看如何查询一个带有多行记录的结果集。
- public interface UserDao{
- public List<User> findAll();
- }
public interface UserDao{
public List<User> findAll();
}
没哟RowMapper的帮助,仍然可以调用queryForList()方法,传递一个sql语句,返回的结果集是Map列表,每个Map保存结果集中的一个行,用列名称做键。
- 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;
- }
- }
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方法
- 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());
- }
- }
- }
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()方法中得到一个映射对象的列表,
- 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;
- }
- }
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,查询单值
最后,看看如何查询单行和单列的结果集。
- public interface UserDao{
- public String getUsername(int id);
- public int countAll();
- }
public interface UserDao{
public String getUsername(int id);
public int countAll();
}
要查询单独的字符串值,可以调用重载的queryForObject方法,对于整型值而言,可以调用queryForInt()方法,
- 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;
- }
- }
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;
}
}
可以通过下面的代码测试上面的数据
- public class Main{
- public static void main(String[] args){
- UserDao dao =new JdbcUserDao();
- int count = dao.countAll();
- System.out.println("user count :"+count);
- String username = dao.getUsername(1);
- System
使用spring的jdbcTemplate-----用JDBC模板查询数据库的更多相关文章
- [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- JdbcTemplate:Jdbc模板和数据库元数据
通过 Jdbc .C3P0 .Druid 的使用我们会发现即使我们做了工具的封装,但重复性的代码依旧很多.我们可以通过 JdbcTemplate 即 Jdbc 模板来使我们的代码更加简洁,逻辑更加清晰 ...
- 【Spring】JdbcTemplate的使用,查询,增、删、改
数据库名:taobaodb 配置文件: JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdat ...
- Spring框架学习10——JDBC Template 实现数据库操作
为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件. 1.添加依赖 添加Spring核心依赖,MySQL驱动 <!--Spring核心基础依赖--> ...
- jdbcTemplate之jdbc模板技术
1:为什么要使用jdbcTemplate? 在实际开发中使用jdbc技术太过复杂,为了减少代码冗余,操作简单 步骤一:创建实体类 package beans; public class Book { ...
- 使用JdbcTemplate简化JDBC操作 实现数据库操作
使用Spring JDBC框架方遍简单的完成JDBC操作,满足性能的需求且灵活性高. Spring JDBC框架由4个部分组成,即core.datasource.object.support. org ...
- awt可视化界面上传数据到mysql,jsp通过jdbc方式查询数据库,并将结果打印在网页上
今天尝试写一个小demo实现下之前看过的代码,目的了解不同文件的数据访问,掌握如何获取前台数据,如何将数据库的数据在前端页面展示. awt可视化界面可已实现提交数据到数据库,也可查询数据在控制台打印. ...
- 使用jdbc,查询数据库数据,并将其封装为对象输出
package cn.itcast.jdbc;import cn.itcast.domain.User;import java.sql.*;import java.util.ArrayList;imp ...
- JDBC简单查询数据库
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6543890367761089031/ 1.我们先新建一个数据库作为测试库 数据库名称为test.测试表为perso ...
随机推荐
- JS获取和设置光标的位置
<html> <head> <script language="javascript"> function getCursortPosition ...
- POJ 3614 Sunscreen 优先队列 贪心
题意 有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉. 而刚开始的阳光的强度非常大,奶牛都承受不住 ...
- careercup-数组和字符串1.1
1.1 实现一个算法,确定一个字符串的所有字符是否全部不同.假设不允许使用额外的数据结构,又该如何处理? C++实现: #include<iostream> #include<str ...
- 线程本地存储(Thread Local Storage, TLS)简单分析与使用
在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS ...
- linux中的网络通信指令 分类: 学习笔记 linux ubuntu 2015-07-06 16:02 134人阅读 评论(0) 收藏
1.write write命令通信是一对一的通信,即两个人之间的通信,如上图. 效果图 用法:write <用户名> 2.wall wall指令可将信息发送给每位同意接收公众信息的终端机用 ...
- Java基础知识强化之网络编程笔记09:TCP之客户端键盘录入服务器写到文本文件中
1. TCP之客户端键盘录入服务器写到文本文件中 (1)客户端: package cn.itcast_09; import java.io.BufferedReader; import java.io ...
- android 5.0 创建多用户 双开多开应用(1)
Andriod5.0多用户 双开应用 android多用户是5.0之后有的,类似windows的账户系统 不过官方还没有完全确认,API大都是hide状态 我这里提供一种方式并不适用所有的,由于我们有 ...
- CentOS 6.7编译安装PHP7
1.首先配置好编译环境 yum update && yum upgrade yum groupinstall "Development Tools" yum ins ...
- css3遇到的一些属性
rgba 是由red.green.blue 三种颜色搭配出来的box-shadow 向元素添加阴影层,水平阴影位置,垂直阴影位置,后面是可选:模糊距离,阴影大小,颜色,是否是 ...
- Js 上传文件 页面不刷新
html控件代码: <form id="form1"> <p><input type="file" name="mfil ...