后台(21)——DBUtils

探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制



Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南



自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


版权声明


DBUtils简介

DBUtils是Apache提供的一个开源的数据库操作工具,它是对JDBC的简单封装,极大简化JDBC编码的工作量。比如:查询数据时它可以把结果转换成List,Array,Set等集合,非常便于开发人员操作

DBUtils的三个核心对象

  • QueryRunner类
    主要用于增,删,改,查
  • ResultSetHandler接口
    主要用于处理结果集
  • DBUtils类
    该工具类主要用于关闭连接、装载JDBC驱动程序等等

嗯哼,我们将在后续的篇幅中重点介绍QueryRunner类和ResultSetHandler接口,请继续往下看。


QueryRunner

QueryRunner类提供了两个构造方法

  • new QueryRunner()
    如果采用该方法创建QueryRunner,那么数据库的事务可由我们自己手动控制。正因为该构造方法无参,所以在调用该对象的query、update、batch时需要传入参数Connection。
  • new QueryRunner(DataSource ds);
    如果采用该方法创建QueryRunner,那么数据库的事务由DBUtils自动控制。正因为该构造方法传入了参数QueryRunner,所以在调用该对象的query、update、batch时无需传入参数Connection。

QueryRunner的常用方法如下:

public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException
执行查询操作,在该查询中Object数组里的每个值被用来作为查询语句的置换参数。该方法会自行处理PreparedStatement和ResultSet的创建和关闭。

public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException
该方法与上面的这个方法基本一样;不同的是它不用将Connection提供给该方法

public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException
该方法与上面的两个方法基本一样,它用于执行一个不需要置换参数的查询操作。

public int update(Connection conn, String sql, Object[] params) throws SQLException
执行更新操作,在该查询中Object数组里的每个元素值被用来作为更新语句的置换参数。

public int update(Connection conn, String sql) throws SQLException
该方法与上面的这个方法基本一样,用来执行一个不需要置换参数的更新操作。

现在,我们通过一个例子来了解DBUtils的简单使用

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
package cn.com;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;

public class TestCRUD {

    @Test
    public void testInsert() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        qr.update("insert into student(studentid,studentname) values(?,?)", 5,"吉泽暗步");
    }

    @Test
    public void testUpdate() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        qr.update("update student set studentname=? where studentid=?", "明步吉泽",5);
    }

    @Test
    public void testDelete() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        qr.update("delete from student where studentid=?",2);
    }

    @Test
    public void testSelect()throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        BeanListHandler<Student> beanListHandler=new BeanListHandler<Student>(Student.class);
        List<Student> list = qr.query("select * from student",beanListHandler);
        for(Student s: list){
            System.out.println(s);
        }
    }

}

嗯哼,看到了吧,我们只用了很少的代码就实现了增删改查。尤其是最后一个例子中把查询结果直接转换成了List从而给开发带来了极大的方便!


ResultSetHandler

ResultSetHandler接口常用的实现类如下:

ArrayHandler
把结果集中的第一行数据转成对象数组

ArrayListHandler
把结果集中的每一行数据都转成一个数组存放到List中

BeanHandler
将结果集中的第一行数据封装到一个对应的JavaBean实例中。

BeanListHandler
将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

ColumnListHandler
将结果集中某一列的数据存放到List中

KeyedHandler(name)
将结果集中的每一行数据都封装到一个Map<列名,列值>里,再把这些map再存到一个map里,其key为指定的key。

MapHandler
将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值

MapListHandler
将结果集中的每一行数据都封装到一个Map里,然后再存放到List

关于ResultSetHandler接口实现类的用法,请看如下示例:

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
package cn.com;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

public class TestResultSetHandler {
    @Test
    public void teseArrayHandler() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Object[] arr  = qr.query("select * from student", new ArrayHandler());
        for (Object o : arr) {
            System.out.println(o);
        }
    }

    @Test
    public void teseArrayListHandler() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Object[]> query = qr.query("select * from student", new ArrayListHandler());
        for (Object[] os : query) {
            System.out.println(os);
            for (Object o : os) {
                System.out.println(o);
            }
            System.out.println("----------");
        }
    }

    @Test
    public void teseColumnListHandler() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Object> list = qr.query("select * from student", new ColumnListHandler(1));
        for (Object o : list) {
            System.out.println(o);
        }
    }

    @Test
    public void testKeyedHandler() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Map<Object,Map<String,Object>> map = qr.query("select * from student", new KeyedHandler(1));
        for (Map.Entry<Object, Map<String,Object>> m : map.entrySet()) {
            System.out.println(m.getKey());
            for (Map.Entry<String, Object> mm : m.getValue().entrySet()) {
                System.out.println(mm.getKey()+"\t"+mm.getValue());
            }
            System.out.println("----------");
        }

    }

    @Test
    public void teseMapHandler() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Map<String,Object> map = qr.query("select * from student where studentid=?", new MapHandler(),3);
        for (Map.Entry<String, Object> m : map.entrySet()) {
            System.out.println(m.getKey()+"\t"+m.getValue());
        }

    }

    @Test
    public void teseMapListHandler() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Map<String,Object>> list = qr.query("select * from student", new MapListHandler());
        for (Map<String, Object> map : list) {
            for (Map.Entry<String, Object> m : map.entrySet()) {
                System.out.println(m.getKey()+"\t"+m.getValue());
            }
            System.out.println("----------");
        }
    }

    @Test
    public void teseScalarHandler() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Object o = qr.query("select count(*) from student", new ScalarHandler(1));
        System.out.println(o.getClass().getName());
    }

    @Test
    public void teseBeanHandler() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        BeanHandler<Student> beanHandler=new BeanHandler<Student>(Student.class);
        Student student = qr.query("select * from student where studentid=?",beanHandler,3);
        System.out.println(student);
    }

    @Test
    public void teseBeanListHandler() throws SQLException{
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        BeanListHandler<Student> beanListHandler=new BeanListHandler<Student>(Student.class);
        List<Student> list = qr.query("select * from student where studentid=?", beanListHandler,3);
        for(Student s:list){
            System.out.println(s);
        }
    }
}

DBUtils

DBUtils类提供了关闭连接、装载JDBC驱动程序等等于资源有关的操作。

DBUtils主要方法如下:

public static void close( ) throws java.sql.SQLException
用于关闭Connection、Statement和ResultSet

public static void closeQuietly( ): 这一类方法不仅能关闭Connection、Statement和ResultSet,还能隐藏一些在程序中抛出的SQLException。如果不想捕捉这些异常的话,这将是一个不错的选择

public static void commitAndCloseQuietly(Connection conn): 提交并关闭连接,并且在关闭连接时不抛出SQL异常。

public static boolean loadDriver(java.lang.String driverClassName)
装载并注册JDBC驱动程序,若成功就返回true

时间: 2024-10-28 18:48:06

后台(21)——DBUtils的相关文章

冒号和他的学生们(连载21)——后台脚本

21.后台脚本 操千曲而后晓声,观千剑而后识器 --<文心雕龙•知音> "剩下四种动态语言,我们将之归为后台脚本语言."冒号说着画了张图表-- 用户 前台语言:Visual Basic,Delphi,JavaScript 平台语言:Java,C# 后台脚本语言:Perl,PHP,Python,Ruby 系统语言:C,C++,D 机器 引号听得仔细:"我记得您开始是把这些语言划分为C族静态语言.非C族静态语言和动态语言三类的." 冒号解释:"那是

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(21)-权限管理系统-跑通整个系统

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(21)-权限管理系统-跑通整个系统 这一节我们来跑通整个系统,验证的流程,通过AOP切入方式,在访问方法之前,执行一个验证机制来判断是否有操作权限(如:增删改等) 原理:通过MVC自带筛选器,在筛选器分解路由的Action和controller来验证是否有权限. 首先我们要理解一下筛选器 筛选器的由来及用途有时,您需要在调用操作方法之前或运行操作方法之后执行逻辑. 为了对此提供支持,ASP.NET MV

国美团两款手机销售超21亿是后台BUG

[http://www.aliyun.com/zixun/aggregation/32866.html">亿邦动力网讯]1月30日消息,亿邦动力网查看国美在线的团购页面"国美团"发现有两款手机销量都在21亿以上.对此国美在线团购业务的618.html">负责人表示,出现这种明显有问题的数据是由于后台系统的一个BUG,这个数字绝对不是人工修改的. 国美在线的国美团的负责人王璐表示,由于团购的商品价格比较低,这就导致网站存在两个不同的价格体系,后台操作比较复

解决织梦后台 \include\userlogin.class.php on line 21 报错的方法

打开dede\templets 找到 index_body.htm 文件 查找并注释掉下面代码: $(function() {    $.get("index_testenv.php",function(data)   {     if(data !== '')     {         $("#__testEvn").html(data);     }   }) }) 注:如果是空间改后,到后台更新一下缓存,服务器改好重启一下IIS,或者重启服务器.  以上是小

MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

[正文] 这一周状态不太好,连续打了几天的点滴,所以博客中断了一个星期,现在继续. 我们在之前的几篇文章中学习了JDBC对数据库的增删改查.其实在实际开发中,一般都是使用第三方工具类,但是只有将之前的基础学习好了,在使用开源工具的时才能得心应手.如果对JDBC基础不太清楚,或者对本文看不太懂,建议先回顾一下本人之前的几篇和"MySQL数据库学习笔记"相关的文章.但是不管怎样,今后如果用到了数据库的增删改查,肯定是这篇文章中的代码用的最多. 一.DbUtils简介: DBUtils是ap

基于jsp+servlet图书管理系统之后台用户信息插入操作

前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研知识,趁着这学期的结束(马上就要放寒假了),写写最近练习的基于jsp+servlet+前台模板写的图书管理系统,一点一点写吧,详细的注释已经在代码上说明,希望对学习基于java开发的web方向的童鞋有所帮助.今天先把写的用户信息管理的添加(插入)操作分享一下,使用了一些特殊的知识,也会做一下说明.更

基于jsp+servlet图书管理系统之后台用户信息修改操作

上一篇的博客写的是查询操作,且附有源码和数据库,这篇博客写的是修改操作,附有从头至尾写的代码(详细的注释)和数据库! 此次修改操作的源码和数据库:http://download.csdn.net/detail/biexiansheng/9732691  为了方便理解和说明,先写一下执行的流程和步奏,详细代码可以下载连接. 1:修改操作的执行流程: 1.1:修改操作需要先获取到用户信息的编号,然后才可以进行修改,脑子里一定有这个思路.故获取用户编号的操作即为查询操作.这里使用了一个小工具进行分页操

基于jsp+servlet图书管理系统之后台用户信息删除操作

上一篇的博客写的是修改操作,且附有源码和数据库,这篇博客写的是删除操作,附有从头至尾写的代码(详细的注释)和数据库! 此次删除操作的源码和数据库:http://download.csdn.net/detail/biexiansheng/9732955  自此,基于jsp+servlet开发的用户信息增删该查已经全部写完了,上面的链接是全部的代码,包含增删该查和数据库. 注意点: 1:删除操作使用的是伪删除.即只是不在页面显示了,但是还保存在数据库. 2:分页查询使用的是一个小工具,后面有时间把这

基于jsp+servlet图书管理系统之后台用户信息查询操作

上一篇的博客写的是插入操作,且附有源码和数据库,这篇博客写的是查询操作,附有从头至尾写的代码(详细的注释)和数据库! 此次查询操作的源码和数据库:http://download.csdn.net/detail/biexiansheng/9732095 为了方便理解和说明,这里简单介绍一些执行的流程,方便理解.插入操作的执行流程和说明: 1:插入操作的执行流程如下 1.1:首先登录页面,设置默认的打开页面是login.jsp. <!-- 默认模仿的是登录界面login.jsp页面 -->  &l