连接数据库(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:/…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
 
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
 
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
 
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
 
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
 
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
