超级详细的JDBC和数据库连接池讲解

文章目录

  • JDBC简介
    • 概念
    • 本质
    • 好处
  • JDBC快速入门
  • JDBC中API详解
    • DriverManager
      • 驱动管理类作用
      • 注册驱动
      • 获取连接
    • Connection
      • 数据库连接对象作用
      • 获取执行SQL的对象
      • 事务管理
    • Statement
      • 作用
      • 执行SQL语句
    • ResultSet
      • 原理
      • 使用步骤
    • PreparedStatement
      • SQL注入
      • 获取对象
      • 操作步骤
    • 原理
      • 好处
  • JDBC工具类
  • 三层开发业务的案例分析
    • 图解
    • 三层结构模型
    • 分层的好处
  • 数据库连接池
    • 简介
    • 实现
    • Druid连接池
      • 常用的配置参数
      • 基本使用
      • 使用步骤

JDBC简介

概念

就是使用Java语言操作关系型数据库的一套API
全称:Java DataBase Connectivity Java数据库连接

本质

是一套操作所有关系型数据库的规则,即接口
Snipaste_2024-04-13_18-22-29.png

好处

  1. 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
  2. 可随时替换底层数据库,访问数据库的Java代码基本不变

JDBC快速入门

操作步骤

1. 创建工程,导入驱动jar包
在当前模块下创建lib文件夹,将jar包放到lib文件夹下,
2. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
3. 获取连接
Connection conn = DriverManager.getConnection(url,user,password);
4. 定义SQL语句
String sql = "select ...";
5. 获取执行SQL对象
Statement stmt = conn.createStatement();
6. 执行SQL
boolean result = stmt.executeQuery(sql);
7. 处理返回结果
System.out.println(result);
8. 释放资源
stmt.close();
conn.close();

JDBC中API详解

DriverManager

驱动管理类作用

  1. 注册驱动
  2. 获取数据库连接

注册驱动

Class.forName(“com.mysql.jdbc.Driver”);
Driver类源码
Snipaste_2024-04-13_18-50-23.png
此处也可写成DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 用前面代码创建Driver类,创建时静态代码块又会创建Driver类,使其创建了俩次,所有用最上面class那个代码

获取连接

static Connection getConnection(String url,String user,String password)

  1. url:连接路径

Snipaste_2024-04-13_18-57-50.png

  1. user:用户名
  2. password:密码

连接路径详解
Snipaste_2024-04-13_18-58-59.png

Connection

数据库连接对象作用

  1. 获取执行SQL的对象
  2. 管理事务

获取执行SQL的对象

  • 普通执行SQL对象

Statement createStatement()

  • 预编译SQL的执行SQL对象:防止SQL注入

PrepareStatement prepareStatement(sql)

事务管理

开启事务:SetAutoCommit(boolean autoCommit):
true为自动提交事务,false为手动提交事务(开启事务)
提交事务:commit()
回滚事务:rollback()

Statement

作用

执行SQL语句

执行SQL语句

  • int executeUpdate(sql):执行DML,DDL语句
    • 返回值:DDL执行成功返回0
    • DML语句影响的行数
  • ResultSet executeQuery(sql):执行DQL语句
    • 返回值:ResultSet结果集对象

ResultSet

原理

  1. ResultSet内部有一个指针,刚开始记录开始位置
  2. 调用next方法,ResultSet内部指针会移动到下一行数据,存在返回true,不存在返回false
  3. 我们可以通过ResultSet得到一行数据getXxx得到某列数据

Snipaste_2024-04-13_19-24-53.png

使用步骤

  1. 游标向下移动一行,并判断改行是否有数据:next()
  2. 获取数据:getXxx(参数)
while(rs.next()){
    re.getXxx(参数);
}

PreparedStatement

SQL注入

用户在页面提交数据的时候人为的添加一些特殊字符,使得sql语句的结构发生了变化,最终可以在没有用户名或者密码的情况下进行登录

获取对象

PreparedStatement是Statement的子接口,可以防止sql注入问题
PreparedStatement prepareStatement(String sql)
注意:sql提前创造好的,sql语句中需要参数,使用?占位
select * from user where username = ?and password = ?;

操作步骤

1.PreparedStatement pstmt = conn.prepareStatement(sql);

2.pstmt.setXxx(int index,要放入的值);
第一个参数:int index:表示sql语句中问号出现的位置,从1开始计数
第二个参数:给问号的位置传入的值

3.执行,不需要再传递sql了
pstmt.executeQuery();  执行select
pstmt.executeUpdate();  执行insert,update,delete

原理

  1. 在获取PreparedStatement对象时,将SQL语句发送给mysql服务器进行检查,编译
  2. 执行时就不用再进行这些步骤了,速度更快
  3. 如果sql模板一样,则只需进行一次检查,编译

Snipaste_2024-04-13_20-11-44.png

好处

  1. 预编译SQL,性能更高
  2. 防止SQL注入:将敏感字符进行转义

JDBC工具类

通过学习上述代码,我们发现在执行增删改查的时候,除了sql语句和执行sql语句的对象不同外,其他都相同,所以我们可以将其重复的抽成一个抽象类
下面是我所写的代码:

public class JdbcUtil {

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

    private static final String URL = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";

    private static final String USER = "root";

    private static final String PASSWORD = "123456";

    //注册驱动,仅执行一次,所以可以放到static代码块中
    static {
        try {
            Class.forName(DRIVER);

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }

    public static void getClose(Connection conn, Statement stmt) {
        getClose(conn,stmt,null);
    }

    public static void getClose(Connection conn, Statement stmt, ResultSet rs) {

        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        try {
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

public class Demo {

    @Test
    public void testUitl(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = JdbcUtil.getConnection();
            conn.setAutoCommit(false);
            String sql = "update user set password = ? where username = ?";

            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,"666");
            pstmt.setString(2,"wangwu");
            int count = pstmt.executeUpdate();
            if (count > 0){
                System.out.println("更改成功");
                conn.commit();
            }else {
                conn.rollback();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            JdbcUtil.getClose(conn,pstmt,rs);
        }
    }
}

三层开发业务的案例分析

图解

Snipaste_2024-04-13_21-11-45.png

三层结构模型

  1. web层:接收客户端发送的数据 -> 把接收的数据封装成对象 -> 调用service层方法(并传递对象) -> 根据service层方法执行结果,给客户反馈
  2. service层:处理业务逻辑(会调用dao层中的方法)
  3. dao层:和数据库交互(底层利用jdbc技术)

分层的好处

  1. 解耦:降低代码的依赖关系
  2. 可维护性:哪一层出现问题,直接维护哪一层
  3. 可扩展性:哪一层需要添加代码,直接添加即可
  4. 可重用性:一个方法可以被其他层重复调用

数据库连接池

简介

数据库连接池是个容器,负责分配,管理数据库连接(Connection),它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个
好处

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

实现

  • 标准接口:DataSource
    • 获取连接 Connection getConnection
  • 常见的数据库连接池
    • DBCP
    • C3P0
    • Druid
  • Druid

Snipaste_2024-04-13_21-45-04.png

Druid连接池

常用的配置参数

Snipaste_2024-04-13_21-46-05.png

基本使用

核心类:DruidDataSourceFactory
public static DataSource createDataSource(Properties p);
创建一个properties配置文件,然后书写数据库连接参数(参考配置参数)

使用步骤

  1. 导入jar包
  2. 定义配置参数,定义参数
  3. 加载配置文件(创建properties对象)
  4. 获取数据库连接池对象(使用核心类构建连接池)
  5. 获取连接
  6. 执行sql语句
  7. 关闭资源,归还连接

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目管理-项目问题及需求解决要点

综上所述:在项目管理过程中,项目问题和需求逐渐增多,要不断的适应项目的种种,要想到如果没有问题要解决了,你的价值体现在哪里?要这样想,风险也是机会,所以问题等等也是自己的机会&a…

CopyTranslator下载地址及安装教程

CopyTranslator是一款免费且开源的机器翻译工具,旨在提供快速、便捷的翻译服务。它采用了先进的神经网络机器翻译技术,能够提供准确、流畅的翻译结果。 CopyTranslator的特点和功能如下: 多语言翻译:支持多种常见的语言对&#…

Unity让地图素材遮挡人物

点击编辑/项目设置/图形,透明度排序模式设置自定义轴,透明度排序轴Y设置为1其他为0。 此时人物和地图素材的图层排序相等,当人物的高度大于地图素材时,人物则被遮挡。

【零基础学数据结构】双向链表

1.双向链表的概念 1.1头节点 1.2带头双向循环链表 注意: 哨兵位创建后,首尾连接自己 1.3双链表的初始化 // 双向链表的初始化 void ListInit(ListNode** pphead) {// 给双链表创建一个哨兵位*pphead ListBuyNode(-1); } 2.双向链表的打印 // 双向…

Qlik在数据隐私计划中利用人工智能和分析

在技术快速变革的时代,政府正在努力追赶技术发展和我们日常生活中产生的个人身份信息(“PII”)数量不断增加的步伐。规范 PII 使用的隐私法不断加强(Gartner估计,虽然到 2020 年,全面的隐私法将覆盖全球 10…

2024年广东省网络系统管理样题第1套网络搭建部分

2024年广东省职业院校技能大赛样题1 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书,赛题,解析等资料,知识点培训服务 添加博主wx:liuliu5488233 网络系统管理赛项 模块A:网络…

Unity给地图物体添加对撞机

在项目/Assets下创建Prefabs文件夹 选择素材拖入层级下,注意此时地图素材有可能看不到,此时选择Tilemap在检查器中修改图层顺序调至最低。 添加对撞机 选择素材,在检查器中点击添加组件Box Collider 2D,将素材拖入Prefabs文件下…

C++ - 二叉搜索树的基本实现

目录 0. 引言 1. 二叉搜索树 1.1 定义 1.2 特点 2. 二叉搜索树的实现 2.1 基本框架 2.2 查找 2.3 插入 2.4 删除 2.4.1 右子树为空 2.4.2 左子树为空 2.4.3 左右都不为空 2.4.4 代码 0. 引言 在C语言数据结构中,我们已经基本了解过二叉树&#xff…

04异常Lambda算法正则

异常 异常是什么? 异常是代码在编译或者执行的过程中可能出现的错误。避免异常的出现,同时处理可能出现的异常,让代码更稳健。 异常分为几类? 编译时异常、运行时异常。编译时异常:没有继承RuntimeExcpetion的异常…

GB/T 28181标准中的错误码,国标28181中可能出现的SIP协议相关的错误码及其含义

目录 一、GB/T 28181标准介绍 (一)概述 (二)关键内容和特点 1. 系统架构: 2. 设备接入: 3. 网络通信: 4. 业务功能: 5. 安全保护: 6. 平台管理: &a…

MATLAB 构建协方差矩阵,解算特征值和特征向量(63)

MATLAB 局部点云构建协方差矩阵,解算特征值和特征向量(63) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 对于某片有待分析的点云,我们希望构建协方差矩阵,计算特征值和特征向量,这是很多算法必要的分析方法,这里提供完整的计算代码(验证正确) !!! 特别需要注意…

03-JAVA设计模式-责任链模式

责任链模式 什么是责任链模式 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许你将请求沿着处理者链进行传递。每个处理者均对请求进行某些处理,并可决定是否将请求沿着链传递下去。这种模式给予请求的处理…

使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景,博主所在的业务组有一个核心系统,需要同步两个不同数据源给过来的数据到redis中,但是每次同步之前需要过滤掉一部分数据,只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

Windows 关闭占用指定端口的进程

以下示例以443端口为例,具体哪个端口视自己情况而定 输入命令 # 输出的最后一列就是进程号pid netstat -ano | findstr "443" 找出占用443端口的进程号(pid)(第二列是你本机的应用占用的端口,看第二列就行)如下图&am…

面向电力行业定制安全云工作站解决方案,麒麟信安出席2024年电力企业信创替代技术研讨会

日前,由中国电子企业协会主办的“2024年电力企业信创替代技术研讨会”在江苏南京正式召开。会议以国家推进实现自主可控、加快建设“数字中国”为大背景,聚焦电力企业紧抓“信创替代”机遇,通过安全可靠的软硬件迭代升级,实现企业…

算法打卡day39|动态规划篇07| Leetcode 70. 爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数

算法题 Leetcode 70. 爬楼梯&#xff08;进阶版&#xff09; 题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 输入描述…

初始Linux(上)

目录 Linux的发展史UNIX发展史Linux的发展史 Linux下的基本命令ls指令pwd命令cd指令touch指令mkdir指令rmdir指令和rm指令man指令cp指令mv指令cat指令 总结 Linux的发展史 UNIX发展史 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名…

从0到1实现RPC | 12 限流

在服务提供者provider端添加限流逻辑 限流&#xff1a;指定时间内请求数超过指定阈值时就抛出异常。 在ProviderInvoker的调用过程中&#xff0c;添加限流逻辑&#xff1a; 使用滑动窗口SlidingTimeWindow统计30s的请求数&#xff1b;每个服务service对应一个滑动窗口&#…

【C语言】字符串函数和内存函数及其模拟实现

文章目录 前言 一、常见字符串库函数1.strlen函数2.长度不受限制的字符串函数2.1 strcpy2.2 strcat2.3 strcmp 3.长度受限制的字符串函数3.1 strncpy3.2 strncat3.3 strncmp 二、字符串查找函数strstrstrtok 三、strerror函数四、内存操作函数1.memcpy2.memmove3.memcmp 五、字…

天地人和•大道不孤——卢禹舜中国画作品展在重庆美术馆隆重开幕

2024年4月12日&#xff0c;由中国国家画院、重庆市文化和旅游发展委员会主办&#xff0c;重庆美术馆&#xff08;重庆画院、重庆国画院&#xff09;、北京八荒锦绣美术馆、中国国际文化交流基金会卢禹舜艺术基金承办的“天地人和•大道不孤——卢禹舜中国画作品展”开幕式在重庆…