连接数据库(MySQL)的JDBC
目录
- JDBC
- 简介
- 快速入门
- API详解
- DriverManager(驱动管理类)
- 注册驱动:
- 获取数据库连接(对象):
- Connection(数据库连接对象)
- 获取执行SQL的对象
- 管理事务
- Statement(执行SQL语句)
- 执行DML、DDL语句
- 执行DQL语句
- ResultSet(结果集对象)
- 用Result获取查询结果
- PreparedStatement
- SQL注入
- PreparedStatement使用
- PreparedStatement原理
- 数据库连接池
- 数据库连接池实现
- Druid使用步骤
JDBC
简介
概念:
- 使用 Java 语言操作关系型数据库的一套API
- 全称(Java DataBase Connectivity)Java 数据库连接
本质:
- 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
- 各个连接厂商去实现这套接口,提供数据库驱动 jar 包
- 程序员可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类
好处:
- 各数据库厂商使用相同的接口,Java 代码不需要针对不同的数据库分别开发
- 可随时替换底层数据库,访问数据库的 Java 代码基本不变
快速入门
步骤:
-
创建工程,导入驱动 jar 包

-
注册驱动::
Class.forName("com.mysql.jdbc.Driver"); -
获取连接:
Connection [conn对象名称] = DriverManager.getConnection(url, username, password); -
定义SQL语句:
String [sql对象名称] = "update……"; -
获取执行SQL对象:
Statement [stmt对象名称] = conn.createStatement(); -
执行SQL:
int i = stmt.executeUpdate(sql); -
处理返回结果
-
释放资源
API详解
DriverManager(驱动管理类)
作用:
注册驱动:
-
registerDriver(Driver driver) #注册给指定的驱动
-

-
mysql 5 之后可以省略步骤中的1(注册驱动),因为JDBC的 jar 包下的
META-INF/services/java.sql.Driver中自动记录了对应的驱动的名称
获取数据库连接(对象):
-
Connection XXX = getConnection(String url, String user, String password) #尝试建立与给定的数据库URL的连接
上述参数:
1.url:连接路径
语法:[(协议)jdbc:mysql://]ip地址(域名):端口号/数据库名称[?]参数键值对1[&]参数键值对2……
示例:jdbc:mysql://127.0.0.1:3306/db1
细节:
- 如果连接的是本机mysql服务器,并且mysql服务器默认端口是3306,则url可以简写为:jdbc:mysql:数据库名称[?]参数键值对
- 配置useSSL=false参数,禁用安全连接方式,解决警告提示,示例:jdbc:mysql://127.0.0.1:3306/db1?useSSL=false&……
- user:用户名
- password:密码
Connection(数据库连接对象)
作用:
获取执行SQL的对象
-
Statement XXX = createStatement(); #普通执行SQL对象
PreparedStatement XXX = prepareStatement(sql); #预编译SQL的执行SQL对象,防止SQL注入
CallableStatement XXX = prepareCall(sql); #执行存储过程的对象
管理事务
-
MySQL事务管理
-
开启事务:BEGIN;/ START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MySQL默认自动提交事务
-
-
JDBC事务管理:Connection接口中定义了3个对应的方法
-
开启事务:setAutoCommit(boolean autoCommit);其中参数为true则自动提交事务、false则手动提交事务(即为开启事务)
提交事务:commit()
回滚事务:rollback()
示例: try{ connection.setAutoCommit(false);// 开启事务 int i = stmt.executeUpdate(sql);//执行SQL ……//处理 connection.commit();//提交事务 } catch (Exception throwables) { connection.rollback();//回滚事务 }
-
Statement(执行SQL语句)
作用:
执行DML、DDL语句
-
语法:
int XX = executeUpdate(sql)
-
返回值XX:
- DML语句执行过后,受影响的行数
- DDL语句执行后,执行成功也可能返回0(删除表、库)
执行DQL语句
-
ResultSet XX = executeQuery(sql)
ResultSet(结果集对象)
作用:
ResultSet结果集封装了DQL查询语句的结果:
ResultSet XXX = statement.executeQuery(sql);#执行SQL语句,返回ResultSet对象
用Result获取查询结果
-
boolean result = ResultSet.next():
-
将光标从当前位置向后移动一行
-
判断当前行是否为有效行
返回值:
- true:有效行,当前行有数据
- false:无效行,当前行没有数据
-
-
XXX getXXX(参数):获取数据
XXX:数据类型;如:int getInt(参数)、String getString(参数)
参数:
- int:列的编号,从1开始
- String:列的名称
示例:
//1.注册驱动(5.0之后可省略)
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接:如果连接的是本机mysql且端口默认是3306,可以简化书写
String url = "jdbc:mysql://db1?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义SQL
String sql = "select * from account";
//4.获取statement对象
Statement stmt = conn.createStatement();
//5.执行SQL
ResultSet rs = stmt.executeQuery(sql);//6.处理结果//6.1光标下移一行,并且判断当前行是否有数据
while(rs.next()) { // 列编号的写法//6.2获取数据int id = rs.getInt(1);String name = rs.getString(2);double money = rs.getDouble(3);
}while(rs.next()) { //列名写法int id = rs.getInt("id");String name = rs.getString("name");double money = rs.getDouble("money");
}

PreparedStatement
SQL注入
作用:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
String name = “heasdasd”;
String pwd = " ’ or ‘1’ = '1 ";
String sql = "select * from tb_user where username = ’ " + name + " ’ and password = ’ " + pwd + ’ " ;
通过上述替换,导致最后的SQL语句变为:
select * from tb_user where username = ’ heasdasd ’ and password = ’ ’ or ‘1’ = ‘1’
由于判断是从左到右执行,那么username的false结果and上password=‘ ’的false结果最终是false,但是之后又or上1=1恒等式那么结果为真
PreparedStatement使用
作用:执行预编译SQL语句(防止SQL注入)
-
获取 PreparedStatement 对象
//SQL语句中的参数值,使用 ? 占位符替代
String sql = "selsect * from user where username = ? and password = ? ";
//通过Connection对象获取,并传入对应的SQL语句
PreparedStatement pstmt = conn.prepareStatement(sql);
-
设置参数值
PreparedStatement对象.setXxx(参数1,参数2):给SQL语句中的 ?占位符 赋值
Xxx:参数对应的数据类型,如Int、string等
参数:
- 参数1: ? 占位符 在SQL语句中的位置编号,从1开始
- 参数2: ? 占位符 里面的值
-
执行SQL
executeUpdate(); / executeQuery(); 不需要再传递sql
executeUpdate(); #执行查询语句,返回结果集
executeQuery(); #执行更新语句,返回受影响的行数
PreparedStament是通过转义字符的形式,达到单引号不会跟我们的sql语句中的单引号进行配对
PreparedStatement原理
原理:
- 在获取PreparedStatement对象时,将sql语句发送给mysql服务器进项检查、编译(这个步骤很耗时)
- 执行时就不用进行这些步骤了,速度更快
- 如果sql模板一样,则只需要进行一次检查、编译
好处:
- 预编译SQL,性能更高
- 防止SQL注入:将敏感字符进行转义
-
PreparedStatemrnt预编译功能开启:
useServerPrepStmts=true
#加到获取连接后的参数中:
String url = “jdbc:mysql://db1?useSSL=false&useServerPrepStmts=true”;
-
配置MySQL执行日志(配置文件写在my.ini文件最后,重启MySQL服务后生效)
log-output=FILE
general-log=1
general_log_file=“D:mysql.log” #里面的目录需要根据实际目录进行改动
slow-query-log=1
slow_query_log_file=“D:\mysql_slow.log”
long_query_time=2
数据库连接池
简介
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
数据库连接池实现
标准接口:DataSource
-
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口
-
功能:获取连接
Connection getConnection()
常见的数据库连接池:
- DBCP
- C3P0
- Druid
Druid(德鲁伊):
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一
Druid使用步骤
-
导入jar包 druid-1.1. 12.jar

-
定义配置文件(项目名称.iml)

-
加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream(“路径[jdbc-demo(模块)/src/druid.properties]”));
#注意:路径可能会报错,问题是路径有时候需要加模块的名称
#解决的通用方法:通过System.out.println(System.getProperty(“user.dir”));打印出这个项目的路径,通过找到模块的路径,进行拼接(即打印出的项目名称作为默认的项目名称,之后通过找到Durid的jar包的路径填入)
-
获取数据库连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
-
获取连接
Connection connection = dataSource.getConnection();
注意:
在实体类中,基本数据类型建议使用其对应的包装类型(因为基本数据类型有默认的值,可能会对业务造成影响)
相关文章:
连接数据库(MySQL)的JDBC
目录 JDBC简介快速入门API详解DriverManager(驱动管理类)注册驱动:获取数据库连接(对象): Connection(数据库连接对象)获取执行SQL的对象管理事务 Statement(执行SQL语句)执行DML、DDL语句执行DQL语句 Resu…...
golang通过参数控制HTTP server是否使用基本认证
之前写的《golang实现一个BasicAuth的HTTP server》一定会做基本认证。 本例给出了如何通过启动时候指定的参数来控制是否做基本认证 代码对比和解释 给出与上一篇中源码的diff adminhpc-1:~/go/auth_http$ diff -ruN http_rpc_server.go_bak http_rpc_server.go --- http_rp…...
javaSwing坦克大战游戏
在游戏开发领域,坦克大战是一款经典的游戏,其简单而又耐玩的玩法吸引了无数玩家。而今,在Java编程技术的支持下,我们可以用Java Swing技术轻松实现这款经典游戏。本文将介绍如何使用Java Swing技术编写坦克大战游戏,并…...
【面试题】数据底层原理:Elasticsearch写入流程解析
前言:本篇博客将介绍Elasticsearch的数据底层原理,涉及数据写入的过程以及相关概念。我们将深入探讨buffer、translog、refresh、commit、flush和merge等核心概念,帮助您更好地理解Elasticsearch的数据存储机制。 写入数据的基本过程 Elast…...
牛客论坛spring initializer选用的构件
spring版本:2.1.5.RELEASE java版本:8 pom文件: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…...
【Java程序设计】【C00385】基于(JavaWeb)Springboot的员工信息管理系统(有论文)
基于(JavaWeb)Springboot的员工信息管理系统 项目简介项目获取开发环境项目技术运行截图 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,…...
【Linux进阶之路】理解UDP,成为TCP。
前言 学了TCP 和UDP之后,感觉UDP就像是初入职场的年轻人,两耳不闻 “窗外事”,只管尽力地把自己的事情做好,但收获的却是不可靠,而TCP更像是涉世极深的"职场老油条",给人的感觉就是 “城府极深&a…...
Linux实用操作
一,各类小技巧(快捷键) 强制停止 ctrlc强制停止 Linux某些程序的运行,如果想要强制停止它,可以使用快捷键ctrlc 命令输入错误,也可以通过快捷键ctrlc,退出当前输入,重新输入 退出、登出 ctrld退出或登出 可以通过快…...
OpenJudge - 12:加密的病历单
总时间限制: 1000ms 内存限制: 65536kB 描述 小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。 在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一…...
QGIS编译(跨平台编译)057:FastCGI编译(Windows、Linux、MacOS环境下编译)
文章目录 1、FastCGI介绍2、FastCGI下载3、Windows下编译4、linux下编译5、MacOS下编译1、FastCGI介绍 FCGI 是 FastCGI 的缩写,是一种用于改善 CGI(Common Gateway Interface)性能的协议。在传统的 CGI 中,每次请求都需要启动一个新的进程来处理,这导致了较高的资源消耗和…...
jenkins+newman+postman持续集成环境搭建
一、Newman简介 Newman是一款基于Node.js开发的,可以运用postman工具直接从命令运行和测试postman集合 二、Newman应用 环境准备:js/ cnpm或npm配置好环境,执行如下命令 三、安装newman 验证是否安装成功,命令:newm…...
取消自动设置的开机自启动(pywin32库)请勿仿照!否则可能对电脑造成损害。
本文使用创作助手。 要取消Python程序的开机自启动,可以通过删除注册表中相应的注册表项来实现。请按照以下步骤进行操作: 打开Windows注册表编辑器:按下 Windows R 键,输入 regedit,然后按下回车键。 导航到注册表…...
金融投贷通(金融投资+贷款通)项目准备
金融投贷通(金融投资贷款通)项目准备 专业术语投资专业术语本息专业术语还款专业术语项目介绍三个子系统技术架构核心流程发布借款标投资业务 项目实施测试流程测试步骤 专业术语 投资专业术语 案例:张三借给李四5W,约定期满1年后…...
跟我学C++中级篇——STL的中的删除
一、介绍 在STL中一般删除的方式有两类,一种是使用全局的std::remove(remove_if类似),一种是使用容器自带的erase,前者其实并没有真正的删除数据,而后者则是在移动时,会有一些细节的处理,否则要么程序崩溃…...
js如何遍历查询一个颗树
近段时间去面试的时候,被面试官问到如何遍历查询一个颗树的时候,可能最近自己看了数据结构的书之后,隐隐约约就想到二叉树的三种排序(前序、中序、后序),但是当时自己没有想起这三种排序的名字,…...
【面试必备】针对一个案例,怎么测试
思考角度 测试用例设计万能公式功能测试(最重要)界面测试易用性测试性能测试安全性测试兼容性测试容错性测试 常见案例物品类水杯笔 软件类微信发送朋友圈功能 测试用例设计万能公式 在面试中经常会遇到的一类题是,给你一个具体的产品&#…...
vue3 hooks之事件广播(支持跨标签页)
/**** 同源下的全局事件总线,支持跨标签页通信* 第一步:注册事件* 第二步:广播事件* 第三步:处理事件*/// source:消息发起源href,将在跨标签页通信时传入 interface callback {(data: any, source: any): …...
go中validate包使用教程
文章目录 前言安装简单使用错误处理翻译器Validator库介绍校验语法常用标记自定义校验需求【校验车身颜色】前言 在go项目中,经常有校验数据合法性的需求,比如邮箱、年龄、车牌号、网址、字符串长度、金额、枚举范围等。一个好的校验包能帮我们少写很多ifelse,提高系统的可…...
canvas画带透明度的直线和涂鸦
提示:canvas画线 文章目录 前言一、带透明度的直线和涂鸦总结 前言 一、带透明度的直线和涂鸦 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…...
linux命令 curl忽略https证书
curl https://www.baidu.com 会提示需要htttps证书,加 -k 即可,如下: curl -k https://www.baidu.com 如果要带头部,认证数据,加-H curl -s -k -H "Authorization: Bearer 651fasgassssgjage2" https:/…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
