目录
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,应该把学院信息单独建表。