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,应该把学院信息单独建表。
相关推荐
ss2731 小时前
PostgreSQL常见索引问题与解决方案
数据库·postgresql
小徐不徐说1 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
瀚高PG实验室3 小时前
发布端逻辑复制槽消失
数据库·postgresql·瀚高数据库
ss2733 小时前
PostgreSQL慢查询定位与优化
数据库·postgresql
叼烟扛炮4 小时前
[Git 实战] 学习笔记:从生成 SSH 密钥到解决 TortoiseGit 推送报错全指南
linux·运维·笔记·git·学习
香蕉大香蕉(06敬畏市场)4 小时前
MySQL 单点详解(07)
java·数据库·mysql·ai·博客·八股
蒸蒸yyyyzwd4 小时前
学习笔记 八股手撕
笔记·学习
smilejingwei5 小时前
TRAE 插件上新 | SQLazy:让 AI 写出可信复杂 SQL
数据库·人工智能·sql
我要见SA姐15 小时前
GitHub Actions 自动化:5 个真实运维提效案例
运维·数据库·机器学习·oracle·回归
QXWZ_IA6 小时前
边坡监测预算有限时的建设顺序:虚拟基准站与成本账
网络·数据库