🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!
人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习!欢迎志同道合的朋友一起加油喔🦾🦾🦾
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿
谢谢你这么帅气美丽还给我点赞!比个心
目录
前言
学习数据库的目的就是为了更好的管理数据,管理数据的目的是为了让应用得到更好的实现,那么既已经初步学习了数据库,接下来就应该是考虑数据库如何在程序中使用,java中要使用数据库,就离不开JDBC,那么什么是JDBC呢?
一.JDBC简介
1. 什么是JDBC
JDBC,即 Java Database Connectivity,即 Java 数据库连接。是一种用于执行 SQL 语句的 Java API,它是 Java中的数据库连接规范。这个 API 为 Java 开发人员操作数据库提供了一个标准,可以为多种关系数据库提供统一访问。
API:Application Programming Interface(应用程序接口)
2. JDBC 的存在优势
① Java 语言访问数据库操作完全面向抽象接口编程
② 开发数据库应用不用限定在特定数据库厂商的 API
③ 程序的可移植性大大增强,这和 Java 的特性是一样的,所以这正是 Java 语言拥有 JDBC 编程的原因。
3.JDBC 架构
JDBC 的 API 支持两层和三层处理模式进行数据库访问,但一般的 JDBC 架构由两层处理模式组成:
-
JDBC API: 提供了应用程序对 JDBC 管理器的连接。
- JDBC Driver API: 提供了 JDBC 管理器对驱动程序连接。
JDBC API 使用驱动程序管理器和数据库特定的驱动程序来提供异构(heterogeneous)数据库的透明连接。
JDBC 驱动程序管理器可确保正确的驱动程序来访问每个数据源。该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动程序。
以下是结构图,其中显示了驱动程序管理器相对于在 JDBC 驱动程序和 Java 应用程序所处的位置。
4.常见的 JDBC 组件
JDBC 的 API 提供了以下接口和类:
DriverManager :这个类管理一系列数据库驱动程序。匹配连接使用通信子协议从 JAVA 应用程序中请求合适的数据库驱动程序。识别 JDBC 下某个子协议的第一驱动程序将被用于建立数据库连接。
Driver : 这个接口处理与数据库服务器的通信。你将很少直接与驱动程序互动。相反,你使用 DriverManager 中的对象,它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息。
Connection : 此接口具有接触数据库的所有方法。该连接对象表示通信上下文,即,所有与数据库的通信仅通过这个连接对象进行。
Statement : 使用创建于这个接口的对象将 SQL 语句提交到数据库。除了执行存储过程以外,一些派生的接口也接受参数。
ResultSet : 在你使用语句对象执行 SQL 查询后,这些对象保存从数据获得的数据。它作为一个迭代器,让您可以通过它的数据来移动。
SQLException : 这个类处理发生在数据库应用程序的任何错误。
二.JDBC操作数据库 MySQL
1.导入jar包
在使用 JDBC 之前,需要先安装对应数据库的驱动包,比如博主用的是 MySQL 8.0,那么下载对应的驱动包就是 mysql-connector-java-8.0.20.jar.
先在要运行的项目中创建一个目录(lib)
右击scr -> New -> Packaqe
然后将下好的java包拷贝到这个目录下:
右击lib目录,选择Add as Library(库),将这个jar包添加到库中
在新的对话框中点击OK
导入成功,这样就可以直接使用了~
2.JDBC 的使用
1. 创建数据源
DataSource 是一个接口。不能直接实例化,必须通过 它的实现类 MysqlDataSource 来实例化对象,而这个对象就相当于描述了数据库服务器在哪。
DataSource dataSource =new MysqlDataSource();
- MysqlDataSource 是实现了 javax.sql.DataSource 接口的类。这个接口是用于创建数据库连接的工厂。
- dataSource 是一个数据源(DataSource)对象。数据源是一个用于管理数据库连接的接口,它提供了获取数据库连接的方法、连接池管理等功能。
- 创建 DataSource 对象后,你可以调用其 getConnection() 方法来获取数据库连接。
//设置数据库所在的地址
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
//设置登录数据库的用户名
((MysqlDataSource) dataSource).setUser("root");
//设置登录数据库的密码
((MysqlDataSource) dataSource).setPassword("12345678");
//向下转型
解析上面的代码(这三条语句:向下转型)
(1) setURL 方法中的 URL 是什么?
URL:Uniform Resource Locator 【统一资源定位符】
URL 是网络服务程序上用于指定信息位置的表示方法,简单地说,就是网址。
(2) setUser 方法中的 root 是什么?
root 是 MySQL 管理员默认自带的管理员用户。
(3) setPassword 方法中,填的就是我们安装 MySQL 时设置的密码。
2. 让代码和数据库之间建立连接
Connection connection = dataSource.getConnection();
返回的 connection 对象是用来与数据库进行交互的。它表示与数据库的连接,可以执行 SQL 查询、更新数据库等操作。
连接对象(Connection)提供了一系列的方法,可以执行 SQL 查询语句、更新数据库、提交事务、关闭连接等。
以下是一些常见的连接对象的方法:
- prepareStatement(String sql):创建一个预编译的 SQL 语句对象,用于执行带参数的 SQL 查询或更新操作。
- createStatement():创建一个用于执行不带参数的 SQL 语句的对象。
- commit():提交当前事务。
- rollback():回滚当前事务。
- close():关闭连接。
选择 Connection 接口时,注意选择的是 java,.sql 下的包。
同时记得在方法中抛出异常。
为什么会需要我们抛出异常呢?抛出异常就证明,在后面写的代码中,程序非常有可能会发生异常,也许是受查异常,也许是非受查异常。举个例子,当你想与服务器建立连接的时候,你给的 URL 地址出错了,这就会发生异常,再举个列子,如果你的 URL 给对了,但密码又给错了,这是不是也无法让代码与服务器建立连接呢?
3. 构造SQL语句
我们举一个插入数据表的一个例子,注意写法:
System.out.println("请输入名字:->");
String name = scanner.next();
System.out.println("请输入年龄:->");
int age = scanner.nextInt();
System.out.println("请输入班级:->");
String clas = scanner.next();
// 此处光是一个 String 类型的 SQL 还不行,需要把这个 String 包装成一个 "语句对象"
String sql = "insert into student values(?,?,?)";
PreparedStatement statement =connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,age);
statement.setString(3,clas);
//这个打印需要加到拼接数据之后
System.out.println(statement);
PreparedStatement statement =connection.prepareStatement(sql);
- prepareStatement(String sql):创建一个预编译的 SQL 语句对象,用于执行带参数的 SQL 查询或更新操作。
- 当你调用 connection.prepareStatement(sql) 方法时,传入的 sql 参数是待执行的 SQL 语句。这个方法会将该 SQL 语句发送给数据库,并由数据库进行预先编译。预编译的过程会将 SQL 语句解析、优化和编译成可执行的形式,并创建一个表示该预编译语句的 PreparedStatement 对象。
- statement 变量接收了 PreparedStatement 对象。用于执行预编译的 SQL 语句。
" ? " 表示占位符,相当于告诉 Java,这两个待插入的值还未确定,而第一个问号索引是从 1 开始的,第二个索引为2,依次往后… 其中,set 方法表示替换
而我们打印出来 statement 就是为了检查替换是否正确 !这种构造SQL语句的方法没有插入的数据固定写死,我们每次在操作数据库的时候不再需要去修改插入数据的代码,直接在控制台输入即可
插入操作运行结果
4. 执行 SQL
使用executeUpdate()或者executeQuery 执行sql
- 返回值:executeUpdate 方法执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,如 CREATE TABLE、DROP TABLE 等。它返回的是一个整数,表示受影响的行数。如果返回值是 0,表示没有任何行受到影响。另一方面,executeQuery 用于执行 SELECT 语句,它返回的是一个 ResultSet 对象,可以用来获取查询得到的数据。
- 用途:如果你需要执行查询并获取结果,应使用 executeQuery。如果你需要修改数据或执行 DDL 操作,应使用 executeUpdate。
//如果是 insert,update,delete 都是用 executeUpdate 方法
//如果是 select,使用 executeQuery 方法
int ret = statement.executeUpdate();
System.out.println(ret);
上面接收的返回值就表示当前这个操作,影响到了几行 ( 即哪一行被操作成功了,哪一行被操作失败了 ),对应 cmd 窗口的下列输出。本质上就是当一个 SQL 语句执行完之后,服务器给你的提示。
5. SQL 执行完毕,释放资源
// 先创建的,后释放;后创建的,先释放
// 先打开冰箱,后打开抽屉;而先关闭抽屉,后关闭冰箱
statement.close();
connection.close();
这和 C语言中的 free 方法很像,只不过 C语言中 free方法需要搭配 malloc 方法使用。本质上就是说,把之前在内存中执行的资源释放掉,那么新空出来的内存供给其他使用。
而 Java 中自带垃圾回收机制,JVM 可以自动释放内存。但在这里连接的时候,情况又有不同,JVM 会从系统中申请到一些硬件资源,所以当 SQL 执行完后,还是得记得释放。
三、JDBC 中的一些接口、类
JDBC 编程中常用的一些接口、 类:
1. DataSource 接口 / MysqlDataSource 类
用来描述数据源和描述数据库的地址,( 端口,数据库名,用户名,密码)
- 创建 DataSource 对象后,你可以调用其 getConnection() 方法来获取数据库连接。
2. Connection 接口
表示数据库连接
以下是一些常见的连接对象的方法:
- prepareStatement(String sql):创建一个预编译的 SQL 语句对象,用于执行带参数的 SQL 查询或更新操作。
- createStatement():创建一个用于执行不带参数的 SQL 语句的对象。
- commit():提交当前事务。
- rollback():回滚当前事务。
- close():关闭连接。
3. PreparedStatement 接口
通过这个对象来描述要执行的SQL,还可以对 SQL 进行动态拼接。
我们常用 executeUpdate/executeQuery 方法
- executeQuery(String sql):执行给定的 SQL 查询并返回查询结果的结果集(ResultSet)。
- executeUpdate(String sql):执行给定的 SQL 更新语句(如 INSERT、UPDATE、DELETE)并返回受影响的行数。
注意:
不管 JDBC 编程使用了什么类、什么接口,也不管代码是怎么编程的,但有一点我们需要明确:核心永远在 SQL 语句上。 因为 JDBC 代码始终是固定写法,不管底层是怎么实现的,或许我们不理解它的原理,多写几次代码,依然能记住。但 SQL 语句就不一样了,本质上,就是 SQL 对数据库起直接作用。
四.测试代码(实现增删查改)
1.插入数据(insert)
public class JDBCInsert {
public static void main(String[] args) throws SQLException {
Scanner scanner =new Scanner(System.in);
//JDBC需要一下步骤完成开发
//1.创建并初始化一个数据源
DataSource dataSource =new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2.和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.构造sql语句
System.out.println("请输入名字:->");
String name = scanner.next();
System.out.println("请输入年龄:->");
int age = scanner.nextInt();
System.out.println("请输入班级:->");
String clas = scanner.next();
// 此处光是一个 String 类型的 SQL 还不行,需要把这个 String 包装成一个 "语句对象"
String sql = "insert into student values(?,?,?)";
PreparedStatement statement =connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,age);
statement.setString(3,clas);
//这个打印需要加到拼接数据之后
System.out.println(statement);
//4.执行sql语句
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
//5.释放必要的资源
statement.close();
}
}
2.删除数据(delete)
public class JDBCDelete {
public static void main(String[] args) throws SQLException {
Scanner scanner =new Scanner(System.in);
//1. 创建数据源,设置信息
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2. 和数据库建立连接
Connection connection = dataSource.getConnection();
//3. 构造 SQL
System.out.println("请输入要删除的age:");
int age = scanner.nextInt();
String sql = "delete from student where age = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,age);
//4. 执行 SQL
int ret = statement.executeUpdate();
System.out.println("ret=" + ret);
//5. 释放资源
statement.close();
connection.close();
}
}
3.查找数据(select)
public class JDBCSelect {
public static void main(String[] args) throws SQLException {
//1.创建并初始化数据源
DataSource dataSource =new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2.建立连接
Connection connection =dataSource.getConnection();
//3.构造sql语句
String sql ="select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行sql语句
ResultSet resultSet = statement.executeQuery();
//遍历结果集合
while (resultSet.next()) {
//把resultSet想象成一个表格,同时表格里有个光标,初始情况下光标指向表格最上面
//每次调用next(),光标往下走一行
//当光标指向某一行的时候,就可以通过getXXX获取当前行的数据
String name =resultSet.getString("name");
int age =resultSet.getInt("age");
String clas =resultSet.getString("class");
System.out.println("name = "+ name+",age = " +age+",class = "+clas);
}
//5.释放资源
resultSet.close();
statement.close();
connection.close();
}
}
4.修改数据(update)
public class JDBCUpdate {
public static void main(String[] args) throws SQLException {
Scanner scanner =new Scanner(System.in);
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
Connection connection = dataSource.getConnection();
// 构造SQL
System.out.println("请输入修改前的name:");
String name1 = scanner.next();
System.out.println("请输入修改后的name:");
String name2 = scanner.next();
String sql = "update student set name = ? where name = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name2);
statement.setString(2,name1);
//执行SQL
int ret = statement.executeUpdate();
System.out.println("ret: "+ ret);
//回收资源
statement.close();
connection.close();
}
}
命令行运行结果:
小结
MySQL是一个"客户端-服务器"结构的程序
服务器是MySQL的本体,负责管理数据
客户端有很多种形态(cmd,workbench,JDBC代码…)
- DateSource通用的,能够支持各种数据库
- MysqlDateSource表示数据源,是MySQL驱动包提供的专门针对MySQL的类,设置用户名、密码、URL…
- 通过DateSource来建立Connection
- 通过Connection创建出了PreparedStatement,通过statement把用户构造的SQL通过网络发送给服务器
- 通过网络,把数据集拿回来