JDBC学习

目录

1.简述

为什么要学JDBC?因为在当代系统中,数据大部分存储在数据库中,当然也有些数据存储在文件服务器中,那如何使用Java操作数据库呢,sun公司提供了一套标准,这套标准就是JDBC
JDBC(Java Database Connectivity) 是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql, javax.sql)使用这些类库可以以一种 标准 的方法、方便地访问数据库资源。JDBC 为访问不同的数据库提供了一种 统一的途径,为开发者屏蔽了一些细节问题。

2.JDBC的执行流程

JDBC又是如何执行的呢?下面这张图就能看出JDBC是如何执行的。

  • 1.注册驱动,将依赖的jar包进行安装
  • 2.建立连接 connection
  • 3.创建发送SQL语句的对象statement
  • 4.statement对象去发送SQL数据到数据库获取返回结果
  • 5.解析结果集
  • 6.销毁资源
java 复制代码
//1注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");

//2获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigu", "root", "123456");

/**
 * statement
 *      1.创建statement
 *      2.拼接SQL语句
 *      3.发送SQL语句,并接收返回结果集
 *
 * preparedstatement
 *      1.编写SQL语句  不包含动态值部分的语句,动态值部分使用占位符?  替代 注意: ?只能替代动态值
 *      2.创建perparedstatment,并且传入动态值
 *      3.动态值  占位符 赋值 ? 单独赋值即可
 *      4.发送SQL语句,并返回结果集
 */

//3编写SQL语句结果
String sql = "select * from t_user where account = ? and password = ? ; ";

//4创建预编译statement,并且设置SQL语句结果
PreparedStatement preparedStatement = connection.prepareStatement(sql);

//5单独的占位符进行赋值
/**
 * 参数1:index  占位符的位置,从左往右数  从1开始 账号 ? 1
 * 参数2:object  占位符的值  可以设置任何类型的数据,避免了拼接和类型更加丰富
 */
preparedStatement.setObject(1,account);
preparedStatement.setObject(2,password);

//6发送sql语句,并获取返回结果
//statement.executeUpdate | statement.executeQuery(Stirng sql)
ResultSet resultSet = preparedStatement.executeQuery();

//7解析结果集
if(resultSet.next()){
    System.out.println("登录成功");
}else{
    System.out.println("登录失败");
}

//8关闭资源
resultSet.close();
preparedStatement.close();
connection.close();

3.为什么PreparedStatement可以避免SQL

PreparedStatement能够防止SQL注入的核心原因是它将SQL代码和数据参数完全分离处理。​ 当你使用Statement时,用户输入的数据会直接拼接到SQL语句字符串中,如果用户输入了类似' OR '1'='1这样的恶意代码,它会成为SQL的一部分并改变原意。
PreparedStatement采用预编译机制,先将SQL结构(如SELECT * FROM users WHERE username = ? AND password = ?)发送到数据库进行编译,确定执行计划,这时SQL的逻辑结构已经固定。后续传入的参数值会被当作纯数据处理,数据库会自动对特殊字符(如单引号)进行转义,确保参数值始终被当作一个整体的字符串或数字值,而不是可执行的SQL代码。这样,即使用户输入' OR '1'='1,它也会被当作查找名为' OR '1'='1的普通字符串,不会改变SQL的查询逻辑,从而有效防止了SQL注入攻击。

4.数据库的三范式

  • 第一范式(1NF):要求每个列都是原子的,不可再分。比如"联系方式"字段不能同时存储手机号和邮箱,应该拆分成"手机号"和"邮箱"两个字段。
  • 第二范式(2NF):在满足1NF的基础上,要求非主键字段完全依赖于主键,不能只依赖主键的一部分。比如订单明细表中,商品名称应该依赖于"订单号+商品编号"这个联合主键,而不是只依赖订单号。
  • 第三范式(3NF):在满足2NF的基础上,要求非主键字段之间不能有传递依赖。比如学生表中,如果存在"学院"和"学院地址"两个字段,学院地址依赖于学院,学院又依赖于学号,这就违反了3NF,应该把学院信息单独建表。
相关推荐
brevity_souls4 分钟前
SQL 中“过滤条件”写在 SELECT、JOIN 和 WHERE 的区别
数据库·sql
天上的光10 分钟前
车道线检测
学习
咚咚王者11 分钟前
人工智能之核心基础 机器学习 第十三章 自监督学习
人工智能·学习·机器学习
2501_9449347313 分钟前
高职学历转行电商运营的数据分析学习路径
学习·数据挖掘·数据分析
承渊政道14 分钟前
C++学习之旅【C++String类介绍】
c语言·c++·vscode·学习
week_泽15 分钟前
第10课:从零构建生产级AI Agent服务技术方案 - 学习笔记_10
人工智能·笔记·学习·ai agent
麦聪聊数据16 分钟前
拒绝循环写库:MySQL 批量插入、Upsert 与跨表更新的高效写法
数据库·sql·mysql
技术净胜16 分钟前
mysqldump 命令备份单库、多库、全库实操指南
数据库·mysql·adb
1.14(java)17 分钟前
数据库范式详解与设计实践
数据库·mysql
麦聪聊数据17 分钟前
由SQL空值 (NULL)引发的逻辑黑洞:从NOT IN失效谈起
数据库·sql·mysql