jdbc框架-dbutils的简单使用

dbutils:是apache组织的一个工具类,jdbc的框架,更方便我们使用

使用步骤:
  1.导入jar包(commons-dbutils-1.4.jar)
  2.创建一个queryrunner类
    queryrunner作用:操作sql语句

    构造方法:
      new QueryRunner(Datasource ds);

  3.编写sql
  4.执行sql
    query(..):执行r操作
    update(...):执行cud操作

核心类或接口
  QueryRunner:类名
作用:操作sql语句

构造器:
  new QueryRunner(Datasource ds);

注意:
  底层帮我们创建连接,创建语句执行者 ,释放资源.

常用方法:
  query(..):
  update(..):

DbUtils:释放资源,控制事务 类
  closeQuietly(conn):内部处理了异常
  commitAndClose(Connection conn):提交事务并释放连接
....

示例一:insert

1.创建一个项目DataSourse

2.新建2个包,分别为com.util.hjh、com.dbutils.hjh

3.com.util.hjh包下放工具类DataSourseUtils.java;包com.dbutils.hjh放DbutilTest01.java

4.导入jar包(commons-dbutils-1.4.jar),buildPath。

DataSourseUtils.java源码:

package com.util.hjh;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource; public class DataSourseUtils {
//建立连接池ds
private static ComboPooledDataSource ds = new ComboPooledDataSource(); //获取数据源
public static DataSource getDataSourse() {
return ds;
} //获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
} //释放资源
public static void closeResourse(Connection conn,Statement st) {
try {
if(st!=null) {
st.close();
}else {
st = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null) {
conn.close();
}else {
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**释放资源closeResourse(conn,ps)*/
public static void closeResourse(Connection conn,PreparedStatement ps) {
try {
if(ps!=null) {
ps.close();
}else {
ps = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null) {
conn.close();
}else {
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**释放资源closeResourse(rs)*/
public static void closeResourse(ResultSet rs) {
try {
if(rs!=null) {
rs.close();
}else {
rs = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

DbutilTest01.java源码:

package com.dbutils.hjh;

import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import com.util.hjh.DataSourseUtils; public class DbutilsTest01 {
@Test
public void insert() throws SQLException {
//创建QueryRunner对象,操作sql语句
QueryRunner qr = new QueryRunner(DataSourseUtils.getDataSourse()); //编写sql语句
String sql = "insert into student values(?,?,?);"; //执行sql
int i = qr.update(sql,"07","wdc","79"); System.out.println("插入了"+i+"行数据");
}
}

数据库表现为:

DBUtils用的最多的莫过于其结果集的处理,毕竟仅仅得到一个ResultSet屁用没有。而结果集的处理正是依赖于ResultSetHandler 接口及其实现类。

ResultSetHandler:封装结果集 接口
  ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler

(了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回
(了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
(了解)ColumnListHandler, 将查询结果的指定一列放入list中返回 
(了解)MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回
★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回
★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值

ArrayHandler, 将查询结果的第一条记录封装成数组,返回

ArrayHandlerTest.java源码:

package com.dbutils.hjh;

import java.sql.SQLException;
import java.util.Arrays;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.junit.Test;
import com.util.hjh.DataSourseUtils; public class ArrayHandlerTest {
@Test
public void test() throws SQLException {
//创建QueryRunner对象,操作sql语句
QueryRunner qr = new QueryRunner(DataSourseUtils.getDataSourse()); //编写sql语句
String sql = "select * from student"; //执行sql ArrayHandler, 将查询结果的第一条记录封装成数组,返回
Object [] query = qr.query(sql, new ArrayHandler()); //打印
System.out.println(Arrays.toString(query));
}
}

代码运行,console输出为:[1, hejh, 100]

ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回

ArrayListHandlerTest.java源码:

package com.dbutils.hjh;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.junit.Test;
import com.util.hjh.DataSourseUtils; public class ArrayListHandlerTest {
@Test
public void test() throws SQLException {
//创建QueryRunner对象,操作sql语句
QueryRunner qr = new QueryRunner(DataSourseUtils.getDataSourse()); //编写sql语句
String sql = "select * from student"; //执行sql ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
List<Object[]> list = qr.query(sql, new ArrayListHandler()); //打印
for (Object[] obj : list) {
System.out.println(Arrays.toString(obj));
}
}
}

局部测试,代码运行,console输出为:

[1, hejh, 100]
[2, swy, 101]
[3, haha, 99]
[4, sansa, 88]
[5, zys, 88]
[6, yz, 95]
[7, wdc, 79]
[22, erya, 103]

★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回(首先需要创建一个bean类)

Student的bean类:

package com.bean.hjh;

public class Student {
private int id;
private String name;
private int grate; public Student() {}
public Student(int id,String name,int grate) {
this.id = id;
this.name = name;
this.grate = grate;
} 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 int getGrate() {
return grate;
}
public void setGrate(int grate) {
this.grate = grate;
} @Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", grate=" + grate + "]";
}
}

BeanHandlerTest.java源码:
package com.dbutils.hjh;

import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.junit.Test;
import com.util.hjh.DataSourseUtils;
import com.bean.hjh.Student; public class BeanHandlerTest {
@Test
public void test() throws SQLException {
//创建QueryRunner对象,操作sql语句
QueryRunner qr = new QueryRunner(DataSourseUtils.getDataSourse()); //编写sql语句
String sql = "select * from student"; //执行sql BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
Student student = qr.query(sql, new BeanHandler<>(Student.class)); //打印
System.out.println(student.toString());
}
}

console输出:Student [id=1, name=hejh, grate=100]

★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.

package com.dbutils.hjh;

import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test; import com.bean.hjh.Student;
import com.util.hjh.DataSourseUtils; public class BeanListHandlerTest {
@Test
public void test() throws SQLException {
//创建QueryRunner对象,操作sql语句
QueryRunner qr = new QueryRunner(DataSourseUtils.getDataSourse()); //编写sql语句
String sql = "select * from student"; //执行sql ★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
List<Student> list =qr.query(sql, new BeanListHandler<>(Student.class)); //打印
for (Student student : list) {
System.out.println(student.toString());
}
}
}

console输出:

Student [id=1, name=hejh, grate=100]
Student [id=2, name=swy, grate=101]
Student [id=3, name=haha, grate=99]
Student [id=4, name=sansa, grate=88]
Student [id=5, name=zys, grate=88]
Student [id=6, name=yz, grate=95]
Student [id=7, name=wdc, grate=79]
Student [id=22, name=erya, grate=103]

MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回

案例:

数据库同上、项目结构同上,新增MapHandlerTest.java类

MapHandlerTest.java源码:

package com.dbutils.hjh;

import java.sql.SQLException;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.junit.Test;
import com.util.hjh.DataSourseUtils; public class MapHandlerTest {
@Test
public void test() throws SQLException {
//创建QueryRunner对象,操作sql语句
QueryRunner qr = new QueryRunner(DataSourseUtils.getDataSourse()); //编写sql语句
String sql = "select * from student"; //执行sql MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回
Map<String,Object> map = qr.query(sql, new MapHandler()); //打印
System.out.println(map);
}
}

console输出为:

{grate=100, name=hejh, id=1}

MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回

案例:

数据库同上、项目结构同上,新增MapListHandlerTest.java类

package com.dbutils.hjh;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.junit.Test;
import com.util.hjh.DataSourseUtils; public class MapListHandlerTest {
@Test
public void test() throws SQLException {
//创建QueryRunner对象,操作sql语句
QueryRunner qr = new QueryRunner(DataSourseUtils.getDataSourse()); //编写sql语句
String sql = "select * from student"; //执行sql MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回
List<Map<String,Object>> list = qr.query(sql, new MapListHandler());
//打印
for (Map<String, Object> map : list) {
System.out.println(map);
}
}
}

console输出为:

{grate=100, name=hejh, id=1}
{grate=101, name=swy, id=2}
{grate=99, name=haha, id=3}
{grate=88, name=sansa, id=4}
{grate=88, name=zys, id=5}
{grate=95, name=yz, id=6}
{grate=79, name=wdc, id=7}
{grate=103, name=erya, id=22}

ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值

案例:

数据库同上、项目结构同上,新增ScalarHandlerTest.java类

package com.dbutils.hjh;

import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import com.util.hjh.DataSourseUtils; public class ScalarHandlerTest {
@Test
public void test() throws SQLException {
//创建QueryRunner对象,操作sql语句
QueryRunner qr = new QueryRunner(DataSourseUtils.getDataSourse()); //编写sql语句
String sql = "select count(*) from student"; //执行sql ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值
Object obj =qr.query(sql, new ScalarHandler()); //打印
System.out.println(obj); //console输出为:8
     System.out.println(obj.getClass().getName());//java.lang.Long 查看类型

}
}

jdbc框架-dbutils的简单使用的更多相关文章

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

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

  2. (二十二)自定义简化版JDBC(Dbutils框架的设计思想)

    目录 元数据概念 DataBaseMetaData ParameterMetaData ResultSetMetaData 编写简化版的JDBC O-R Mapping 概念 自定义简化版JDBC 元 ...

  3. 【总结】编写自己的JDBC框架

    一.数据库连接池: 在一般用JDBC 进行连接数据库进行CRUD操作时,每一次都会: 通过:java.sql.Connection conn = DriverManager.getConnection ...

  4. javaweb学习总结(四十)——编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  5. JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  6. 编写自定义的JDBC框架与策略模式

    本篇根据上一篇利用数据库的几种元数据来仿造Apache公司的开源DbUtils工具类集合来编写自己的JDBC框架.也就是说在本篇中很大程度上的代码都和DbUtils中相似,学完本篇后即更容易了解DbU ...

  7. 黑马程序员—创建JDBC框架及原理分析

    对于Java数据库的连接,由最初学习的每次全部手工代码,到后面的不断利用知识简化代码量:这是不断学习的过程,就像人类由原始社会的钻木取火到当代的文明,都是一步步过来的! 本文不从最开始的JDBC入门开 ...

  8. javaweb总结(四十)——编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  9. 编写自己的JDBC框架(转)

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

随机推荐

  1. Asp.Net 应用程序在IIS发布后无法连接oracle数据库问题的解决方法

    asp.net程序编写完成后,发布到IIS,经常出现的一个问题是连接不上Oracle数据库,具体表现为Oracle的本地NET服务配置成功:用 pl/sql 等工具也可以连接上数据库,但是通过浏览器中 ...

  2. springmvc 串口读写 基于win7使用txrx netbeans jdk1.8 maven的

    引入 <dependency> <groupId>org.rxtx</groupId> <artifactId>rxtx</artifactId& ...

  3. request.getSession().getServletContext().getRealPath("upload/" ); 获取不到 tomcat 服务器目录

    上传一个文件,找不到该文件的位置 设置上传的文件是在项目中的话 可以通过查找项目的路径锁定上传的文件路径 解决步骤: 可以通过jsp页面 打印获取项目的物理路径 控制台即可输出项目路径 这只是找了了上 ...

  4. 洛谷P2827 蚯蚓

    传送门 pts85/90(90应该是个意外,第一次交是90之后都是85了): 优先队列模拟题意 #include<iostream> #include<cstdio> #inc ...

  5. Dapper的分页代码

    public KeyValuePair<Pagination, IList<AttachmentModel>> AttachmentPagination(Pagination ...

  6. Leetcode129. Sum Root to Leaf Numbers求根到叶子节点数字之和

    给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到叶子节点生成的所有 ...

  7. 获取MMSQL数据库表信息

    SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, 字段序号=a.colorder, 字段名=a.n ...

  8. Django项目:CRM(客户关系管理系统)--23--15PerfectCRM实现King_admin多条件过滤

    登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html list_filter = ('source','consultant','consult_co ...

  9. 20190814-A Second

    一秒,或是,第二次? 这考试也太频繁了吧…… 考试过程: 看三道题. T1没思路. 然后去厕所清醒了一下. 在厕所的时候,突然想到可以离散化. 于是就这么搞了. 然后去写T2. T2好像是数学题. 于 ...

  10. 猜数字游戏_Python

    预先设置数字变量 age_of_test = 25 #这里设置为25,也可随意 guess_age = int (input("guess age:")) if guess_age ...