Apache DbUtils应用实例

2024-01-18 17:18
文章标签 应用 实例 apache dbutils

本文主要是介绍Apache DbUtils应用实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看。大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的 例如大家常用的Hibernate与Mybatis。当然如果人们要一个纯粹的封装了JDBC的工具类,使用Apache Common DbUtils(下面简称ACD)是个不错的选择,这个工具在JDBC的基础上稍加封装是JDBC的操作更加便捷,在学习使用这个框架的途中你也不需要学 习太多的API类,因为一共也才3个部分(3个包)。

  1. org.apache.commons.dbutils (该包中的类主要帮助我们更便捷的操作JDBC)

  2. org.apache.commons.dbutils.handlers(该包中的类都是实现org.apache.commons.dbutils.ResultSetHandler接口的实现类)

  3. org.apache.commons.dbutils.wrappers(该包中的类主要是封装了对Sql结果集的操作)

使用这个DbUtils的一些优势:

  1. 防止了资源的泄露,写一段JDBC的准备代码其实并不麻烦,但是那些操作确实是十分耗时和繁琐的,也会导致有时候数据库连接忘记关闭了导致异常难以追踪。

  2. 干净整洁的持久化代码,把数据持久化到数据库的代码被打打削减,剩下的代码能够清晰简洁的表达你的操作目的。

  3. 自动把ResultSets中的工具映射到JavaBean中,你不需要手动的使用Setter方法将列值一个个赋予相应的时日,Resultset中的每一个行都大表一个完成的Bean实体。    

要学习如何使用这个框架,最简单的方式就是用它写个Demo-CRUD操作,让我们先做个准备动作在Mysql中建立一个测试专用表Visitor。

/*创建Visitor*/
CREATE TABLE Visitor
(Id INT(11) NOT NULL AUTO_INCREMENT,Name VARCHAR(1000) NOT NULL,Email VARCHAR(1000) NOT NULL,Status INT NOT NULL DEFAULT 1,CreateTime DateTime,PRIMARY KEY(Id)
)

建完表结构,我们就可以学习怎么利用框架中的Utils类帮助我们完成CRUD-DEMO,其实对于这个框架主要操作的是ResultSetHandler接口的实现类与QueryRunner类

创建对应的JavaBean实体类如下:

package david.apache.model;import java.text.SimpleDateFormat;
import java.util.Date;public class Visitor {private int id;private String name;private String email;private int status;private Date createTime;public Visitor() {// TODO Auto-generated constructor stubsetCreateTime(new Date());}public Visitor(String name, String email) {this.setName(name);this.setEmail(email);this.setStatus(1);this.setCreateTime(new Date());}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn String.format("{Id: %d, Name: %s, Email: %s, CreateTime: %s}", getId(), getName(), getEmail(),new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(getCreateTime()));}
}

首先我们先新建一个获取Connection的方法:

private static Connection getConnection() {Connection conn = null;try {Class.forName(CONNECTION_DRIVER_STR);conn = DriverManager.getConnection(CONNECTION_STR, "root", "123456");} catch (Exception e) {e.printStackTrace();}return conn;
}

新建方法(对于里面的自增字段,我们可以采用变通的方法来插入,使用select last_insert_id()方法)

/** 新增Visitor, ScalarHandler的demo*/
public static void insertVisitor(Visitor visitor) {Connection conn = getConnection();QueryRunner qr = new QueryRunner();String sql = "insert into visitor (Name, Email, Status, CreateTime) values (?, ?, ?, ?)";try {int count = qr.update(conn, sql, visitor.getName(), visitor.getEmail(), 1, new Date());BigInteger newId = (BigInteger) qr.query(conn, "select last_insert_id()", new ScalarHandler<BigInteger>(1));visitor.setId(Integer.valueOf(String.valueOf(newId)));System.out.println("新增" + count + "条数据=>Id:" + newId);} catch (SQLException e) {e.printStackTrace();}
}

大家可以看到操作的步骤其实很简单,也是写SQL可以了,对于自增字段我们通过select last_insert_id()的方法利用ScalarHandler<BigInteger>实体类来返回达到变通效果。

删除方法

public static void deleteVisitor(int id) {Connection conn = getConnection();QueryRunner qr = new QueryRunner();String sql = "delete from visitor where status>0 and id=?";try {int count = qr.update(conn, sql, id);System.out.println("删除" + count + "条数据。");} catch (SQLException e) {// TODO: handle exceptione.printStackTrace();}
}

查询方法

public static Visitor retrieveVisitor(int id) {Connection conn = getConnection();Visitor visitor = null;QueryRunner qr = new QueryRunner();String sql = "select * from visitor where status>0 and id=?";        try {visitor = (Visitor) qr.query(conn, sql, new BeanHandler<Visitor>(Visitor.class), id);System.out.println(visitor);return visitor;} catch (Exception e) {e.printStackTrace();}return visitor;
}

更新操作

public static void updateVisitor(int id) {Visitor visitor = retrieveVisitor(id);System.out.println("更新前:" + visitor);Connection conn = getConnection();String updateFieldStr = visitor.getName();QueryRunner qr = new QueryRunner();String sql = "update visitor set Name = ?, Email = ?, Status = ?, CreateTime = ? where status>0 and Id = ?";if (updateFieldStr.contains("updated")) {updateFieldStr = updateFieldStr.substring(0, updateFieldStr.indexOf("updated"));} else {updateFieldStr = updateFieldStr + "updated";}visitor.setName(updateFieldStr);try {int count = qr.update(conn, sql, new Object[] { visitor.getName(), visitor.getName(), visitor.getStatus(),visitor.getCreateTime(), visitor.getId() });System.out.println("更新了" + count + "条数据");System.out.println("更新后:" + visitor);} catch (SQLException e) {// TODO: handle exceptione.printStackTrace();}
}

BeanListHandler方法

public static void getVisitorList() {Connection conn = getConnection();QueryRunner qr = new QueryRunner();String sql = "select * from visitor where status>0";try {List<Visitor> ls = qr.query(conn, sql, new BeanListHandler<Visitor>(Visitor.class));for (Visitor visitor : ls) {System.out.println(visitor);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}
}

MapHandler操作

public static void getVisitWithMap(int id) {Connection conn = getConnection();QueryRunner qr = new QueryRunner();String sql = "select * from visitor where status>0 and id=?";try {Map<String, Object> map = qr.query(conn, sql, new MapHandler(), id);Integer visitorId = Integer.valueOf(map.get("Id").toString());String visitorName = map.get("Name").toString();String visitorEmail = map.get("Email").toString();Integer visitorStatus = Integer.valueOf(map.get("Status").toString());SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());Visitor visitor = new Visitor(visitorName, visitorEmail);visitor.setId(visitorId);visitor.setStatus(visitorStatus);visitor.setCreateTime(visitorCreateTime);System.out.println(visitor);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}
}

MapListHandler方法

public static void getVisitWithMapLs() {Connection conn = getConnection();QueryRunner qr = new QueryRunner();String sql = "select * from visitor where status>0";try {List<Map<String, Object>> mapLs = qr.query(conn, sql, new MapListHandler());for (Map<String, Object> map : mapLs) {Integer visitorId = Integer.valueOf(map.get("Id").toString());String visitorName = map.get("Name").toString();String visitorEmail = map.get("Email").toString();Integer visitorStatus = Integer.valueOf(map.get("Status").toString());SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());Visitor visitor = new Visitor(visitorName, visitorEmail);visitor.setId(visitorId);visitor.setStatus(visitorStatus);visitor.setCreateTime(visitorCreateTime);System.out.println(visitor);}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}

经过上面的几个示例,相信大家应该知道怎么用这个框架了吧~ 框架的官网地址


本文转自【http://www.blogjava.net/davidjefiny/archive/2014/01/05/apache_common_dbutils.html】

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则作者保留追究法律责任的权利

这篇关于Apache DbUtils应用实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/619701

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝