DBUtiles中的简单使用(QueryRunner和ResultSetHandler的手动实现)
DBUtiles是一个很好的处理JDBC的工具类。(DbUtils is a small set of classes designed to make working with JDBC easier )
DBUtiles中的QueryRunner和ResultSetHandler的手动实现
其中比较常用的就是QueryRunner类和ResultSetHandler接口。通过它们可以很方便的实现JDBC的功能。
QueryRunner类,有四个构造方法,其中有的构造方法可以接受一个DataSource
例如:QueryRunner runner = new QueryRunner(new ComboPooledDataSource());
当我们获得QueryRunner的实例对象时,就能通过QueryRunner类的方法方便的操作数据库。QueryRunner类主要有三类方法,batch()方法,query()方法,update()方法。
例如:
- QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
- runner.update("insert into account values(null,?,?)","e",888);
- runner.update("update account set money=0 where name=?", "e");
查询的方法稍微麻烦一点,因为我们需要对查询到的结果集进行设置。通常需要把结果集ResultSet封装到JavaBean或者集合或者数组中。
查看一个方法: <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
这里第一个参数是sql语句字符串,第二个参数是一个实现了ResultSetHandler接口的类对象,第三个参数是Object类型的可变参数。返回值是一个T类型。
如果我们用的eclipse或者MyEclipse 鼠标放到ResutlSetHandlet上面,按F2,会有针对T的说明。<T> the target type the input ResultSet will be converted to.
意思是,T 代表 ResultSet结果集要装入的目标类型。也就是我们前面提到的数组,集合,甚至javabean.
下面用一段代码来实现把结果集装入一个List数组中。其中Account是一个javaBean,符合account表。
- public static List test2() throws Exception{
- QueryRunner runner = new QueryRunner(new ComboPooledDataSource());
- return runner.query("select * from account where name=?",new ResultSetHandler<List<Account>>(){
- public List<Account> handle(ResultSet rs) throws SQLException {
- List<Account> list = new ArrayList<Account>();
- while(rs.next()){
- Account acc = new Account();
- acc.setId(rs.getInt("id"));
- acc.setName(rs.getString("name"));
- acc.setMoney(rs.getDouble("money"));
- list.add(acc);
- }
- return list;
- }
- } , "a");
- }
接下来,我们用两段代码来模拟QueryRunner和ResultSetHandler的实现原理。
- package cn.itheima.dbutils;
- import java.sql.Connection;
- import java.sql.ParameterMetaData;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.List;
- import javax.sql.DataSource;
- import cn.itheima.domain.Account;
- import com.mchange.v2.c3p0.ComboPooledDataSource;
- public class MyQueryRunner {
- private DataSource source = null;
- public MyQueryRunner(DataSource source) {
- this.source = source;
- }
- //查询原理:利用MyResourceHandler处理利用sql和objs拼写出来的sql语句查询出来的resultSet,处理
- public <T> T query(String sql,MyResultSetHandler<T> handler,Object ...objs){
- Connection conn = null;
- PreparedStatement ps = null;
- ResultSet rs = null;
- try {
- conn = source.getConnection();
- ps = conn.prepareStatement(sql);
- ParameterMetaData metaData = ps.getParameterMetaData();
- for(int i=1;i<=metaData.getParameterCount();i++){
- ps.setObject(i, objs[i-1]);
- }
- rs = ps.executeQuery();
- return handler.handle(rs);
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException();
- } finally {
- if (rs != null) {
- try {
- rs.close();
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- rs = null;
- }
- }
- if (ps != null) {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- ps = null;
- }
- }
- if (conn != null) {
- try {
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- conn = null;
- }
- }
- }
- }
- public int update(String sql,Object ...objs){
- Connection conn = null;
- PreparedStatement ps = null;
- try{
- conn = source.getConnection();
- ps = conn.prepareStatement(sql);
- ParameterMetaData metaData = ps.getParameterMetaData();
- for(int i=1;i<=metaData.getParameterCount();i++){
- ps.setObject(i, objs[i-1]);
- }
- return ps.executeUpdate();
- }catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException();
- }finally{
- if(ps!=null){
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }finally{
- ps = null;
- }
- }
- if(conn!=null){
- try {
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }finally{
- conn = null;
- }
- }
- }
- }
- }
MyResultSetHandler接口
- package cn.itheima.dbutils;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- public interface MyResultSetHandler <T>{
- T handle(ResultSet rs)throws SQLException;
- }
当然,实际应用中没有这么麻烦。因为DBUtils已经帮我们实现了很多ResultSetHandler的实现类。通过这些类可以很方便的对结果集进行封装。
ResultSetHandler的实现类
- //1.ArrayHandler 将查询结果每一行转换为一个数组对象返回
- //ResultSetHandler implementation that converts a ResultSet into an Object[]. This class is thread safe.
- Object[] objs = runner.query("select * from account where name=?",new ArrayHandler() , "c");
- System.out.println(objs);
- //2.ArrayListHandler 将查询结果的每一行转换为一个Object[]数组,然后装入一个ArrayList集合
- //ResultSetHandler implementation that converts the ResultSet into a List of Object[]s. This class is thread safe.
- List<Object[]> list = runner.query("select * from account",new ArrayListHandler() );
- System.out.println(list);
- //手动实现ArrayListHandler的功能
- public static List test2() throws Exception{
- QueryRunner runner = new QueryRunner(new ComboPooledDataSource());
- return runner.query("select * from account where name=?",new ResultSetHandler<List<Account>>(){
- public List<Account> handle(ResultSet rs) throws SQLException {
- List<Account> list = new ArrayList<Account>();
- while(rs.next()){
- Account acc = new Account();
- acc.setId(rs.getInt("id"));
- acc.setName(rs.getString("name"));
- acc.setMoney(rs.getDouble("money"));
- list.add(acc);
- }
- return list;
- }
- } , "a");
- }
- //3.BeanHandler,将查询结果的第一行转换为一个JavaBean对象返回
- //ResultSetHandler implementation that converts the first ResultSet row into a JavaBean. This class is thread safe.
- Account acc = runner.query("select * from account where name=?",new BeanHandler<Account>(Account.class) , "c");
- System.out.println(acc);
- //4.BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
- //ResultSetHandler implementation that converts a ResultSet into a List of beans. This class is thread safe.
- List<Account> acclist = runner.query("select * from account",new BeanListHandler<Account>(Account.class) );
- System.out.println(acclist);
- //5.MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
- //ResultSetHandler implementation that converts the first ResultSet row into a Map. This class is thread safe.
- Map map = runner.query("select * from account",new MapHandler() );
- System.out.println(map);
- //6.MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
- //ResultSetHandler implementation that converts a ResultSet into a List of Maps. This class is thread safe
- List<Map<String, Object>> maplist = runner.query("select * from account",new MapListHandler() );
- System.out.println(maplist);
- //7.ColumnListHandler:将结果集中某一列的数据存放到List中。
- //ResultSetHandler implementation that converts one ResultSet column into a List of Objects. This class is thread safe.
- List<Object> columnList = runner.query("select * from account",new ColumnListHandler(2) );
- System.out.println(columnList);
- //8.KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。
- //ResultSetHandler implementation that returns a Map of Maps. ResultSet rows are converted into Maps which are then stored in a Map under the given key.
- Map<Object, Map<String, Object>> keymap = runner.query("select * from account",new KeyedHandler("id") );
- System.out.println(keymap);
- //9.ScalarHandler: 单值查询
- //ResultSetHandler implementation that converts one ResultSet column into an Object. This class is thread safe.
- //select count(*) from account;
- Long count = (Long)runner.query("select count(*) from account",new ScalarHandler(1) );
- System.out.println(count);
DBUtiles中的简单使用(QueryRunner和ResultSetHandler的手动实现)的更多相关文章
- Java中的简单工厂模式
举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...
- iOS中XMPP简单聊天实现 好友和聊天
版权声明本文由陈怀哲首发自简书:http://www.jianshu.com/users/9f2e536b78fd/latest_articles;微信公众号:陈怀哲(chenhuaizhe2016) ...
- WebSocket在ASP.NET MVC4中的简单实现
WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...
- Hangfire在ASP.NET CORE中的简单实现
hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...
- 通过DFS求解有向图(邻接表存储)中所有简单回路
前言 查阅了网上许多关于通过DFS算法对有向图中所有简单回路的查找,发现有很多关于使用DFS求解有向回路中所有简单回路的帖子,(在按照节点编号情况下)但大多数仅仅寻找了编号递增的回路.又或者未对结果去 ...
- Java中的简单工厂模式(转)
Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的 ...
- 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式
1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...
- flask中的简单的前端写入
那么flask这个框架是web开发,那么肯定离不开前端的一些代码,那么python用的web开发框架 开发所用的前端模板就是jinja2模板.相对于jinja1比起来性能做到了很大的提升,那么Vue一 ...
- Dingo Api 1.0在laravel5.2中的简单应用
Dingo Api是为基于laravel的开发提供了一系列工具集,这些工具集可以帮助开发者快速构建API.Dingo Api最新的版本是2.0.0-alpha1,这个版本需要php7.0以上的php版 ...
随机推荐
- java FTP 上传下载删除文件
在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件 ...
- hdu 3394(点双连通)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3394 思路:题目的意思是要求无向图中的冲突边和不需要边的条数,如果一个块中有多个环,则该块中的每条边都 ...
- 【discuz】G变量注解之 $_G['member'] 全局当前登录者信息
print? <?php G变量的使用方法: 直接复制下面的变量放到discuzx模板需要的位置即可! 例如:$_G['style'][boardlogo] 刷新后就会 显示一张logo 全局当 ...
- Carries
Carries frog has nn integers a1,a2,…,ana1,a2,…,an, and she wants to add them pairwise. Unfortunately ...
- if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
- 网络免费API接口整理
转载自: https://www.cnblogs.com/doit8791/p/9351629.html 从网上看到一些免费API接口,在个人开发小程序等应用练手时可试用. 各类无次数限制的免费API ...
- TreeMap详细介绍(源码解析)和使用示例
本文转自 http://www.cnblogs.com/skywang12345/p/3310928.html 概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学 ...
- Grunt自动化工具相关
Grunt 项目中安装grunt模块npm install grunt --save,删除模块 npm uninstall grunt ,缺失某个插件:npm install grunt-contri ...
- 类加载器(ClassLoader)
1. 类加载器概述 1.1 类加载器的作用 把 .class 文件加载到 JVM 的方法区中,变成一个 Class 对象! 1.2 类加载器分类 类加载器也是一个类: ClassLoader; Jav ...
- 2015-02-07——js笔记
示例1: var abc; console.log(abc === undefined); console.log(abc === null); console.log(t ...