听说Apache的DbUtils很好用,而且是对jdbc的简单的封装,所以可以和jdbc一起混搭,多以今天就来尝试一下,关于DbUtils 是如何使用的。


准备

  • 数据库: MySQL
  • 依赖:
    • mysql-connector-java-5.1.7-bin.jar
    • apache-commons-dbutils.jar

创建数据库

create table dbutil(
id int(10) not null primary key auto_increment,
name varchar(30) not null
);

# 先插入一条测试语句
insert into dbutil(name) values("Molly");

# 结果如下:
mysql> select * from dbutil;
+----+-------+
| id | name  |
+----+-------+
|  1 | Molly |
+----+-------+
1 row in set (0.00 sec)

制作Bean模型

package dbutils;

public class Bean {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

创建共有数据库连接对象

package dbutils;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnTools {

    private static String DRIVER = "com.mysql.jdbc.Driver";
    private static String URL = "jdbc:mysql://localhost:3306/practice";
    private static String USER = "root";
    private static String PASSWORD = "mysql";

    public static Connection getConnection(){

        try {
            Class.forName(DRIVER);
            Connection conn = null;
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            if (conn != null) {
                return conn;
            }
            return null;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }

}

测试代码CRUD

  • 首先测试插入语句:
@Test
    public void insert() throws Exception {

        Connection conn = ConnTools.getConnection();
        QueryRunner runner = new QueryRunner();
        for (int i = 0; i < 10; i++) {
            runner.update(conn, "insert into dbutil(name) values(?)", "Mark"+(1+i));
        }
        // 记得用完数据库的链接就要及时的关闭!
        DbUtils.close(conn);
        System.out.println("成功差入10条数据!");
    }

结果如下:

mysql> select * from dbutil;
+----+--------+
| id | name   |
+----+--------+
|  1 | Molly  |
|  4 | Mark1  |
|  5 | Mark2  |
|  6 | Mark3  |
|  7 | Mark4  |
|  8 | Mark5  |
|  9 | Mark6  |
| 10 | Mark7  |
| 11 | Mark8  |
| 12 | Mark9  |
| 13 | Mark10 |
+----+--------+
11 rows in set (0.00 sec)
  • 然后是删除语句:
@Test
    public void delete() throws Exception {
        Connection conn = ConnTools.getConnection();
        QueryRunner runner = new QueryRunner();
        runner.update(conn, "delete from dbutil where id >= 2");
        DbUtils.close(conn);
        System.out.println("删除语句成功执行!");

    }

结果如下:

mysql> select * from dbutil;
+----+-------+
| id | name  |
+----+-------+
|  1 | Molly |
+----+-------+
1 row in set (0.00 sec)
  • 再是修改语句
@Test
    public void modify() throws Exception {
        Connection conn = ConnTools.getConnection();
        QueryRunner runner = new QueryRunner();
        // 这里使用的是不限参数的那个重载方法!
        runner.update(conn, "update dbutil set name = ? where id = ?", "MOLLY", 1);
        DbUtils.close(conn);
        System.out.println("修改语句执行成功!");
    }

结果如下:

mysql> select * from dbutil;
+----+-------+
| id | name  |
+----+-------+
|  1 | Molly |
+----+-------+
1 row in set (0.00 sec)

mysql> select * from dbutil;
+----+-------+
| id | name  |
+----+-------+
|  1 | MOLLY |
+----+-------+
1 row in set (0.00 sec)
  • 再来个查找的方法,
@Test
    public void selectOne() throws Exception {
        Connection conn = ConnTools.getConnection();
        QueryRunner runner = new QueryRunner();
        Bean bean = (Bean)runner.query(conn,"select name from dbutil where id = ?",new BeanHandler<Bean>(Bean.class),1);
        DbUtils.close(conn);
        System.out.println(bean.getName());
    }

结果如下:

MOLLY

查找的时候有可能是一下子查找多个,所以再来看一个查找多个的小例子。

由于刚才插入的数据被删除了,所以我们需要先运行一下insert方法来添加一些数据。然后运行下面的代码。

@Test
    public void selectAll() throws Exception {
        Connection conn = ConnTools.getConnection();
        QueryRunner runner = new QueryRunner();
        List<Bean> beans = (List<Bean>) runner.query(conn, "select * from dbutil", new BeanListHandler<Bean>(Bean.class));
        DbUtils.close(conn);
        for (Bean bean : beans) {
            System.out.println(bean.getName());
        }
    }

结果如下:

MOLLY
Mark1
Mark2
Mark3
Mark4
Mark5
Mark6
Mark7
Mark8
Mark9
Mark10

发现数据库中的所有的数据都被读取过来了。

高级使用

说是高级篇,其实只要是掌握了上面讲的CRUD,就差不多可以正常的进行开发了。这里无非是关于上面的代码的一些看法。

  • 首先是单个的Map的数据获取;
@Test
    public void map() throws Exception {
        Connection conn = ConnTools.getConnection();
        QueryRunner runner = new QueryRunner();
        java.util.Map<String , Object> map = (java.util.Map<String, Object>) runner.query(conn, "select name from dbutil where id = ?",new MapHandler(),1);
        DbUtils.close(conn);
        System.out.println(map.get("name"));
    }

结果为:

MOLLY
  • 然后是多个Map的获取,此时需要借助MapListHandler来实现。
@Test
    public void mapList() throws Exception {
        Connection conn = ConnTools.getConnection();
        QueryRunner runner = new QueryRunner();
        List<Map<String,Object>> maps = runner.query(conn, "select * from dbutil",new MapListHandler());
        for(Map<String,Object> map : maps) {
            System.out.println(map.get("id")+"<<-------->>" + map.get("name"));
        }
        DbUtils.close(conn);
    }

结果是:

1<<-------->>MOLLY
14<<-------->>Mark1
15<<-------->>Mark2
16<<-------->>Mark3
17<<-------->>Mark4
18<<-------->>Mark5
19<<-------->>Mark6
20<<-------->>Mark7
21<<-------->>Mark8
22<<-------->>Mark9
23<<-------->>Mark10

# 主键id的变化是由于采用了自增长策略所引起的,这很正常!

我的理解

  • 关于List型数据,我们需要指定的就是Bean的类型。

    其实这一点我们认真的思考一下,也可以想到这是理所当然的嘛。因为在数据库中每一行数据,都是我们的一个Bean的准实例化对象。我们在获取的时候就知道了我们将会获得的数据类型,所以我们需要明确的指定Bean的类型。

    指定的时候可以根据传入的参数的不同来决定使用

    • BeanHandler
    • BeanListHandler
  • 关于Map类型的数据,我们唯一需要注意的就是获取到的数据的个数,然后决定使用哪一个处理器,然后对返回的数据集进行逻辑上的处理即可!

    • MapHandler
    • MaoListHandler

总结

从上面的例子中我们可以看出,在使用DbUtils的过程中,就和使用jdbc的方式是一样的,唯一的不同就是DbUtils的封装性更强了。我们可以方便的从中获取数据。

然后就是对于Map和List方式的数据获取,要使用特定的重载方法和相关的处理器,这样我们才能就事论事的获得我们想要的数据!

本质上来讲,代码只是我们思维的具现化的产物,也是逻辑的物理表现。如果心中根本没有逻辑,又怎么能奢求写出很好的代码。编程永远不仅仅是码代码,更是一种思想。

Apache DbUtils 探秘的更多相关文章

  1. Apache—DBUtils框架简介

    转载自:http://blog.csdn.net/fengdongkun/article/details/8236216 Apache—DBUtils框架简介.DbUtils类.QueryRunner ...

  2. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表

    本文目录:       1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData        2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData       ...

  3. apache DBUtils 使用例子demo

    转自:http://blog.csdn.net/earbao/article/details/44901061 apache DBUtils是java编程中的数据库操作实用工具,小巧简单实用, 1.对 ...

  4. Apache DBUtils使用总结 【转】

    Apache DBUtils使用总结   DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味. ...

  5. Apache—dbutils开源JDBC工具类库简介

    Apache—dbutils开源JDBC工具类库简介 一.前言 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用 ...

  6. Apache—DBUtils框架

    1.所需要jar包 commons-collections-2.1.1.jarmchange-commons-java-0.2.11.jarmysql-connector-java-5.1.18-bi ...

  7. Apache—DBUtils

    简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影 ...

  8. Apache DbUtils - JDBC轻量级封装的工具包

    前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看.大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的例如大家常用的 ...

  9. Apache DBUtils框架 结果处理器

    package com.itheima.dbutil; import java.util.List; import java.util.Map; import org.apache.commons.d ...

随机推荐

  1. 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池)

    一.本文产生原由: 之前文章<总结消息队列RabbitMQ的基本用法>已对RabbitMQ的安装.用法都做了详细说明,而本文主要是针对在高并发且单次从RabbitMQ中消费消息时,出现了连 ...

  2. Java IO(四)

    在文件操作流中,输入输出的目标都是文件,但是有时候,我们并不需要写入文件,只是需要中转一下而已,这样就会显得很麻烦,所以我们就可以使用内存操作流.在内存操作流中,输入输出目标都是内存. 内存输出流:B ...

  3. ●BZOJ 3566 [SHOI2014]概率充电器

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3566题解: 概率dp,树形dp 如果求出每个点被通电的概率t, 那么期望答案就是t1×1+t ...

  4. poj 1873 凸包+枚举

    The Fortified Forest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6198   Accepted: 1 ...

  5. bzoj3930[CQOI2015]选数 容斥原理

    3930: [CQOI2015]选数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1383  Solved: 669[Submit][Status] ...

  6. 报表生成工具 —— iText

    十二月份一直在做生成报表的功能,中间踩了不少坑,刚好今天有时间,写篇博客记录一下. 一.iText 简介 iText 是著名开放源码站点 sourceforge 的一个项目,是一个用于生成 PDF 文 ...

  7. flask+apscheduler+redis实现定时任务持久化

    在我们开发flask的时候,我们会结合apscheduler实现定时任务,我们部署到服务器上,会不会遇到这样的问题,每次我们部署后,我们重启服务后,原来的定时任务都需要重启,这样对我们经常迭代的项目肯 ...

  8. Jupyter Notebook

    Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言.在本文中,我们将介绍 Jupyter notebook 的主要特性,以 ...

  9. Template Method 模板设计模式

    什么是模板设计模式 对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关 ...

  10. CSS中display:block属性的作用

    display:block可以理解为块,举个简单的例子!比如你做一个超链接,<li><a href="#">超链接</a></li> ...