JDBC与Druid连接池

news2025/3/12 17:23:34

1 什么是jdbc?

JDBC(java database connectivity )是Java语言连接操作关系型数据库的一套解决方案,屏蔽了底层各数据库不同的差异。 具体是通过sun公司定义的统一的一套API【标准接口】来实现解决差异, 具体实现是各大数据库厂商来实现的,即各个不同的驱动jar包。
java----jdbc统一接口----各关系型数据库

2JDBC重要的API

2.1 DriverManager(驱动管理)

注册驱动; DriverManager.registerManager()
获得数据库连接;DriverManager.getConnection();

2.2 Connection(连接)

获取执行sql语句的对象
  -- Connection.createStatement()  获得普通执行sql对象Statement
  -- Connection.prepareStatement(sql) 预编译sql的sql执行对象PreparedStatement,防止sql注入
  -- Connection.prepareCall(sql) 执行存储过程的对象CallableStatement
管理事务
-- Connection.setAutoCommit(boolean autoCommit) autoCommit=true时 事务自动提交,false时手动开启事务
-- Connection.commit() 提交事务
-- Connection.rollback() 回滚事务

2.3 ResultSet (DQL语句执行后封装的结果集对象)

  next() 判断是否存在有效数据行
  getXXX(String ColumnName) 根据列名获得数据
  getXXX(int columnIndex) 根据列索引获得数据  索引从1开始

2.4 PreparedStatement (预编译sql执行对象)

预编译并执行sql
使用?占位符去替换sql中的变量,防止sql注入
设置变量setXXX(i,j) XXX为变量类型 i为出现?的位置 j为?的值

PreparedStatement的好处
预编译sql语句,性能更高【如果使用的模板一样,则只需要检查一次】
对敏感sql语句进行转义处理,防止sql注入问题

3 代码示例

连接Mysql8的数据库,需要的引入的包mysql-connector-java-8.0.28.jar

操作的数据表如下数据表

public class JDBCDemo1 {

    public static void main(String[] args) throws Exception {

        //获得MySQL的驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //设置连接数据库的信息
        //连接本地的face数据库
        String connectUrl="jdbc:mysql://localhost:3306/face?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT";
        //账号
        String user="root";
        //连接密码
        String password="Liuyifei@@";

        //获得Connection
        Connection connection= DriverManager.getConnection(connectUrl,user,password);

        //查询操作
        //执行sql语句
        String sql="select * from ip ";

        //获得执行sql的statement对象
        Statement statement = connection.createStatement();
        //执行sql语句获得结果集
        ResultSet resultSet = statement.executeQuery(sql);


        //遍历结果集
        while (resultSet.next()){
            //打印输出IP与门岗信息
System.out.println(resultSet.getString("ip")+"=="+resultSet.getString("position"));
        }


       //变量使用占位符给替换,防止sql注入问题
        String sql="update ip set is_delete='N' where id=?";

        //预编译执行sql对象,防止sql注入
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //给变量赋值 SetXXX(i,j)
        //XXX为变量的类型
        //i为变量出现的位置
        //j为变量的值
        preparedStatement.setInt(1,4);


        //执行sql语句
        boolean execute = preparedStatement.execute();
        if(execute){
            System.out.println("success!");
        }else{
            System.out.println("failed!");

        }

        //关闭连接
        statement.close();
        connection.close();
    }
}

4 数据库连接池

由JDBCDemo1 可知,在执行sql语句之前需要从驱动那获得数据库连接,执行完之后需要手动地关闭数据库连接。当服务中出现多数据操作时,频繁的开闭数据库连接将会大大得影响服务的性能。因此需要对数据库的连接进行额外的处理。

数据库连接池是一个容器,用于管理、分配数据库的连接;
它允许现有的程序重复使用同一个连接,而不是重复创建一个新的连接;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连 接遗漏
使用连接池的好处:资源重用,提升系统响应速度,避免数据库连接遗漏

Sun公司提供了一个标准接口DataSource 来定义数据库连接池的基本功能,具体实现由第三方组织来实现这个标准接口.
常见的数据库连接池实现有
DBCP
C3P0
DRUID【阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是Java语言最好的数据库连接池之一】

/**
 * 数据库连接池 DRUID连接池
 * 使用DRUID连接池后,避免原生的DriverManager驱动类来获取数据库连接
 * 使用的jar包druid-1.1.16
 * 定义配置文件
 * 加载配置文件
 * 获取数据库连接池对象
 * 获得连接
 */
public class ConnectionPool {
    public static void main(String[] args) throws Exception {


        Properties prop=new Properties();
        prop.load(new FileInputStream("src/properties/DruidConnection.Properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

        Connection connection = dataSource.getConnection();

        System.out.println(connection);

        //E:\PROJECT\JAVA\Study\JdbcStudy
        System.out.println(System.getProperty("user.dir"));

        //执行sql语句
        PreparedStatement statement = connection.prepareStatement("insert into uuser(username,password,root,is_delete)values(?,?,?,?)");
        statement.setString(1,"lyf");
        statement.setString(2,"lyf");
        statement.setString(3,"admin");
        statement.setString(4,"N");

        statement.execute();

    }
}

项目结构如下=

项目结构如下

DruidConnection.Properties

## 数据库连接字符串
url=jdbc:mysql://XXXXX:3306/face?useSsl=false&useUnicode=true&serverTimezone=UTC
## 数据库连接账号
username= 账号
## 数据库连接密码
password= 密码
## 数据库连接驱动
classDriver=com.mysql.cj.jdbc.Driver

##初始化时建立物理连接的个数
initialSize=5

关于Druid的其他配置信息可查看官方说明 根据实际需求进行配置

Durid配置说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库】 mysql的四种安装方式

目录 MySQL 安装部署 一,仓库安装 二,本地安装 三,容器安装 四,源码安装 MySQL 安装部署 一,仓库安装 1,使用rpm命令从指定的网址装包 ​ [rootlocalhost yum.repos.d]# rpm -ivh https://repo.mys…

每日学术速递2.10

Subjects: cs.Cv 1.Spatiotemporal Deformation Perception for Fisheye Video Rectification 标题:鱼眼视频矫正的时空形变感知 作者:Shangrong Yang, Chunyu Lin, Kang Liao, Yao Zhao 文章链接:https://arxiv.org/abs/2302.03934v1 项…

【手写 Vuex 源码】第四篇 - Vuex 中 Getters 的实现

一,前言 上篇,主要介绍了 Vuex 中 State 状态的实现,主要涉及以下几个点: 创建 Store 类中的 State 状态;借助 Vue 实现 State 状态的响应式; 本篇,继续介绍 Vuex 中 getters 的实现&#xf…

VHDL语言基础-时序逻辑电路-寄存器

目录 寄存器的设计: 多位寄存器: 多位寄存器的VHDL描述: 移位寄存器: 串进并出的移位寄存器的VHDL描述: 寄存器的设计: 多位寄存器: 一个D触发器就是一位寄存器,如果需要多位寄存器&…

飞凌嵌入式RK3568J核心板助力工业机器人产业迈向高质量发展新阶段

工业机器人是能够代替人工完成高强度重复工作的多自由度机器装置,不仅可以确保产品质量,还可以大幅提高生产效率。据工信部数据显示,“十三五”期间我国工业机器人产量从7.2万套增长到了21.2万套,年均增长31%,预计2023…

切换分支报错:Untracked Files Prevent Checkout

切换分支报错:Untracked Files Prevent Checkoutgit分支切换 Untracked Files Prevent Checkout本人解决办法:git分支切换 Untracked Files Prevent Checkout 新起的项目在切换master分支到工作分支时,出现下图的问题: Untracked…

【机器学习】过拟合与正则化

上一章——逻辑回归 文章目录三种拟合状态解决过拟合的三种方法什么是正则化正则化的数学原理线性回归恭喜三种拟合状态 在之前的课程中,我们说过机器学习的中极为重要的一步,就是给训练集找到一条合适的拟合曲线。 还是以房价问题这个回归问题为例&…

【微服务】微服务架构超强讲解,通俗易懂

微服务架构目录一、微服务架构介绍二、出现和发展三、传统开发模式和微服务的区别四、微服务的具体特征五、面向服务的架构SOA(service oriented architecture)和微服务的区别1、SOA喜欢重用,微服务喜欢重写2、SOA喜欢水平服务,微…

Linux教程:MQTT入门基础概念与学习介绍及服务部署搭建并使用桌面工具进行测试开发

前言: ----在2023年的今天,智能家居与智能家电的兴起犹如滚滚长江迅速袭来,智能终端设备也不断出现在人们的视野当中,实现远程控制,其中必然不能缺少终端与终端,终端与服务之间的交互,如何来解…

ag-Grid Enterprise

ag-Grid Enterprise Ag-Grid被描述为一种商业产品,已在EULA下分发,它非常先进,性能就像Row分组一样,还有范围选择、master和case、行的服务器端模型等等。 ag Grid Enterprise的巨大特点: 它具有以下功能和属性&#x…

Docker调用Intel集显实现FFmpeg硬解码

文章目录Docker调用Intel集显实现FFmpeg硬解码参考FFmpeg 集成qsv方式一 容器完成所有步骤方式二 容器完成部分步骤方式三 dockerfile部署Docker调用Intel集显实现FFmpeg硬解码 参考 ffmpeg_qsv_docker拉取该镜像可以实现FFmpeg集成vaapi的硬加速,通过dockerfile文…

什么是特权访问管理(PAM)

特权访问管理 (PAM) 是指一组 IT 安全管理原则,可帮助企业隔离和管理特权访问、管理特权帐户和凭据、控制谁可以获得对哪些端点的管理访问权限级别,并监视用户对该访问权限执行的操作。 什么是特权访问 特权访问是一种 IT 系统访…

2023.2.10学习记录Docker容器

Docker 必须跑在Linux内核上 镜像是一个轻量级可执行的独立软件包 新建一个docker容器只需要几秒钟 Docker常用命令 启动类命令 镜像命令 容器命令 docker images docker search --limit 5 redis docker pull redis:6.0.8 docker system df 查看镜像/容器/…

使用QT中的绘画工具与定时器工具实现简易时钟

需求&#xff1a;使用QT中的绘画工具与定时器工具实现简易时钟代码实现过程&#xff1a;widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter> //引入画家类 #include<QPaintEvent> //引入绘制事件类 #include&l…

vue-router 源码解析(三)-实现路由守卫

文章目录基本使用导语初始化路由守卫useCallbacks 发布订阅模式管理路由守卫push 开始导航resolve返回路由记录匹配结果navigate 开始守卫抽取路由记录guardToPromiseFn 用Promise包装守卫方法extractComponentsGuards 从组件中抽取守卫beforeRouteLeave 守卫收集composition 守…

error: failed to push some refs to ... 就这篇,一定帮你解决

目录 一、问题产生原因 二、解决办法 三、如果还是出问题&#xff0c;怎么办&#xff1f;&#xff08;必杀&#xff09; 一、问题产生原因 当你直接在github上在线修改了代码&#xff0c;或者是直接向某个库中添加文件&#xff0c;但是没有对本地库同步&#xff0c;接着你想…

【数据结构初阶】第三节.顺序表详讲

文章目录 前言 一、顺序表的概念 二、顺序表功能接口概览 三、顺序表基本功能的实现 四、四大功能 1、增加数据 1.1 头插法&#xff1a; 1.2 尾插法 1.3 指定下标插入 2、删除数据 2.1 头删 2.2 尾删 2.3 指定下标删除 2.4 删除首次出现的指定元素 3、查找数据…

JAVA-线程池技术

目录 概念 什么是线程&#xff1f; 什么是线程池&#xff1f; 线程池出现背景 线程池原理图 JAVA提供线程池 线程池参数 如果本篇博客对您有一定的帮助&#xff0c;大家记得留言点赞收藏哦。 概念 什么是线程&#xff1f; 是操作系统能够进行运算调度的最小单位。&am…

ChatGPT的解释

概念 ChatGPT&#xff0c;美国OpenAI研发的聊天机器人程序,于2022年11月30日发布。ChatGPT是人工智能技术驱动的自然 语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人 类一样来聊天交流&am…

干货 | PCB拼板,那几条很讲究的规则!

拼板指的是将一张张小的PCB板让厂家直接给拼做成一整块。一、为什么要拼板呢&#xff0c;也就是说拼板的好处是什么&#xff1f;1.为了满足生产的需求。有些PCB板太小&#xff0c;不满足做夹具的要求&#xff0c;所以需要拼在一起进行生产。2.提高SMT贴片的焊接效率。只需要过一…