Druid 连接池 JDBCUtils 工具类的使用

2023-05-16

Druid工具介绍

它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。 支持所有JDBC兼容的数据库,包括Oracle、MySQL、Derby、Postgresql、SQL Server、H2等等。 Druid针对oracle和mysql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。简单SQL语句用时10微秒以内,复杂SQL用时30微秒。 通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的

性能上图标分析

这个图标是从别人的blog上面copy过了 ,这个是sql语句进行1000次以后的查询提醒druid 连接池的性能分析,大家可以做为参考,是否准确待定。。

工具的使用

这个是在代码中去注册一些配置信息,不常用的 大家随便看看就好


package com.ruirui.druid;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.junit.Test;

import com.alibaba.druid.pool.DruidDataSource;
import com.ruirui.decoratedesgin.Utils;

public class DruidDemo {
    @Test
    public void druidTest(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///stu");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        try{
            // 获得连接:
            conn = dataSource.getConnection();
            // 编写SQL:
            String sql = "select * from student";
            pstmt = conn.prepareStatement(sql);
            // 执行sql:
            rs = pstmt.executeQuery();
            while(rs.next()){
                System.out.println(rs.getInt("id")+"   "+rs.getString("name"));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{

            Utils.releaseResouce(rs, ps
tmt, conn);
        }

    }

}  

注册信息在配置文件中


@Test
    public void demo2(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try{
            Properties properties = new Properties();
            properties.load(new FileInputStream("src/druid.properties"));
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
            // 获得连接:
            conn = dataSource.getConnection();
            // 编写SQL:
            String sql = "select * from account";
            pstmt = conn.prepareStatement(sql);
            // 执行sql:
            rs = pstmt.executeQuery();
            while(rs.next()){
                System.out.println(rs.getInt("id")+"   "+rs.getString("name")+"   "+rs.getDouble("money"));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtils.release(rs, pstmt, conn);
        }
    }  

配置文件


driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///day04
username=root
password=123

这里配置信息有很多 最大连接数量 , 最小连接数量等。。。配置的信息很多啊 大家可以去读一下官方文档。。 跟C3P0使用的情况 基本上都差不多

> 这里是下载地址druid 文档 jar包  http://pan.baidu.com/s/1jHYEPpk  

JDBCUtils工具类的使用


package com.ruirui.jdbcutils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

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.BeanListHandler;
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.mchange.v2.c3p0.ComboPooledDataSource;

public class JDBCUtils {
    /**
     *   QueryRunner:核心执行类
     *   ResultSetHandler:提供对查询结果封装
     *   DbUtils    :工具类
     */

    //c3p0 连接池
    public DataSource comboPooledDataSource = new ComboPooledDataSource();

    public Connection getConn() throws SQLException{

        return comboPooledDataSource.getConnection();
    }

    //插入数据
    public void saveData() throws SQLException {

        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);

        String sql = "insert into student values(null,'ruirui',?,?);";

        queryRunner.update(sql, "shenyang",27);
    }

    // 修改表

    public void fixData() throws SQLException{

        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql = "update student set name=? where id=?;";
        queryRunner.update(sql,"pp", 13);
    }


    // 删除操作
    public void demo3() throws SQLException{
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql ="delete from account where id =?";
        queryRunner.update(sql, 4);
    }


    // ArrayHandler:将查询到的一条记录封装到数组当中
    public void demo1() throws SQLException{
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql  = "select * from account where id = ?";
        Object[] objs = queryRunner.query(sql, new ArrayHandler(), 1); // ”1“ 代表一条数据
        System.out.println(Arrays.toString(objs));
    }

    //ArrayListHandler 
    //一条查询是ArrayHandler 一个数组
    //多条查询 就是将多个数组 存入集合中
    public void demo2() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql  = "select * from student";

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

        for (Object[] objects : query) {

            for (Object object : objects) {
                System.out.println(object.toString());
            }
        }
    }

    //查询一条记录 返回的是一个bean对象
    public void demo4() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql  = "select * from student where id = ?";
        Man man = queryRunner.query(sql, new BeanHandler<>(Man.class),5);
        System.out.println(man.toString());
    }

    //注意返回的是一个标准的javabean对象,所在定义bean对象时候成员变量必须用private定义

    //查询一条记录 返回的是一个bean对象
    public void demo5() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql  = "select * from student";
        List<Man> query = queryRunner.query(sql, new BeanListHandler<>(Man.class ));
        System.out.println(query.toString());
    }

    // MapHandler:封装一条记录到Map中
    public void demo6()throws SQLException{
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql = "select * from student where id = ?";
        Map<String,Object> map = queryRunner.query(sql, new MapHandler() ,2);
        System.out.println(map);
    } 

    // MapListHandler: //查询多条 将map集合存入list 集合中
    public void demo7()throws SQLException{
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql = "select * from student";
        List<Map<String,Object>> list = queryRunner.query(sql, new MapListHandler());
        for (Map<String, Object> map : list) {
            System.out.println(map);
        }
    }

    // ColumnListHandler ,返回的是一个列值的集合
    public void demo8()throws SQLException{
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql = "select id from student";
        List<Object> list  = queryRunner.query(sql, new ColumnListHandler());
        for (Object object : list) {
            System.out.println(object.toString());
        }
    }

    //ScalarHandler:单值查询
    public void demo9()throws SQLException{
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql = "select sum(age) from student;";
        Long count = (Long)queryRunner.query(sql, new ScalarHandler());
        System.out.println(count);
    }
    @Test
    // KeyedHandler:
    public void demo10()throws SQLException{
        QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
        String sql = "select * from student";
        Map<Object,Map<String,Object>> map= queryRunner.query(sql, new KeyedHandler("name"));
        for (Object key : map.keySet()) {
            System.out.println(key + "   "+map.get(key));
        }
    }

}  

JDBUtils 文档以及jar 下载链接

http://pan.baidu.com/s/1c13IXxu

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Druid 连接池 JDBCUtils 工具类的使用 的相关文章

  • MySQL net start mysql 发生系统错误5 解决办法

    产生的原因是权限不够 用管理员权限打开命令提示符就OK 啦 Win10解决办法 xff1a 使用快捷键win 43 x xff0c 或右击开始图标 xff0c 打开命令提示符 xff08 管理员 xff09 就解决啦
  • Docker查看远端仓库的标签工具

    背景 最近入坑了docker xff0c 比如本地想要启动一个elastic容器的话 xff0c 直接通过以下命令即可快速启动一个elasticsearch的实例 docker run d p 9200 9200 p 9300 9300 n
  • 互斥锁mutex的简单实现

    mutex一般用于为一段代码加锁 xff0c 以保证这段代码的原子性 xff08 atomic xff09 操作 xff0c 即 xff1a 要么不执行这段代码 xff0c 要么将这段代码全部执行完毕 例如 xff0c 最简单的并发冲突问题
  • Exception in thread "main" java.lang.NoClassDefFoundError: XXX

    Exception in thread 34 main 34 java lang NoClassDefFoundError XXX编译时没有报错 xff0c 一运行就不听话 网上找了一大堆 xff0c 各种解决方案都不是适合我 xff0c
  • 分享几个免费IP地址查询API接口

    1 IP地址查询接口 xff1a http apis juhe cn ip ip2addr 要先去https www juhe cn docs api 申请APPKEY 2 新浪的IP地址查询接口 xff1a http int dpool
  • 解决Cannot read property 'range' of null 错误

    为什么80 的码农都做不了架构师 xff1f gt gt gt vue工程npm run serve start dev启动时 xff0c node modules文件报 xff1a Cannot read property 39 rang
  • Gitlab Pipelines一直无法通过的临时解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 新Gitlab系统是自己搭建的 xff0c 为了使用pages功能 xff0c 因为少于8 8版本貌似就不能使用 xff01 下一篇我会补充 xff0c 毕竟是转发的 xf
  • Generate Parentheses

    Given n pairs of parentheses write a function to generate all combinations of well formed parentheses For example given
  • C++11新特性不完全测试

    摘要 Lambda auto 统一初始化 xff0c 智能指针 xff0c Regex Random function and bind xff0c hash map 右值引用和Move语义 并发 多线程库 发布 阅读全文 Richard
  • matlab练习程序(生成高斯图像)

    cl m 61 31 n 61 31 img 61 zeros m 43 1 n 43 1 img 61 double img pi 61 3 1415926 sigma 61 10 for i 61 m 2 m 2 for j 61 n
  • Ubuntu远程桌面xrdp方法

    xrdp方式 xff0c 该方法支持多用户登录并远程桌面 首先在Ubuntu上安装GNOME 界面 xff0c 在终端输入命令 xff1a sudo apt get install gnome panel 安装完成后注销用户 点击自己用户的
  • Linux通过ssh传输文件

    一 scp是什么 scp是secure copy的简写 xff0c scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令 用于在Linux下进行远程拷贝文件的命令 xff0c 和它类似的命令有cp xff0c 不过cp只是在本机
  • 认识CoreData-基础使用

    第一篇文章中并没有讲CoreData的具体用法 xff0c 只是对CoreData做了一个详细的介绍 xff0c 算是一个开始和总结吧 这篇文章中会主要讲CoreData的基础使用 xff0c 以及在使用中需要注意的一些细节 因为文章中会插
  • 如何在Debian Linux上安装配置ISC DHCP服务器

    动态主机控制协议 DHCP 给网络管理员提供了一种便捷的方式 xff0c 为不断变化的网络主机或是动态网络提供网络层地址 xff0c 其中最常用的 DHCP 服务工具是 ISC DHCP Server DHCP 服务的目的是给主机提供必要的
  • SQL学习笔记1

    以下内容是我在学习SQL xff08 http www w3school com cn sql index asp xff09 的时候的学习笔记 学习时使用的数据库软件是MySQL 数据库可视化工具 SQLyogEnt 如果大家有发现什么不
  • BAT-使用BAT方法结束进程(删除进程)

    64 echo off taskkill f im GAM exe taskkill f im GCL10 exe
  • 解决访问apache中文乱码的问题

    解决访问 apache 中文乱码的问题 修改 apache 的配置文件 Vi etc httpd conf httpd conf 在 AddDefaultCharset UTF 8 下面添加 AddDefaultCharset UTF 8
  • linux远程灰屏,Ubuntu 15.10安装VNC灰屏问题解决

    1 在Ubuntu上首先需要安装vnc4server apt get install vnc4server 2 第一次执行vncserver的时候需要为客户端连接设置8位的密码 3 打开服务后 xff0c 根据客户端号连接 也可以指定客户端
  • Android IOS WebRTC 音视频开发总结(十五)-- 培训课程大纲

    Android IOS WebRTC 音视频开发总结 xff08 十五 xff09 培训课程大纲 最近在给公司做内部培训 xff0c 主要是关于即时通讯和移动视频通话 xff0c 包括android与android xff0c ios与io
  • Docker 1.12 : 使用 Swarm 的新姿势

    本文首发于我的博客 原文链接 xff1a Docker 1 12 新特性 Docker1 12 版本做出了很大的改动 xff0c 特别是增加了对 swarm 的原生支持 xff0c 下面对新版的使用做一个总结 xff0c 供大家查阅 doc

随机推荐

  • 用CSS写一个简单的幻灯片效果页面

    这里是修真院前端小课堂 xff0c 每篇分享文从 背景介绍 知识剖析 常见问题 解决方案 编码实战 扩展思考 更多讨论 参考文献 八个方面深度解析前端知识 技能 xff0c 本篇分享的是 xff1a 用CSS写一个简单的幻灯片效果页面 1
  • Go程序Windows运行时不显示cmd窗口

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 非常简单 xff0c 编译时候加参数 go build ldflags 61 34 H windowsgui 34 转载于 https my oschina net pok
  • Python3 创建虚拟环境

    目的 使用虚拟环境是为了隔离不同项目之间的Python库 创建虚拟环境 Python3 内置了venv模块 xff0c 首先创建项目目录 xff0c 进入目录后 xff0c 执行 python3 m venv venv 激活虚拟环境 在开始
  • Ubuntu18.04LTS 文件系统简记

    Ubuntu18 04LTS 文件系统 了解Linux文件系统是熟悉掌握使用Linux系统的第一步 首先安装名为tree的工具 sudo apt install tree 运行 tree help 查看tree命令的详细用法 运行 tree
  • windows下nvm安装node之后npm命令找不到问题解决办法

    主要关键解解决办法 xff1a 61 61 61 适 用于所有东西的安装 安装有关环境配置类的软件及其他 xff0c 一般情况下切记不要安装到c盘programfiles下 xff0c 否则会出现各种问题的报错 xff01 xff01 xf
  • [问题2014S14] 复旦高等代数II(13级)每周一题(第十四教学周)

    问题2014S14 设 V 为酉空间 证明 不存在 V 上的非零线性变换 varphi 使得对 V 中任一向量 v 均有 varphi v v 61 0 注 本题是复旦高代教材 P326 习题 9 1 5 的推广
  • 8B10B编解码及FPGA实现

    概述 在使用ALTERA的高速串行接口时 xff0c GXB模块里硬件实现了8B10B编码 xff0c 用户只是 傻瓜 式的使用 xff0c 笔者也一直没有弄清楚 网上搜索了一些学习资料 xff0c 结合参考文献希望能够对其进行消化 另外
  • 零碎记录- spring security oauth2 资源服务器中设置放行路径

    在资源服务器配置类中重写configure方法 xff0c 添加放行信息 使用了 64 EnableResouceServer xff0c 且继承了ResourceServerConfigurerAdapter的类作为资源服务器配置信息类
  • Golang 新手可能会踩的 50 个坑

    译文 xff1a Golang 新手可能会踩的 50 个坑 原文 xff1a 50 Shades of Go Traps Gotchas and Common Mistakes 翻译已获作者授权 xff0c 转载请注明来源 不久前发现在知乎
  • 手把手教你使用TF服务将TensorFlow模型部署到生产环境 ...

    介 绍 将机器学习 xff08 ML xff09 模型应用于生产环境已成为一个火热的的话题 许多框架提供了旨在解决此问题的不同解决方案 为解决这一问题 xff0c 谷歌发布了TensorFlow xff08 TF xff09 服务 xff0
  • Centos/Linux下如何查看网关地址/Gateway地址

    Centos Linux下如何查看网关地址 Gateway地址 xff1f Linux下查看网关的命令还是很多的 xff0c 不过如果IP是DHCP获取 xff0c 那么有些命令是不适用的 xff0c 当然也有通用的查询网关命令 1 ifc
  • 教你Java生成文件时怎么设置编码格式

    OutputStreamWriter允许用户指定编码方式 xff0c 代码为 xff1a FileInputStream fis 61 new FileInputStream 34 文件路径 34 xff1b OutputStreamWri
  • One input and More output use 'tee'

    2008 05 22 In preparation for my Luma media player I wanted to create a simple audio player with visualization Based upo
  • 简单的任务调度(自整理)

    为什么80 的码农都做不了架构师 xff1f gt gt gt 任务调度 使用 Quartz 框架实现 1 8 6 的版本 开源框架 什么是任务调度 xff1a 即是某个时间点做某件时间 xff01 核心有是什么 xff1a 以时间为关注点
  • Laravel5.5集成七牛云上传、管理(删除、查询)

    一 为什么使用七牛云存储 1 使用七牛带宽和CDN xff0c 速度快 xff0c 不占用开发者服务器 2 支持图片任意格式 任意分辨率自动生成 xff0c 可以用来做图片服务器 3 小流量免费 xff1a 存储空间 10GB xff0c
  • centos为用户添加sudo功能

    su chmod a 43 w etc sudoers vim etc sudoers 找到root ALL 61 ALL ALL这行 复制出新的一行 xff0c 并且将root改为daniel xff08 当前用户名 xff09 chmo
  • Reverse Linked List

    本题是反转一个单链表 xff0c 题目提示使用迭代和递归两种方式 xff0c 属于比较基础的题目 一 迭代方式 xff1a 总体思路是从左到右遍历链表结点 xff0c 依次反转连接关系 每次处理相邻的两个结点 xff0c 从 lt None
  • angularJS1笔记-(17)-ng-bind-html指令

    angular不推荐大家在绑定数据的时候绑定html 但是如果你非要这么干也并不是不可以的 举个例子 xff1a lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt me
  • 旧电脑diy文件服务器,2021旧电脑自制NAS存储变废为宝.docx

    amp tid 61 13992 amp page 61 1 amp extra 61 pid15059 amp tid 61 13992 amp page 61 1 amp extra 61 pid15059 旧电脑自制NAS存储变废为宝
  • Druid 连接池 JDBCUtils 工具类的使用

    Druid工具介绍 它不仅仅是一个数据库连接池 xff0c 它还包含一个ProxyDriver xff0c 一系列内置的JDBC组件库 xff0c 一个SQL Parser 支持所有JDBC兼容的数据库 xff0c 包括Oracle MyS