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,应该把学院信息单独建表。
相关推荐
姓蔡小朋友2 小时前
MySQL事务、InnoDB存储引擎
java·数据库·mysql
初恋叫萱萱2 小时前
【TextIn大模型加速器 + 火山引擎】文件智能体构建全路径指南
大数据·数据库·火山引擎
拾荒的小海螺2 小时前
MySQL:死锁问题分析与解决方案
数据库·mysql
其美杰布-富贵-李2 小时前
Python 反射完整学习笔记
笔记·python·学习·反射
玩转数据库管理工具FOR DBLENS2 小时前
关系型数据库与非关系型数据库:差异、介绍与市场格局
数据库·oracle·nosql
charlie1145141913 小时前
快速在WSL上开发一般的C++上位机程序
开发语言·c++·笔记·学习·环境配置·工程
我科绝伦(Huanhuan Zhou)3 小时前
影响SQL Server性能的关键因素深度解析
数据库·sql server
我命由我123453 小时前
CSS 锚点定位 - 锚点定位引入(anchor-name、position-anchor)
开发语言·前端·javascript·css·学习·html·学习方法
Lion Long3 小时前
大数据时代的“时间”难题:时序数据库(TSDB)选型避坑指南
大数据·数据库·时序数据库·数据库架构·iotdb·tsdb