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

相关推荐
摇滚侠7 分钟前
Spring Boot 3零基础教程,WEB 开发 HttpMessageConverter @ResponseBody 注解实现内容协商源码分析 笔记33
java·spring boot·笔记
计算机毕业设计小帅24 分钟前
【2026计算机毕业设计】基于Springboot的校园电动车短租平台
spring boot·后端·课程设计
调试人生的显微镜24 分钟前
Web前端开发工具实战指南 从开发到调试的完整提效方案
后端
静心观复24 分钟前
drawio画java的uml的类图时,class和interface的区别是什么
java·uml·draw.io
Java水解25 分钟前
【SQL】MySQL中空值处理COALESCE函数
后端·mysql
Laplaces Demon26 分钟前
Spring 源码学习(十四)—— HandlerMethodArgumentResolver
java·开发语言·学习
guygg8830 分钟前
Java 无锁方式实现高性能线程
java·开发语言
ss27331 分钟前
手写Spring第7弹:Spring IoC容器深度解析:XML配置的完整指南
java·前端·数据库
Python私教33 分钟前
DRF:Django REST Framework框架介绍
后端·python·django
间彧35 分钟前
Java HashMap如何合理指定初始容量
后端