Apache DbUtils 探秘
听说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 探秘的更多相关文章
- Apache—DBUtils框架简介
转载自:http://blog.csdn.net/fengdongkun/article/details/8236216 Apache—DBUtils框架简介.DbUtils类.QueryRunner ...
- JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表
本文目录: 1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData 2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData ...
- apache DBUtils 使用例子demo
转自:http://blog.csdn.net/earbao/article/details/44901061 apache DBUtils是java编程中的数据库操作实用工具,小巧简单实用, 1.对 ...
- Apache DBUtils使用总结 【转】
Apache DBUtils使用总结 DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味. ...
- Apache—dbutils开源JDBC工具类库简介
Apache—dbutils开源JDBC工具类库简介 一.前言 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用 ...
- Apache—DBUtils框架
1.所需要jar包 commons-collections-2.1.1.jarmchange-commons-java-0.2.11.jarmysql-connector-java-5.1.18-bi ...
- Apache—DBUtils
简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影 ...
- Apache DbUtils - JDBC轻量级封装的工具包
前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看.大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的例如大家常用的 ...
- Apache DBUtils框架 结果处理器
package com.itheima.dbutil; import java.util.List; import java.util.Map; import org.apache.commons.d ...
随机推荐
- 微信小程序开发小记
年前的时候,因为公司开发小程序的人员不够,临时参与了一个项目中几个小模块的开发,这里做个简单的小记录,眼过千篇不若手过一遍,希望将来如果要用到时不至于大脑空白! 开发工具:wechat_devtool ...
- codevs 搜索题汇总(黄金级)
2801 LOL-盖伦的蹲草计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖 ...
- [Luogu 3414]SAC#1 - 组合数
Description 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 今天他萌上了组合数.现在他很想知道simga(C(n,i))是多少:其中C是组合数(即C(n,i)表示n个物品无顺序选取i个的方案 ...
- TopCoder SRM 561 Div 1 - Problem 1000 Orienteering
传送门:https://284914869.github.io/AEoj/561.html 题目简述: 题外话: 刚开始看题没看到|C|<=300.以为|C|^2能做,码了好久,但始终解决不了一 ...
- ●SCOI2018 AFO
Day2 T3代码: #include<cstdio> #include<cstring> #include<iostream> using namespace s ...
- Hello,World!!----来自半个新OIer的问候
为了记录OI生涯的点点滴滴故申请此博客,说是半个新OIer,其实我的OI生涯并不算很短了吧...现在也算是初三下学期了...也算是混迹NOIP第5个年头了.文化课上也没什么临考压力,那就好好准备第5场 ...
- ●BZOJ 1069 [SCOI2007]最大土地面积
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1069 题解: 计算几何,凸包,旋转卡壳 其实和这个题差不多,POJ 2079 Triangl ...
- hdu4542 && ZOJ2562(反素数)
反素数: 对于任何正整数,其约数个数记为,例如,如果某个正整数满足:对任意的正整 数,都有,那么称为反素数. 有两个特点: 1.一个反素数的质因子必是从2开始的质数 2.如果,那么必有 最常见的问题如 ...
- ●BZOJ 4710 [Jsoi2011]分特产
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4710 题解: 容斥,组合先看看这个方案数的计算:把 M 个相同的东西分给 N 个人,每个人可 ...
- PTA 旅游规划(25 分)
7-10 旅游规划(25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条 ...