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能极大简化 ...
随机推荐
- 绘图——Android绘图基础:Canvas、Paint等
Android的绘图应该继承View组件,并重写它的onDraw(Canvas canvas)方法即可. 重写onDraw(Canvas canvas)方法时涉及一个绘图API:Canvas,Canv ...
- localToLocal坐标变换
localToLocal坐标变换 $(function() { init(); }); // localtoLocal var stage, arm, handler; function init(e ...
- treegrid.bootstrap使用说明
treegrid.bootstrap使用说明 这个插件是用来做有层次的表格的,大概如图: 官网 http://maxazan.github.io/jquery-treegrid/ 使用这个控件之前需 ...
- Asp.net mvc 知多少(三)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Bootstrap入门(三十)JS插件7:警告框
Bootstrap入门(三十)JS插件7:警告框 通过这个插件可以为警告信息添加点击以及消失的功能. 当使用一个.close按钮,它必须是第一个子元素.alert-dismissible,并没有文字内 ...
- Java错题
加粗为正确答案,绿色为错选答案 1.对于以下代码: for ( int i=0; i<10; i++) System.out.println(i); for循环后,i的值是多少? A.i不再存 ...
- 你不知道的getComputedStyle
你不知道的getComputedStyle jQuery的css()的底层实现就用到了getComputedStyle这个方法,也许我们用到的很少,但是不得不说这时一个非常强大的函数,下面让我们一探究 ...
- 关于小程序swiper不显示图的那些事
还有几天快过年了,在这里提前祝大家新年快乐! 今天没事研究了一下小程序,想整个轮播图玩玩,然后开始看看文档https://mp.weixin.qq.com/debug/wxadoc/dev/compo ...
- redis集群原理
redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了. 官方的一个简单测试: 测试完成了50个并发执行100000个请求. 设置和获取的值是一个256字节字符串 ...
- 三层——vb.net版
经过不懈的努力,我的vb.net 版的三层登陆终于实现了.下面将我的成果向大家展示一下. 原则 vb.net的三层登陆跟C#的三层登陆的思想是一样的都是将系统分层--U层只负责与用户 ...