✎JDBC 概述
- **JDBC(Java DataBase Connectivity,java 数据库连接)**是一种用于执行 SQL 语句的 Java API。JDBC 是 Java 访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用 Java 语言编写的接口和类组成。
- JDBC 需要连接驱动,驱动是两个设备要进行通信,需满足一定通信数据格式,数据格式由设备提供商规定。设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
✎JDBC 原理
Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。
JDBC 是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
✎JDBC 入门案例
✎准备数据
1 | # 创建数据库 |
✎添加依赖
在 Maven 项目中添加 mysql 连接依赖
1 | <dependencies> |
✎实现
注意:mysql 8 与之前版本的操作有所不同。
1 | public static void main(String[] args) |
✎API 详解
✎注册驱动
- 代码:
Class.forName("com.mysql.cj.jdbc.Driver");
- JDBC 规范定义驱动接口:
java.sql.Driver
- mysql 8 驱动包提供了实现类:
com.mysql.cj.jdbc.Driver
- 使用
Class.forName()
加载一个使用字符串描述的驱动类。
如果使用 Class.forName()
将类加载到内存,该类的静态代码将自动执行。通过查询 com.mysql.jdbc.Driver
源码,我们发现 Driver 类“自动”将自己进行注册。
1 | public class Driver extends NonRegisteringDriver implements java.sql.Driver { |
另一种方法:DriverManager
工具类提供注册驱动的方法 registerDriver()
,方法的形参是 java.sql.Driver
,因此可以通过语句 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
进行注册;但不推荐使用,因为存在以下不足:
- 程序耦合;
- 硬编码,后期不易于程序扩展和维护;
- 驱动被注册两次。
✎获取连接
- 代码:
Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC”, ”root”, ”1234”);
- 获取连接需要方法
DriverManager.getConnection(url, username, password)
,三个参数分别表示:- url:需要连接数据库的位置(地址)
- user:用户名
- password:密码
✎获取执行对象
代码:Statement statement = conn.createStatement();
✎执行 SQL 语句
常用方法:
int executeUpdate(String sql);
- 执行 insert, update, delete 语句ResultSet executeQuery(String sql);
- 执行 select 语句boolean execute(String sql);
- 执行 select 语句时返回 true,执行其他的语句返回 false
✎处理结果集
ResultSet 实际上就是一张二维的表格,我们可以调用其 boolean next();
方法指向下一行记录;再使用 T getT(int colIndex / String colLabel)
方法(列下标从1开始)来获取指定列的数据;
1 | rs.next(); // 指向下一行 |
常用方法:
Object getObject(int colIndex / String colLabel)
- 获得任意对象String getString(int colIndex / String colLabel)
- 获得字符串int getInt(int colIndex / String colLabel)
- 获得整型double getDouble(int colIndex / String colLabel)
- 获得双精度浮点型
✎释放资源
与 IO 流一样,使用后的资源需要关闭!关闭的顺序是 先得到的后关闭,后得到的先关闭。
✎JDBC 工具类
对数据库进行”增删改查“都需要先”获取数据库连接“,可以封装一个工具类 JdbcUtils,提供获取连接对象的方法,从而实现代码复用。
1 | public class JdbcUtils { |
✎JDBC 增删改查
1 | public static void main(String[] args) throws SQLException { |
✎预处理对象
SQL注入问题:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。
例如登录案例 SQL 语句如下:
1 | select * from 用户表 where name=账号 and password=密码; |
此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录;但是当用户输入的账号为 xxx
,密码为 'xxx' or 'a'='a'
时,则真正执行的 SQL 语句变为:
1 | select * from 用户表 where name='xxx' and password='xxx' or 'a'='a'; |
此时,上述查询语句 where 后条件始终为真,会查询出数据库中全部记录的,用户就直接登录成功了,这便是SQL注入问题。
如何解决?使用预处理对象 PreparedStatement
PreparedStatement 处理的每条 sql 语句中所有的实际参数都必须使用占位符 ? 来替换。
1 | public static void main(String[] args) throws SQLException { |