JavaWeb之DBUtils
一、什么是DBUtils及作用
DBUtils是apache公司写的。DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。
1.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;
2.对于数据表的写操作,也变得很简单(只需写sql语句)
3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象
二、DBUtils的三个核心对象
2.1、QueryRunner类
QueryRunner中提供对sql语句操作的API.它主要有三个方法:query() 用于执行select,update() 用于执行insert update delete,batch() 批处理。等下下面的会详细的介绍这几种方法的用法。
2.2、ResultSetHandler接口
用于定义select操作后,怎样封装结果集.它总共有9个常用的实现类,下面我会详细的为大家介绍怎么去使用。
2.3、DbUtils类
它就是一个工具类,定义了关闭资源与事务处理的方法
三、怎么去使用DBUtils框架
3.1、使用步骤
导入相对应的jar包
创建QueryRunner对象
使用query方法执行select语句
使用ResultSetHandler封装结果集
使用DbUtils类释放资源
3.2、实例
注:本人使用的是C3P0连接池
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.commons.dbutils.QueryRunner;
- import org.apache.commons.dbutils.ResultSetHandler;
- import org.apache.commons.dbutils.handlers.BeanListHandler;
- import org.junit.Test;
- import com.jxlg.domain.User;
- public class TestSelect {
- @Test
- public void testSelect(){
- //创建一个QueryRunner对象
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- try {
- // new ResultSetHandler<List<User>>告诉我们如何封装结果集
- List<User> list = qr.query("select * from user", new ResultSetHandler<List<User>>(){
- @Override
- //query语句执行select语句后,结果一返回值的形式传递过来
- public List<User> handle(ResultSet rs) throws SQLException {
- List<User> list = new ArrayList<User>();
- while(rs.next()){
- User u = new User();
- u.setId(rs.getInt(1));
- u.setUsername(rs.getString(2));
- u.setPassword(rs.getString(3));
- u.setEmail(rs.getString(4));
- u.setBirthday(rs.getDate(5));
- list.add(u);
- }
- return list;
- }
- });
- for (User user : list) {
- System.out.println(user);
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- @Test
- public void testSelect2(){
- //创建一个QueryRunner对象
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- try {
- //执行sql语句,返回结果
- List<User> list = qr.query("select * from user where id=? and username=?", new BeanListHandler<User>(User.class),1,"tom");
- for (User user : list) {
- System.out.println(user);
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
四、DBUtils三个核心对象详解
4.1、QueryRunner对象
4.1.1、构造函数
new QueryRunner(); 它的事务可以手动控制。
也就是说此对象调用的方法(如:query、update、batch)参数中要有Connection对象。
new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。
此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。
4.1.2、常用方法
4.2、ResultSetHandler接口
4.2.1、它有9个结果处理器
ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
ColumnListHandler:取某一列的数据。封装到List中。
KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
ScalarHandler:适合取单行单列数据
BeanHandler
BeanListHandler
4.2.2、实例
- import static org.junit.Assert.*;
- import java.sql.SQLException;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- 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.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;
- import com.jxlg.domain.User;
- public class TestResultSetHandler {
- @Test
- public void test1() {
- //ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- try {
- Object[] o = qr.query("select * from user where id=?", new ArrayHandler(),5);
- for (Object object : o) {
- System.out.println(object);
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- @Test
- public void test2() throws SQLException {
- //ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- List<Object[]> list = qr.query("select * from user", new ArrayListHandler());
- for (Object[] objects : list) {
- for (Object object : objects) {
- System.out.println(object);
- }
- System.out.println("----------------------");
- }
- }
- @Test
- public void test3() throws SQLException {
- //ColumnListHandler:取某一列的数据。封装到List中
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- List<Object> list = qr.query("select username,password from user ", new ColumnListHandler(1));
- for (Object object : list) {
- System.out.println(object);
- }
- }
- @Test
- public void test4() throws SQLException {
- //KeyedHandler:取多条记录,每一条记录封装到一个Map中,
- //再把这个Map封装到另外一个Map中,key为指定的字段值。
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- //大的Map的key是表中的某列数据,小的Map的key是表的列名,所以大的map的key用的是Object类型,小的是String。
- Map<Object, Map<String, Object>> map = qr.query("select * from user", new KeyedHandler(1));
- for (Map.Entry<Object, Map<String,Object>> m : map.entrySet()) {
- System.out.println(m);//就是id至,因为设置了“1”.
- for (Map.Entry<String, Object> mm : m.getValue().entrySet()) {
- System.out.println(mm);//取出小map中的key和value
- }
- System.out.println("--------------------");
- }
- }
- @Test
- public void test5() throws SQLException {
- //MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- Map<String, Object> map = qr.query("select * from user", new MapHandler());
- for (Map.Entry<String, Object> m : map.entrySet()) {
- System.out.println(m.getKey()+"\t"+m.getValue());
- //默认取第一行数据,需要去其它行用where加条件
- }
- }
- @Test
- public void test6() throws SQLException {
- //MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- List<Map<String, Object>> list = qr.query("select * from user", new MapListHandler());
- for (Map<String, Object> map : list) {
- for (Map.Entry<String, Object> m : map.entrySet()) {
- System.out.println(m);
- }
- System.out.println("-----------");
- }
- }
- @Test
- public void test7() throws SQLException {
- //ScalarHandler:适合取单行单列数据
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- Object o = qr.query("select * from user", new ScalarHandler(2));
- System.out.println(o);
- }
- @Test
- public void test8() throws SQLException {
- //BeanHandler:适合取单行单列数据
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- User user = qr.query("select * from user", new BeanHandler<User>(User.class));
- System.out.println(user);
- }
- }
五、使用DBUtils做一个增删改查的例子
- import static org.junit.Assert.*;
- import java.sql.SQLException;
- import java.util.Date;
- import javax.crypto.spec.OAEPParameterSpec;
- import org.apache.commons.dbutils.QueryRunner;
- import org.junit.Test;
- public class TestInCURD {
- @Test
- public void testInsert() {
- //创建一个QueryRunner对象
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- try {
- qr.update("insert into user (username,password,email,birthday)values(?,?,?,?)", "guapi","4646","guapi@163.com",new Date());
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- @Test
- public void testUpdate() {
- //创建一个QueryRunner对象
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- try {
- qr.update("update user set username=?,password=? where id=4 ", "meizimeizi","520520");
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- @Test
- public void testDelete() {
- //创建一个QueryRunner对象
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- try {
- qr.update("delete from user where id=? ",4);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- @Test
- public void testBatch() {
- //创建一个QueryRunner对象
- QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
- try {
- Object[][] params = new Object[10][]; //高维代表执行多少次sql语句
- for(int i =0;i<params.length;i++){
- params[i] =new Object[]{"guapi"+i,"4646","guapi@163.com",new Date()};
- }
- qr.batch("insert into user (username,password,email,birthday)values(?,?,?,?)", params );
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
2017-03-06
JavaWeb之DBUtils的更多相关文章
- [JavaWeb]关于DBUtils中QueryRunner的一些解读.
前言:[本文属于原创分享文章, 转载请注明出处, 谢谢.]前面已经有文章说了DBUtils的一些特性, 这里再来详细说下QueryRunner的一些内部实现, 写的有错误的地方还恳请大家指出. Que ...
- 【JavaWeb】DbUtils入门之QueryRunner
DbUtils简介 根据官网的介绍,DbUtils是一种 JDBC Utility Component (翻译过来大概就是:JDBC实用部件),故名思意,和数据库操作有关 官网上的简介也称之为 JDB ...
- JavaWeb之DButils整理
一.DBUtils介绍 apache 什么是dbutils,它的作用 DBUtils是java编程中的数据库操作实用工具,小巧简单实用. 用前导包!!!DBUtils包!!! 二.DBUtils的三 ...
- JavaWeb基础—dbutils的简单入门
简明入门教程,参考:https://www.cnblogs.com/CQY1183344265/p/5854418.html 进行此章节之前,介绍一个JdbcUtils的再次的简单封装 (例如后面需要 ...
- 【转载】JavaWeb之DBUtils QueryRunner类对数据表的增、删、查(8种结果集处理方式)、改操作
一.使用QueryRunner类,实现对数据表的 insert delete update package com.shuhuadream.queryrunner; import java.sql.C ...
- [JavaWeb]关于DBUtils中QueryRunner的一些解读(转)
QueryRunner类 QueryRunner中提供对sql语句操作的API它主要有三个方法 query() 用于执行select update() 用于执行insert/update/delete ...
- Javaweb学习笔记8—DBUtils工具包
今天来讲javaweb的第8阶段学习. DBUtils技术,DBUtils是我们操作数据库很常用的功能,虽然后期使用都是它的封装结果,但是也需要掌握. 老规矩,首先先用一张思维导图来展现今天的博客内容 ...
- javaweb学习总结—Apache的DBUtils框架学习
注明: 本文转载自http://www.cnblogs.com/xdp-gacl/p/4007225.html 一.commons-dbutils简介 commons-dbutils 是 Apache ...
- JavaWeb学习总结(十四)--Apache的DBUtils
一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...
随机推荐
- CentOS Linux解决 Device eth0 does not seem to be present
通过OVF部署Linux主机后提示 ringing up interface eth0: Device eth0 does not seem to be present,delaying initi ...
- codeforces 755D. PolandBall and Polygon
D. PolandBall and Polygon time limit per test 4 seconds memory limit per test 256 megabytes input st ...
- 用mui框架开发手机app项目实践中的那些事儿
http://www.yilingsj.com/xwzj/2015-04-29/260.html 最近在玩mui框架,坑的我是:西湖的水,全都是眼泪!!! 公司的手机app要进行改版,我率先想到的是j ...
- 常见JS挂马方法及如何防止网站被黑客挂马?
最近有朋友说自己的网站平时并未作弊,文章也都是原创的,更新很稳定.可不知道为什么网站突然就被各大搜索引擎降权了,一直找不到原因.最后发现是网站被挂马了,导致网站被连累了.在此,借助马海祥博客的平台,给 ...
- webx学习
webx框架学习指南 http://openwebx.org/docs/Webx3_Guide_Book.html webx学习(一)——初识webx webx学习(二)——Webx Framewor ...
- 一篇完整的FlexBox布局指南
一篇完整的FlexBox布局指南 转载请标注本文链接并附带以下信息: 译:Cydiacen 作者:CHRIS COYIER 原文:A Complete Guide to Flexbox 原文更新于 2 ...
- hessian原理解析一(客户端分析)
hessian 是一款开源的二进制远程通讯协议,使用简单方法提供了RMI功能,主要用于面向对象的消息通信. 优点:跨平台.多语言支持.使用简单 缺点:传递复杂对象性能会下降,不适合安全性高的应用 一 ...
- HDU2063(二分图最大匹配)
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- canvas小程序-快跑程序员
canvas不用说html5带来的好东西,游戏什么的,么么哒 记得有一天玩手机游戏,就是一个跳跃过柱子那种,其实元素很简单啊,app能开发,借助html5 canvas也可以啊, 于是就开始了. -- ...
- 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)
版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...