前言:
1.了解
问题1:什么是JDBC?
JDBC全称: Java Database Connectivity,即Java数据库连接
JDBC是Java提供的一组独立于任何数据库管理系统的API。
Java提供接口规范,由各个数据库厂商提供接口的实现,厂商提供的实现类封装成jar文件,也就是数据库驱动jar包。
学习JDBC,充分体现了面向接口编程的好处,程序员只关心标准和规范,而无需关注实现过程。
问题2:为什么需要使用JDBC?
数据库连接:JDBC提供了一个标准接口,使Java应用程序能够与各种关系型数据库(如MySQL、Oracle、PostgreSQL等)进行连接和交互。通过JDBC,开发者可以轻松地执行SQL查询和更新操作。
跨平台性:由于Java是一个跨平台的编程语言,JDBC也继承了这一特性。无论是开发在Windows、Linux还是macOS上的应用程序,JDBC都能提供一致的数据库访问体验。
标准化:JDBC为不同的数据库提供了一个统一的访问方式。无论使用什么样的数据库,只需通过JDBC接口,开发者就可以使用相同的代码逻辑与之交互,降低了学习成本。
性能优化:JDBC支持批处理操作,使得多个SQL语句可以在一个请求中发送到数据库,减少网络延迟,提高性能。
JDBC 的简单执行流程图:
2.准备
开始前的准备工作
1.准备数据库
MySQL8.x或者MySQL5.x都可以
下载网址:https://www.mysql.com/downloads/
进入网址下滑找到并点击:
跳转后点击:
进入下载界面,请选择本地下载:
后续安装操作:https://blog.csdn.net/weixin_39289696/article/details/128850498
2.官网下载数据库连接驱动jar包。
网址:https://downloads.mysql.com/archives/c-j/
提示:8.0.25以后的驱动不需要设置时区(即后面都可)
3.创建Java项目(JDK21)
JDK的下载:
4.在项目下创建lib文件夹,将下载的驱动jar包复制到文件夹里
5.选中lib文件夹右键->Add as Library(创建库),与项目集成。
6.简单感受编写的场景
package com.atguigu.base;
import java.sql.*;
public class JDBCQuick {
public static void main(String[] args) throws Exception {
//注册驱动
//带有cj是sql8.x的,不使用的是sql5.x
Class.forName("com.mysql.cj.jdbc.Driver");
//获取驱动信息
//company:为创建的数据库的名称
String url = "jdbc:mysql://localhost:3306/company";
String username = "root";
String password = "123456";
Connection connection = DriverManager.getConnection(url, username, password);
//连接执行SQL语句的对象,使用Statement的场景
Statement statement = connection.createStatement();
//编写SQL语句,并执行,接收返回的结果集
String sql = "SELECT emp_id,emp_name,emp_salary,emp_age FROM t_emp;";
ResultSet resultSet = statement.executeQuery(sql);
//处理结果,遍历resultSet结果集
while (resultSet.next()) {
int empId = resultSet.getInt("emp_id");
String empName = resultSet.getString("emp_name");
Double empSalary = resultSet.getDouble("emp_salary");
int empAge = resultSet.getInt("emp_age");
System.out.println(empId + "\t" + empName + "\t" + empSalary + "\t" + empAge);
}
//关闭资源,抬头法:从下往上
resultSet.close();
statement.close();
connection.close();
}
}
一、基础篇
1.五大核心API
1.1 注册驱动
格式:
Class.forName("com.mysql.cj.jdbc.Driver");
或
DriverManager.registerDriver(new Dirver());
在Java中,使用JDBC连接数据库时,需要加载特定的数据库驱动程序以便与之通信。加载驱动程序是为了注册驱动程序,使JDBC API能识别并与特定数据库交互。
从JDK6开始,只要将对应的JAR文件放在类路径中,就无需显式调用 class.forName() 来加载驱动程序,驱动程序会在初始化时自动注册。
1.2 Connection
Connection接口是JDBC API的重要接口,用于建立与数据库的通信通道。换而言之,connection对象不为空,则代表一次数据库连接。
在建立连接时,需要指定数据库URL、用户名、密码参数。
URL:jdbc:mysql://localhost:3306/company
"jdbc:mysq!://IP地址:端口号/数据库名称?参数键值对1&参数键值对2
Connection 接口还负责
管理事务,Connection,接口提供了 commit 和 rollback 方法,用于提交事务和回滚事务。
可以创建 statement 对象,用于执行 SQL语句并与数据库进行交互,
在使用JDBC技术时,必须要先获取Connection对象,在使用完毕后,要释放资源,避免资源占用浪费及泄漏。
1.3 Statement
Statement 接口用于执行 SQL语句并与数据库进行交互。
通过Statement 对象,可以向数据库发送 SQL语句并获取执行结果。结果可以是一个或多个结果。
增删改:受影响行数单个结果。
查询:单行单列、多行多列、单行多列等结果。
注意:
statement 接口在执行SQL语句时,会产生 SQL注入攻击问题:
原因:当使用 Statement 执行动态构建的 SQL查询时,往往需要将查询条件与 SQL语句拼接在一起,直接将参数和SQL语句一并生成,让SQL的查询条件始终为true得到结果。
例子:
输入的是abc' or '1' = '1,却返回表中全部数据
1.4 PreparedStatement
PreparedStatement是 statement 接口的子接口,用于执行 预编译 的 SQL 查询
作用如下
预编译SQL语句:在创建PreparedStatement时,就会预编译SQL语句,也就是SQL语句已经固定。
防止SQL注入: PreparedStatement 支持参数化查询,通过使用 ? 占位符将数据作为参数传递到SQL语句中。传入的参数会自动用单引号包裹,从而有效防止SQL注入问题。
性能提升:Preparedstatement是预编译SQL语句,同一SQL语句多次执行的情况下,可以复用,不必重新编译和解析。
例子:
相同的情况使用preparedStatement的结果,并不会返回所有值
因为 ?占位符会给写进去的‘ ’ 当成值传递 即 abc' or '1' = '1会变成: 'abc\' or \'1\' = \'1'
1.5 ResultSet
ResultSet 是 JDBCAPI 中的一个接口,用于表示从数据库中 执行査询语句所返回的结果集。它提供了一种用于遍历和访问查询结果的方式。
遍历结果:Resultset可以使用 next()方法将游标移动到结果集的下一行,逐行遍历数据库查询的结果,返回值为boolean类型,true代表有下一行结果,false则代表没有。
获取单列结果:可以通过getxxx的方法获取单列的数据,该方法为重载方法,支持索引和列名进行获取
代码使用实例:
package com.atguigu.base;
import com.mysql.cj.jdbc.Driver;
import java.sql.*;
import java.util.Scanner;
public class JDBCQuick1 {
public static void main(String[] args) throws Exception {
Connection connection = DriverManager.getConnection("jdbc:mysql:///company","root","123456");
//连接执行SQL语句的对象,使用Statement的场景,由于存在sql注入的问题,开发中不适用
/*Statement statement = connection.createStatement();
String sql = "SELECT emp_id,emp_name,emp_salary,emp_age FROM t_emp WHERE emp_name = '"+name+"'";
ResultSet resultSet = statement.executeQuery(sql);*/
//使用PreparedStatement的场景,由于是预编译的语句,后续不用在创建sql执行的语句,而是直接执行并返回结果即可
PreparedStatement preparedStatement = connection.prepare