第1章    DBUtils

如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils。

DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。

概述

DBUtils是java编程中的数据库操作实用工具,小巧简单实用。

DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

Dbutils三个核心功能介绍

l  QueryRunner中提供对sql语句操作的API.

l  ResultSetHandler接口,用于定义select操作后,怎样封装结果集.

l  DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

QueryRunner核心类

l  update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作

l  query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作

QueryRunner实现添加、更新、删除操作

l  update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作

添加

public void insert(){

try {

//获取一个用来执行SQL语句的对象   QueryRunner

QueryRunner qr = new QueryRunner();

String sql = "INSERT INTO zhangwu(name,money,parent) VALUES(?,?,?)";

Object[] params = {"股票收入", 5500, "收入"};

Connection conn = JDBCUtils.getConnection();

int line = qr.update(conn,sql,params);// 用来完成表数据的增加、删除、更新操作

//结果集处理

System.out.println("line = " + line);

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

更新

public void update(){

try {

//创建一个QueryRunner对象,用来完成SQL语句的执行

QueryRunner qr = new QueryRunner();

//执行SQL语句

String sql = "UPDATE zhangwu SET money = money+1000 WHERE name=?";

Object[] params = {"股票收入"};

Connection conn = JDBCUtils.getConnection();

int line = qr.update(conn, sql, params);

//结果集的处理

System.out.println("line="+line);

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

删除

public void delete(){

try {

//创建一个QueryRunner对象,用来完成SQL语句的执行

QueryRunner qr = new QueryRunner();

//执行SQL语句

String sql = "DELETE FROM zhangwu WHERE name = ?";

Object[] params = {"股票收入"};

Connection conn = JDBCUtils.getConnection();

int line = qr.update(conn, sql, params);

//结果集的处理

System.out.println("line="+line);

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

QueryRunner实现查询操作

l  query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params),用来完成表数据的查询操作

ResultSetHandler结果集处理类

JavaBean(实体类)

JavaBean就是一个自定义类,在开发中常用封装数据。具有如下特性

  1. 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
  2. 提供私有字段:private 类型 字段名;
  3. 提供getter/setter方法:
  4. 提供无参构造

ArrayHandler与ArrayListHandler查询

l  ArrayHandler:将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值

  QueryRunner qr = new QueryRunner();

  Object[] objArray = qr.query(conn, sql, new ArrayHandler());

  System.out.println( Arrays.toString(objArray) );

l  ArrayListHandler:将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。

List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());

//结果集的处理

for (Object[] objArray : list) {

System.out.println(  Arrays.toString(objArray) );

}

BeanHandler与BeanListHandler查询

l  BeanHandler :将结果集中第一条记录封装到一个指定的javaBean中。

QueryRunner qr = new QueryRunner();

Object[] params = {1};

Connection conn = JDBCUtils.getConnection();

ZhangWu zw = qr.query(conn, sql, new BeanHandler<ZhangWu>(ZhangWu.class));

System.out.println(zw);

l  BeanListHandler :将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中

List<ZhangWu> list = qr.query(conn, sql, new BeanListHandler<ZhangWu>(ZhangWu.class));

//结果集处理

for (ZhangWu zw : list) {

System.out.println(zw);

}

ColumnListHandler与ScalarHandler查询

l  ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中

List<String> list = qr.query(conn, sql, new ColumnListHandler<String>(“username”));

l  ScalarHandler:它是用于单数据。例如select count(*) from 表操作。

Double max = qr.query(conn, sql, new ScalarHandler<Double>());

MapHandler与MapListHandler查询

MapHandler:将结果集第一行封装到Map集合中,Key 列名, Value 该列数据

Map<String,Object> map = qr.query(conn, sql,new MapHandler());
        Set<Entry<String, Object>> set = map.entrySet();
        for (Entry<String, Object> entry : set) {
            System.out.println(entry.getKey()+"->"+entry.getValue());
        }

MapListHandler:将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合

  List<Map<String,Object>> mapList = qr.query( sql,new MapListHandler());
         for (Map<String, Object> map2 : mapList) {
            Set<Entry<String, Object>> set = map2.entrySet();
            for (Entry<String, Object> entry : set) {
                System.out.println(entry.getKey()+"->"+entry.getValue());
            }
        }

连接池

实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池

连接池概述

l  概念

用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

l  规范

Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!

常见的连接池:DBCP、C3P0。

接下来,我们就详细的学习一下DBCP连接池。

DBCP连接池

DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池。

导入jar包

编写工具类

连接数据库表的工具类, 采用DBCP连接池的方式来完成,Java中提供了一个连接池的规则接口 :

DataSource : 它是java中提供的连接池,作为 DriverManager (注册驱动)工具的替代项。在DBCP包中提供了DataSource接口的实现类,我们要用的具体的连接池 BasicDataSource类

 

public class JDBCUtils {

public static final String DRIVER = "com.mysql.jdbc.Driver";

public static final String URL = "jdbc:mysql://localhost:3306/daydb";

public static final String USERNAME = "root";

public static final String PASSWORD = "root";

/*

* 创建连接池BasicDataSource

*/

public static BasicDataSource dataSource = new BasicDataSource();

//静态代码块

static {

//对连接池对象 进行基本的配置

dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动

dataSource.setUrl(URL); //指定要连接的数据库地址

dataSource.setUsername(USERNAME); //指定要连接数据的用户名

dataSource.setPassword(PASSWORD); //指定要连接数据的密码

}

/*

* 返回连接池对象

*/

public static DataSource getDataSource(){

return dataSource;

}

}

工具类的使用

l  测试类

/*

* 演示使用DBUtils工具  完成数据库表的增加操作

*/

public class Demo {

// 插入功能

@Test

public void insert(){

try {

//获取一个用来执行SQL语句的对象   QueryRunner

QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());

String sql = "INSERT INTO zhangwu(name,money,parent) VALUES(?,?,?)";

Object[] params = {"股票收入", 5500, "收入"};

int line = qr.update(sql,params);

//结果集处理

System.out.println("line = " + line);

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

常见配置项

总结

l  DBUtils工具

l  作用:简化JDBC的操作

l  常用类与方法

n  QueryRunner 用来执行SQL语句对象

u  update(Connection conn, String sql, Object… params) 插入表记录、更新表记录、删除表记录

u  query(Connection conn, String sql, ResultSetHandler handler, Object… params) 查询表记录

n  ResultSetHandler 处理结果集的对象(8种)

l  DBCP连接池

n  作用:自身维护了多个Connection连接对象维护

n  BasicDataSource类  是  DataSource接口的实现类

l  DataSource接口,它是java与每种数据库连接池 连接的规范标准

l  DBCP连接池常见的配置

javaEE ->DBUtils&连接池的更多相关文章

  1. DBUtils连接池,websocket

    1.mysql数据库连接池 概念:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放. 这样 ...

  2. Python DBUtils 连接池对象 (PooledDB)

    数据处理框架用到 mysql, 需要在多进程中的多线程中使用 mysql 的连接 使用到的模块: DBUtils 实现: 使用 DBUtils 中的 PooledDB 类来实现. 自己写一个类, 继承 ...

  3. python - DBUtils 连接池减少oracle数据库的连接数

    问题: 接到需求,告知项目的oracle连接次数过多,对系统造成太过大的负担,要求减少oracle数据库的连接次数 分析: 仔细分析代码以后,发现产生问题的原因,在于之前要求提升oracle监控的监控 ...

  4. [JavaEE] Hibernate连接池配置测试

    转载自51CTO http://developer.51cto.com/art/200906/129914.htm Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以 ...

  5. JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作

    1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...

  6. JavaEE连接池泄漏问题检测Oracle数据库

    1.项目环境 项目是典型的轻量级JavaEE项目,使用SSH框架构建,数据源使用DBCP管理,和Spring进行了整合. 项目数据库使用Oracle数据库. 项目DBCP配置内容如下 ###### D ...

  7. Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

    前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...

  8. 【JAVAWEB学习笔记】10_JDBC连接池&DBUtils

    使用连接池改造JDBC的工具类: 1.1.1          需求: 传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序. * 在程序开始的 ...

  9. 【知了堂学习心得】浅谈c3p0连接池和dbutils工具类的使用

    1. C3P0概述 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. 2. C3P ...

随机推荐

  1. webpack之Loader

    我们知道webpack的优点之一就是专注于处理模块化的项目,能做到开箱即用,但同时这也是webpack的缺点,只能用于模块化开发的项目,例如:Vue,React,Angular.Webpack在进行打 ...

  2. Java 理解类加载过程 -- 自定义加载器

    类加载器可以看下我的收藏: https://www.cnblogs.com/dongguacai/p/5879931.html 现在准备一个字节码文件: 自定义加载器: package com.xzl ...

  3. 宝塔利用git+ webhooks 实现git更新远程同步Linux服务器

    参考: https://blog.csdn.net/alipea/article/details/83858177 https://www.bt.cn/bbs/thread-5348-1-1.html ...

  4. nignx location index的用法

    来源:https://blog.csdn.net/qq_32331073/article/details/81945134#_10 index指令的作用 在前后端分离的基础上,通过Nginx配置,指定 ...

  5. JVM原理与深度调优(一)

    什么是jvm jvm是java虚拟机 运行在用户态.通过应用程序实现java代码跨平台.与平台无关.实际上是"一次编译,到处执行" 1.从微观来说编译出来的是字节码!去到哪个平台都 ...

  6. 数据结构入门第二课(浙大mooc)

    数据结构入门第二课 目录 数据结构入门第二课 引子 多项式的表示 方法1 顺序结构表示多项式各项 方法2 顺序结构表示非零项 方法3 链表结构存储非零项 多项式问题的启示 线性表 线性表的抽象数据类型 ...

  7. 基于jenkins自动打包并部署docker环境

    一.实验环境 git                      192.168.200.71 jenkins    192.168.200.72 docker               192.16 ...

  8. oracle获取表字段及表注释的相关操作

    一.获取表字段: select * from user_tab_columns where Table_Name='用户表' user_tab_columns 为当前用户的columns,除此之外还有 ...

  9. 用libevent写的海康摄像头rtsp客户端

    之前一直使用live555作为RTSP的客户端,但其框架臃肿,虽然支持各种格式,但实际中并没有这些需求,关键是其注重于格式的解析,却不注重网络IO,单线程下性能也不高,重新用libevent编写rts ...

  10. 【Linux常见命令】ls命令

    ls - list directory contents ls命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录). 语法:  ls [OPTION]... [FILE]...  l ...