iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >JDBC | JDBC API详解及数据库连接池
  • 664
分享到

JDBC | JDBC API详解及数据库连接池

java数据库mysql 2023-08-20 17:08:48 664人浏览 八月长安
摘要

👑 博主简介:    🥇 Java领域新星创作者    🥇 阿里云开发者社区专家博主、星级博主、技术博主 🤝 交流社区:BoBooY(优质编程学习笔记社区) 前言:

在这里插入图片描述

👑 博主简介
   🥇 Java领域新星创作者
   🥇 阿里云开发者社区专家博主、星级博主、技术博主
🤝 交流社区BoBooY(优质编程学习笔记社区)

前言:上一节我带大家上手了JDBC的基本代码,这节我们仔细讲一下JDBC的api数据库连接池。

3、JDBC API详解

3.1、DriverManager

DriverManager(驱动管理类)作用:注册驱动、获取数据库连接

  • 注册驱动

在这里插入图片描述

reGISterDriver方法是用于注册驱动的,但是我们之前做的入门案例并不是这样写的。而是如下实现

Class.forName("com.Mysql.jdbc.Driver");

我们查询mysql提供的Driver类,看它是如何实现的,源码如下:

在这里插入图片描述

在该类中的静态代码块中已经执行了 DriverManager 对象的registerDriver() 方法进行驱动的注册了,那么我们只需要加载 Driver 类,该静态代码块就会执行。而Class.forName("com.mysql.jdbc.Driver"); 就可以加载Driver 类。

提示:MySQL 5之后的驱动包,可以省略注册驱动的步骤,自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类


在这里插入图片描述

参数说明:

  • user :用户名
  • passWord:密码
  • url : 连接路径

语法:

jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
示例:jdbc:mysql://localhost:3306/jdbc

补充:

  • 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对

  • 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示

3.2、Connection

Connection(数据库连接对象)作用:获取执行 SQL 的对象、管理事务

3.2.1、获取执行对象

  • 普通执行SQL对象
Statement createStatement()

入门案例中就是通过该方法获取的执行对象。

  • 预编译SQL的执行SQL对象:防止SQL注入(重要!!!)
PreparedStatement prepareStatement(sql)
  • 执行存储过程的对象
CallableStatement prepareCall(sql)

3.2.2、事务管理

回顾一下MySQL事务管理的操作:

  • 开启事务 :

    BEGIN; 或者 START TRANSACTION;
  • 提交事务 :

    COMMIT;
  • 回滚事务 :

    ROLLBACK;

MySQL默认是自动提交事务


JDBC事务管理的方法

Connection几口中定义了3个对应的方法:

  • 开启事务
    在这里插入图片描述

参与autoCommit 表示是否自动提交事务,true表示自动提交事务,false表示手动提交事务。而开启事务需要将该参数设为为false。

  • 提交事务

在这里插入图片描述

  • 回滚事务

在这里插入图片描述


案例测试事务管理

  • 编写代码
package com.bby;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class JdbcTransaction {    public static void main(String[] args) throws Exception {        String url = "jdbc:mysql:///jdbc?useSSL=false";        String username = "root";        String password = "1234";        String sql = "update acount set money = 1002 where id = 1";        String sql2 = "update acount set money = 1002 whe id = 1"; //注意这里SQL语句故意将where写错        Class.forName("com.mysql.jdbc.Driver");        Connection connection = DriverManager.getConnection(url, username, password);        Statement statement = connection.createStatement();        try {            connection.setAutoCommit(false); // 开启手动事务            //执行SQL语句并处理结果            int count = statement.executeUpdate(sql);            System.out.println(count);            int count2 = statement.executeUpdate(sql2);            System.out.println(count2);            //提交事务            connection.commit();        } catch (Exception e) {            //程序出现异常,回滚事务            connection.rollback();            e.printStackTrace();        }            }}
  • 执行程序,看控制台结果

在这里插入图片描述

  • 数据库更新前

在这里插入图片描述

  • 数据库更新后

在这里插入图片描述

这里程序出现异常,进行了事务的回滚,所以数据都没有被更新

  • 将代码更改正确
String sql2 = "update acount set money = 1002 wher id = 2";
  • 执行程序测试

在这里插入图片描述

在这里插入图片描述

3.3、Statement

3.3.1、概述

Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。

  • 执行DDL、DML语句

在这里插入图片描述

  • 执行DQL语句

在这里插入图片描述

3.3.2、代码演示

此处只展示核心代码,具体代码可以参考上面的代码案例

  • DML语句
// 定义sqlString sql = "update account set money = 3000 where id = 1";// 获取执行sql的对象 StatementStatement stmt = conn.createStatement();// 执行sqlint count = stmt.executeUpdate(sql);  //执行完DML语句,受影响的行数 
  • 执行DDL语句
// 定义sqlString sql = "drop database db2";// 获取执行sql的对象 StatementStatement stmt = conn.createStatement();// 执行sqlint count = stmt.executeUpdate(sql); //执行完DDL语句,可能是0

3.4、ResultSet

3.4.1、概述

ResultSet(结果集对象)作用:封装了SQL查询语句的结果

执行了DQL语句后就会返回该对象,对应执行DQL语句的方法如下:

ResultSet executeQuery(sql):执行DQL 语句,返回 ResultSet 对象

那么我们就需要从 ResultSet 对象中获取我们想要的数据。ResultSet 对象提供了操作查询结果数据的方法,如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如下图为执行SQL语句后的结果

在这里插入图片描述

一开始光标指定于第一行前,如图所示红色箭头指向于表头行。当我们调用了 next() 方法后,光标就下移到第一行数据,并且方法返回true,此时就可以通过 getInt(“id”) 获取当前行id字段的值,也可以通过 getString(“name”) 获取当前行name字段的值。如果想获取下一行的数据,继续调用 next() 方法,以此类推。

3.4.2、代码演示

  • 编写JdbcResultSet
package com.bby;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class JdbcResultSet {    public static void main(String[] args) throws Exception {        Class.forName("com.mysql.jdbc.Driver");        String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false";        String username = "root";        String password = "1234";        Connection connection = DriverManager.getConnection(url, username, password);        Statement statement = connection.createStatement();        //定义查询的SQL语句        String sql = "select * from acount";        //执行查询语句,获取结果集        ResultSet resultSet = statement.executeQuery(sql);        //遍历结果集        while(resultSet.next()){            int id = resultSet.getInt("id");            String name = resultSet.getString("name");            String money = resultSet.getString("money");            System.out.println("id:" + id);            System.out.println("name:" + name);            System.out.println("money:" + money);            System.out.println("-----------------");        }        resultSet.close();        statement.close();        connection.close();    }}
  • 查看控制台输出

在这里插入图片描述

3.5、PreparedStatement

3.5.1、SQL注入

SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

  • 代码模拟SQL注入问题
package com.bby;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class JdbcSqlInjection {    public static void main(String[] args) throws Exception {        Class.forName("com.mysql.jdbc.Driver");        String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false";        String username = "root";        String password = "1234";        Connection connection = DriverManager.getConnection(url, username, password);        // 接收用户输入 用户名和密码        String name = "abcdefg";        String pwd = "' or '1' = '1";        String sql = "select * from users where name = '" + name + "' and password = '" + pwd + "'";        Statement statement = connection.createStatement();        ResultSet resultSet = statement.executeQuery(sql);        // 判断登录是否成功        if (resultSet.next()) {            System.out.println("登录成功~");        } else {            System.out.println("登录失败~");        }        resultSet.close();        statement.close();        connection.close();    }}

上面代码是将用户名和密码拼接到sql语句中,拼接后的sql语句如下:

select * from users where name = 'abcdefg' and password = '' or '1' = '1'

从上面语句可以看出条件name = 'abcdefg' and password = ''不管是否满足,而 or 后面的 '1' = '1' 是始终满足的,最终条件是成立的,就可以正常的进行登陆了。

  • 所以不管登录的密码是否正确都可以登录成功,控制台输出如下

在这里插入图片描述

3.5.2、PreparedStatement 概述

PreparedStatement作用:预编译SQL语句并执行,预防SQL注入问题

  • 获取 PreparedStatement 对象
// SQL语句中的参数值,使用?占位符替代String sql = "select * from users where name = ? and password = ?";// 通过Connection对象获取,并传入对应的sql语句PreparedStatement ps = connection.prepareStatement(sql);
  • 设置参数值

上面的sql语句中参数使用 ? 进行占位,在之前之前肯定要设置这些 ? 的值。

PreparedStatement对象:

setXxx(参数1,参数2);//给 ? 赋值, 参数1是编号(从1开始) 参数2是值

(1)Xxx:数据类型 ; 如 setInt (参数1,参数2)

(2)参数1: ?的位置编号,从1 开始 参数2: ?的值

  • 执行SQL语句
executeUpdate(); // 执行DDL语句和DML语句
executeQuery(); // 执行DQL语句

注意:调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了。

3.5.3、代码演示

  • 编写JdbcPreparedStatement
package com.bby;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;public class JdbcPreparedStatement {    public static void main(String[] args) throws Exception {        String url = "jdbc:mysql:///jdbc?useSSL=false";        String username = "root";        String password = "1234";        String name = "abcdefg";        String pwd = "' or '1' = '1";        Class.forName("com.mysql.jdbc.Driver");        Connection connection = DriverManager.getConnection(url, username, password);        //定义SQL语句        String sql = "select * from users where name = ? and password = ?";        //预编译SQL语句        PreparedStatement ps = connection.prepareStatement(sql);        //填充占位符        ps.setString(1, name);        ps.setString(2, pwd);        //执行SQL语句        ResultSet resultSet = ps.executeQuery();        //判断登录是否成功        if(resultSet.next()) {            System.out.println("登陆成功!");        } else {            System.out.println("登录失败");        }        resultSet.close();        ps.close();        connection.close();    }}
  • 查看控制台结果

在这里插入图片描述

执行上面语句就可以发现不会出现SQL注入漏洞问题了。那么PreparedStatement又是如何解决的呢?它是将特殊字符进行了转
义,转义的SQL如下:

select * from `users` where name = 'abcdefg' and password = '\'or \'1\' = \'1'

3.5.4、PreparedStatement原理

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

在这里插入图片描述

Java代码操作数据库流程如图所示:

  • 将sql语句发送到MySQL服务器端

  • MySQL服务端会对sql语句进行如下操作

    • 检查SQL语句
      检查SQL语句的语法是否正确。
    • 编译SQL语句。将SQL语句编译成可执行的函数。
      检查SQL和编译SQL花费的时间比执行SQL的时间还要长。如果我们只是重新设置参数,那么检查SQL语句和编译SQL语句将不需要重复执行。这样就提高了性能。
    • 执行SQL语句
  • MySQL服务端将结果返回

4、数据库连接池

4.1、数据库连接池简介

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

之前我们代码中使用连接使没有使用都创建一个Connection对象,使用完毕就会将其销毁。这样重复创建销毁的过程是特别耗费计算机的性能的及消耗时间的。而数据库使用了数据库连接池后,就能达到Connection对象的复用,如下图:

在这里插入图片描述

连接池是在一开始就创建好了一些连接(Connection)对象存储起来。用户需要连接数据库时,不需要自己创建连接,而只需要从连
接池中获取一个连接进行使用,使用完毕后再将连接对象归还给连接池;这样就可以起到资源重用,也节省了频繁创建连接销毁连接
所花费的时间,从而提升了系统响应的速度。

4.2、数据库连接池实现

  • 标准接口:DataSource

官方(SUN) 提供的数据库连接池标准接口,由第三方组织实现此接口。该接口提供了获取连接的功能:

Connection getConnection()

那么以后就不需要通过 DriverManager 对象获取 Connection对象,而是通过连接池(DataSource)获取 Connection 对象。

  • 常见的数据库连接池:DBCP 、C3P0 、Druid

我们现在使用更多的是Druid,它的性能比其他两个会好一些

  • Druid(德鲁伊)

Druid连接池是阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是Java语言最好的数据库连接池之一

4.3、Driud 的使用

  • 导入jar包 druid-1.1.12.jar

将druid的jar包放到项目下的lib下并添加为库文件

在这里插入图片描述

  • 编写配置文件 druid.properties
driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql:///jdbcuseSSL=false&useServerPrepStmts=trueusername=rootpassword=1234# 初始化连接数量initialSize=5# 最大连接数maxActive=10# 最大等待时间maxWait=3000
  • 编写Java代码(JdbcDruid)
package com.bby;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.FileInputStream;import java.sql.Connection;import java.util.Properties;public class JdbcDruid {    public static void main(String[] args) throws Exception {        // 加载配置文件        Properties prop = new Properties();        prop.load(new FileInputStream("jdbc-demo/src/druid.properties"));        // 获取连接池对象        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);        // 获取数据库连接 Connection        Connection connection = dataSource.getConnection();        System.out.println(connection); //获取到了连接后就可以继续做其他操作了    }}
  • 运行查看控制台结果

尾言:创作不易,如果本文的内容对您有帮助,还望客官可以三连支持一下博主,👍(点赞)+✏️(评论)+⭐️(收藏)是我创作的巨大动力!

来源地址:https://blog.csdn.net/qq_58233406/article/details/127647030

您可能感兴趣的文档:

--结束END--

本文标题: JDBC | JDBC API详解及数据库连接池

本文链接: https://www.lsjlt.com/news/376554.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JDBC | JDBC API详解及数据库连接池
    👑 博主简介:    🥇 Java领域新星创作者    🥇 阿里云开发者社区专家博主、星级博主、技术博主 🤝 交流社区:BoBooY(优质编程学习笔记社区) 前言:...
    99+
    2023-08-20
    java 数据库 mysql
  • JDBC数据库连接池 怎么实现
    本篇内容介绍了“JDBC数据库连接池 怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么情况下使用连接池对于一个简单的数据库应用,由...
    99+
    2023-06-02
  • JDBC 连接数据库
    一、通过Driver接口直接连接 public Connection getConnectionByDriver() throws Exception{  ...
    99+
    2024-04-02
  • Java数据库连接(JDBC)
    JDBC(Java DataBase Connectivity) JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API全称:( Java DataBase Connectivi...
    99+
    2023-09-22
    数据库 java mysql
  • JDBC---Java连接数据库
    第一章 JDBC概述 1.1 JDBC概述 jdbc是(Java Database Connectivity)单词的缩写,翻译为java连接数据库。是Java程序连接数据库的技术总称。 JDBC由两个...
    99+
    2023-10-20
    java 数据库 mysql
  • 详解Java使用JDBC连接MySQL数据库
    一:什么是数据库,为什么要有数据库? 数据,数据库,数据库管理系统和数据库系统是与数据库技术密切相关的四个基本概念。 数据库相信大家都耳熟能详了,其实数据库顾名思义就是存放数据的仓库...
    99+
    2024-04-02
  • DataSource与数据库连接池简介(JDBC简介)
    目录起源为何放弃DriverManager连接池数据源实现核心架构DataSourceAPI小结应用数据库连接池示例总结DataSource是作为DriverManager的替代品而...
    99+
    2022-11-13
    数据库连接池Data Source JDBC数据库连接池Data Source
  • jdbc连接池怎么实现数据库访问
    JDBC连接池是一种管理数据库连接的技术,它可以提供可用的数据库连接给应用程序使用,从而提高数据库访问的性能和效率。以下是实现JDB...
    99+
    2023-09-15
    jdbc 数据库
  • jdbc怎么连接数据库
    小编给大家分享一下jdbc怎么连接数据库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!jdbc连接数据库的步骤:1、加载jdbc驱动程序;2、创建数据库的连接;3...
    99+
    2023-06-14
  • jdbc与druid连接池的使用详解
    使用jdbc实现对数据库的操作 Ⅰ 获取数据库连接 package org.example.utils; import java.sql.*; public class Java...
    99+
    2024-04-02
  • JDBC连接数据库----Mysql七大步骤详解
    一、jdbc的概念         1、什么是jdbc?         JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它...
    99+
    2023-09-05
    mysql 数据库 java
  • jdbc如何连接oracle数据库
    要连接Oracle数据库,您需要执行以下步骤:1. 获取Oracle JDBC驱动程序:首先,您需要下载并获取Oracle JDBC...
    99+
    2023-08-08
    jdbc oracle
  • jdbc 数据库的连接方法
    这篇文章主要介绍“jdbc 数据库的连接方法”,在日常操作中,相信很多人在jdbc 数据库的连接方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jdbc 数据库的连接方法”...
    99+
    2024-04-02
  • jdbc如何连接sqlserver数据库
    要连接SQL Server数据库,可以按照以下步骤使用JDBC: 1、确保已经安装了SQL Server数据库,并且已经创建了数据库...
    99+
    2024-04-18
    jdbc sqlserver
  • JDBC连接MySQL详解
    JDBC(Java Database Connectivity)是Java语言访问数据库的标准方法,通过JDBC可以连接各种类型的数...
    99+
    2024-04-09
    MySQL JDBC
  • JDBC中如何连接数据库
    这篇文章主要为大家展示了“JDBC中如何连接数据库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JDBC中如何连接数据库”这篇文章吧。连接数据库的步骤:注册驱动...
    99+
    2024-04-02
  • Java使用JDBC连接数据库
    目录一、JDBC简介二、JDBC中常用类和接口1、驱动程序管理类(DriverManager)2、声明类(Statement)3、数据库连接类 (Connection)4、结果集合类...
    99+
    2024-04-02
  • jdbc怎么连接mysql数据库
    要连接MySQL数据库,需要以下步骤:1. 加载MySQL的JDBC驱动程序。可以从MySQL官方网站下载并安装MySQL Conn...
    99+
    2023-08-19
    jdbc mysql数据库
  • jdbc怎么连接sqlserver数据库
    1、下载并安装SQL Server JDBC驱动程序,可以从Microsoft官方网站上下载相应的驱动程序。 2、在Java项目中导...
    99+
    2024-04-09
    jdbc sqlserver
  • Spring如何连接数据库以及JDBC模板
    这篇文章将为大家详细讲解有关Spring如何连接数据库以及JDBC模板,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、创建工程、导包要想使用Spring的jdbc模板前,还需要导入相关的jar包:二、进...
    99+
    2023-05-31
    spring 数据库 jdbc
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作