超级详细的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 {@Testpublic 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. 关闭资源,归还连接

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣刷题 二叉树层序遍历相关题目II

NO.116 填充每个节点的下一个右侧节点指针 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,…

redis的主从复制(docker方式快速入门和实战)

目录 一、主从复制简介 二、配置主从服务器 2.1使用配置文件的形式来主从复制 2.2使用纯代码的方式来进行主从复制; 2.3脱离主服务器 三、一些注意事项 一、主从复制简介 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器…

【论文阅读】MCTformer: 弱监督语义分割的多类令牌转换器

【论文阅读】MCTformer: 弱监督语义分割的多类令牌转换器 文章目录 【论文阅读】MCTformer: 弱监督语义分割的多类令牌转换器一、介绍二、联系工作三、方法四、实验结果 Multi-class Token Transformer for Weakly Supervised Semantic Segmentation 本文提出了一种新的基于变换…

尝试在手机上运行google 最新开源的gpt模型 gemma

Gemma介绍 Gemma简介 Gemma是谷歌于2024年2月21日发布的一系列轻量级、最先进的开放语言模型,使用了与创建Gemini模型相同的研究和技术。由Google DeepMind和Google其他团队共同开发。 Gemma提供两种尺寸的模型权重:2B和7B。每种尺寸都带有经过预训练&a…

【动手学深度学习】15_汉诺塔问题

注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备python语言基础,本人小白,如内容有误感谢您的批评指正 汉诺塔(To…

人员抽烟AI检测算法原理介绍及实际场景应用

抽烟检测AI算法是一种基于计算机视觉和深度学习技术的先进工具,旨在准确识别并监测个体是否抽烟。该算法通过训练大量图像数据,使模型能够识别出抽烟行为的关键特征,如烟雾、手部动作和口部形态等。 在原理上,抽烟检测AI算法主要…

[lesson22]对象的销毁

对象的销毁 对象的销毁 生活中的对象都是被初始化后才上市的 生活中的对象被销毁前会做一些清理工作 一般而言,需要销毁的对象都应该做清理 解决方案 为每个类都提供一个public的free函数对象不在需要时立即调用free函数进行清理 存在的问题 free只是一个普通…

稀碎从零算法笔记Day44-LeetCode:整数转罗马数字

题型:贪心、模拟 链接: 12. 整数转罗马数字 - 力扣(LeetCode) 来源:LeetCode 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 …

淘宝批量采集商品详情数据(属性丨详情图丨sku丨价格等)

淘宝批量采集商品详情数据(包括属性、详情图、SKU、价格等)可以通过以下几种方式实现: 使用淘宝数据抓取工具:这类工具,如某鱼等,能够自动化采集淘宝商品数据,并将其转换成CSV、Excel等格式&am…

【PyQt5】环境配置

PyQt5 环境配置 一、前言1.1 PyQt5介绍1.2 PyCharm集成Pyqt5 二、pyqt5安装三、PyQt5-tools工具包安装四、常用工具环境配置4.1、环境变量配置4。2、验证是否安装成功 五、pycharm中设置Qt工具(Qt Designer、PyUIC、PyRcc)5.1、配置Qt Designer5.2、配置…

C++11 设计模式4. 抽象工厂(Abstract Factory)模式

问题的提出 从前面我们已经使用了工厂方法模式 解决了一些问题。 现在 策划又提出了新的需求:对于各个怪物,在不同的场景下,怪物的面板数值会发生变化, //怪物分类:亡灵类,元素类,机械类 …

【数据交换格式】网络socket编程温度采集智能存储与上报项目技术------JSON、TLV

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

蓝桥杯物联网竞赛_STM32L071KBU6_全部工程及国赛省赛真题及代码

包含stm32L071kbu6全部实验工程、源码、原理图、官方提供参考代码及国、省赛真题及代码 链接:https://pan.baidu.com/s/1pXnsMHE0t4RLCeluFhFpAg?pwdq497 提取码:q497

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

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

扭蛋机小程序:线上扭蛋机模式发展空间有多大?

潮玩行业近几年的发展非常快,推动了扭蛋机市场的发展,越来越多的人加入到了扭蛋机赛道中,市场迎来了新的发展期。如今,我国的二次元文化的发展不断成熟,扭蛋机主打的二次元商品迎来了更多的商业机会。 一、互联网扭蛋机…

uniapp 上传视频到阿里云之后回显视频获取视频封面

uniapp 上传视频到阿里云之后回显视频获取视频封面 官网的解决方案 1.initial-time Number 指定视频初始播放位置&#xff0c;单位为秒&#xff08;s&#xff09;。 没什么卵用 2.使用 uni.createVideoContext(“myVideo”, this).seek(number)。 没什么卵用 <video :id&quo…

Proteus 8 的使用记录

创建仿真文件 新建文件&#xff1a;默认下一步&#xff0c;至完成创建。 功能选择如图&#xff1a; 放置器件 常用元器件名称 keywords 常用51单片机 AT89C52 晶振 CRYSTAL 电阻 RES 排阻 RESPACK-8 瓷片电容 CAP 电解电容 CAP-ELEC 单刀单掷开关 S…

【Tars-go】腾讯微服务框架学习使用03-- TarsUp协议

3 TarsUP协议 统一通信协议 TarsTup | TarsDocs (tarscloud.github.io) TarsDocs/base at master TarsCloud/TarsDocs (github.com) &#xff1a; 有关于tars的所有介绍 每一个rpc调用双方都约定一套数据序列化协议&#xff0c;gprc用的是protobuff&#xff0c;tarsgo是统一…

C语言 函数——函数封装与程序的健壮性

目录 函数封装&#xff08;Encapsulation&#xff09; 如何增强程序的健壮性&#xff1f; 如何保证不会传入负数实参&#xff1f; 函数设计的基本原则 函数封装&#xff08;Encapsulation&#xff09; 外界对函数的影响——仅限于入口参数 函数对外界的影响——仅限于一个…

[CSS]使用方式+样式属性

层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;与HTML一样&#xff0c;也是一种标记语言&#xff0c;其作用就是给HTML页面标签添加各种样式&#xff0c;定义网页的显示效果&#xff0c;将网页内容和显示样式进行分离&#xff0c;提高了显示功能。简单…