什么是JDBC
JDBC( Java DataBase Connectivity)就是使用java操作数据库的一套API。JDBC是一套标准接口,使用JDBC,在不更改任何Java代码的情况下,可以操作Mysql数据库、Oracle数据库等。
JDBC开发流程简介
JDBC的开发流程很简单,实际就是通过Java代码将SQL语句发送给mysql,然后处理Mysql的返回结果。
其代码的编写步骤大致如下:
创建工程,导入驱动jar包
我们以IDEA2022版本为例,演示下如何创建项目,引入jar包
首先,新建项目,选择合适的JDK版本(我们以1.8为例)
项目创建好后,创建lib 文件夹,文件夹下放mysql的驱动包mysql-connector-java-5.1.48.jar, 然后右键驱动包,选择【Add library】添加为库文件,添加为库文件时,level选择Module Library(模块有效)
最后,我们在src下创建一个JDBC类即可
本示例外层增加了Jdbc_Demo文件夹,起名时,在类名可以加 文件夹名. ****项目创建出来就会自动带文件夹名
代码实现
java
package jdbc_DEMO;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/*
* JDBC快速入门
* */
public class JDBC {
public static void main(String[] args) throws Exception{
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/datebase";
String userName = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,userName,password);
// 3.定义sql
String sql = "INSERT INTO t_user (id,user_name,state,user_id) VALUES (2,'dqwdqwdqwd',5,'9527');";
// 4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
// 5.执行sql
int count = stmt.executeUpdate(sql); // 受影响的行数
// 6.处理结果
System.out.println(count);
// 7.释放资源
stmt.close();
conn.close();
}
}
代码详解
主类和方法
arduino
public class JDBC {
public static void main(String[] args) throws Exception {
// 数据库连接、SQL执行和资源清理的代码将在此处编写。
}
}
注册JDBC驱动程序
vbnet
Class.forName("com.mysql.jdbc.Driver");
在这部分代码中,注册了MySQL的JDBC驱动程序。这一步是为了让Java应用程序知道MySQL数据库驱动程序类。
注意,本示例为了便于演示,使用的是旧的方法来加载驱动程序类,java框架中已经不使用这种形式了。
建立数据库连接
Java代码需要发送SQL给MySQL服务端,就需要先建立连接,DriverManager的getConnection有三个参数,数据库地址、数据库用户名、数据库密码
ini
Connection conn = DriverManager.getConnection(url, username,password);
定义SQL语句
这里根据需求自己设置
ini
String sql = "INSERT INTO t_user (id,user_name,state,user_id) VALUES (2,'dqwdqwdqwd',5,'9527');";
创建Statement并执行SQL
ini
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
代码使用Connection 类的createStatement() 方法创建了一个Statement 对象。然后,使用Statement 类的executeUpdate() 方法执行SQL INSERT语句。此方法通常用于数据操作查询,如INSERT、UPDATE、DELETE等。方法返回受SQL语句影响的行数,并将其存储在变量count中。
处理结果
csharp
System.out.println(count);
代码打印count的值,即SQL INSERT语句所影响的行数(在本例中,即插入的行数)。
关闭资源
go
stmt.close();
conn.close();
最后,代码关闭Statement 和Connection对象,以释放数据库资源。
Api详解
DriverManager
DriverManager是一个驱动管理类,它的源码中有很多方法。
注册驱动
上述示例中,我们使用了它的registerDriver方法
arduino
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
getConnection方法
ini
Connection conn = DriverManager.getConnection(url,userName,password);
但是,示例中的注册驱动方法似乎没有调用registerDriver,我们点开com.mysql.jdbc.Driver中的Driver看看源码
通过代码,我们可以看出,当Driver类被调用时,其内部的静态代码块就会执行,静态代码块中执行了DriverManager的registerDriver注册方法
arduino
DriverManager.registerDriver(new Driver());
重要提示:
**MySql5之后的驱动包,可以直接省略注册驱动的步骤。 **(删除这句代码也不会报错)。java会自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类
数据库连接
数据库连接需要我们本地安装有mysql,本示例中本地数据库如下:
本地mysql地址是127.0.0.1:3306,有一个datebase数据库,数据库里有一个t_user表
Api
url :连接路径
语法: jdbc:mysql:// ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...
示例: jdbc:mysql://127.0.0.1:3306/datebase
url的省略
如果连接的是本机mysql服务器,且默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
ini
// 2.获取连接
String url = "jdbc:mysql:///datebase";
运行代码,可以发现控制台正常输出了结果
SSL报错禁用
观察上面的截图,我们会发现控制台有安全警告,这是数据库希望我们用ssl的安全连接方式。我们可以禁用这个告警
ini
String url = "jdbc:mysql:///datebase?useSSL=false";
重新运行代码,可以发现报错就被解决了
配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
Connection
Connection用于数据库连接,我们先看看其官方Api文档
它主要有两个作用:
- 获取执行SQL的对象
- 管理事务
获取执行SQL的对象
createStatement
普通执行sql对象
我们的示例代码中,采用了createStatement获取了sql执行对象Statement
ini
// 4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
需要注意的是,本示例中这种方式是不安全的,也不是实际项目开发中使用的。实际上,现在都使用perpareStatement获取sql执行对象。
perpareStatement
PreparedStatement对象允许数据库预编译SQL语句,它的安全性和效率都远高于Statement。鉴于篇幅问题,本文章不会展开讲解。
事务管理
DBC的事务管理是指在执行数据库操作时,通过启用事务来确保一组操作要么全部成功执行,要么全部回滚(撤销),从而保持数据库的一致性和完整性。
篇幅问题,本文不展开讲解。
Statement
Statement是用来执行sql语句的,mysql中有三种sql语句类型。
- DDL:对表和库的增删改查操作
- DML:对数据的增删改操作
- DQL:对数据的查询操作
Statement 实例对象主要两个方法,executeUpdate 和executeQuery
executeUpdate
executeUpdate可以执行DML、DDL语句,其返回值是sql语句影响的行数。
执行DML:
如果我们的数据表有一条数据
csharp
// 3.定义sql
String sql = "UPDATE t_user set name = 'shixiaoshi' where id = 1";
// 4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
// 5.执行sql
int count = stmt.executeUpdate(sql); // 受影响的行数
// 6.处理结果
if(count > 0){
System.out.println("数据库操作成功");
}else {
System.out.println("数据库操作失败");
}
执行上面的代码,sql语句会更改数据表中id为1的这条数据,因此,executeUpdate的值为1。如果执行下面的sql语句,因为没有id=2这一项,因此数据库就会操作失败,返回的结果就是0。
ini
String sql = "UPDATE t_user set name = 'shixiaoshi' where id = 2";
执行DDL
- 增加一个数据库
我们的服务端目前有5个数据库
我们更改sql语句创建一个数据库
ini
// 3.定义sql
String sql = "create database newDb";
执行代码,可以看到服务端增加了一个数据库newDb
- 删除一个数据库
ini
// 3.定义sql
String sql = "drop database newDb";
注意,刪除数据库即使成功,返回值也是0
executeQuery
Statement的executeQuery方法用于查询数据数据表的结果。它是类型是 ResultSet。
我们简单展示下代码
java
package jdbc_DEMO;
import java.sql.*;
/*
* JDBC快速入门
* */
public class JDBC {
public static void main(String[] args) throws Exception{
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
String url = "jdbc:mysql:///datebase?useSSL=false";
String userName = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,userName,password);
// 3.定义sql 查询数据
String sql = "select * from t_user";
// 4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
// 5.执行sql
ResultSet rs = stmt.executeQuery(sql); // 受影响的行数
// 6.处理结果
System.out.println("--------------------"+ rs);
// 7.释放资源
rs.close();
stmt.close();
conn.close();
}
}
需要注意的是,executeQuery返回的rs对象在代码结束后也需要释放rs.close()
我们观察下输出结果
可以看到,rs并不是我们能直接识别的数据,它需要通过ResultSet的一些方法解析才能成为我们所熟知的数据。