原生JDBC快速入门

什么是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();

最后,代码关闭StatementConnection对象,以释放数据库资源。

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 实例对象主要两个方法,executeUpdateexecuteQuery

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的一些方法解析才能成为我们所熟知的数据。

相关推荐
爬山算法几秒前
Maven(6)如何使用Maven进行项目构建?
java·maven
.生产的驴4 分钟前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
爱学的小涛12 分钟前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
吹老师个人app编程教学12 分钟前
详解Java中的BIO、NIO、AIO
java·开发语言·nio
爱学的小涛13 分钟前
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
java·开发语言·笔记·后端·nio
北极无雪17 分钟前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
琴智冰21 分钟前
SpringBoot
java·数据库·spring boot
binqian21 分钟前
【SpringSecurity】基本流程
java·spring
爱码少年23 分钟前
springboot工程中使用tcp协议
spring boot·后端·tcp/ip
猿小蔡-Cool1 小时前
CPU 多级缓存
java·spring·缓存