一、什么是 jdbc?
jdbc(java data base connectivity) 是 java 提供的一套数据库操作接口标准,用来统一连接数据库、发送 sql、处理结果。
特点:
- 面向接口编程,不关心底层数据库类型
- 切换数据库只需要换驱动包
- 是所有 orm 框架(mybatis、hibernate)的底层基础
jdbc 的核心作用
- 建立数据库连接
- 发送 sql 语句
- 接收并处理执行结果
- 关闭资源
jdbc 工作流程
正常来说,访问数据库的重要步骤如下,jdbc也提供了这些接口:
- 确定数据库服务器的地址和端口号(数据源)
- 建立连接,确定用户名,密码(数据库连接)
- 发送要执行的sql(执行对象)
- 接收返回结果(结果集)
- 关闭连接(释放资源,关闭连接)
数据库厂商提供了jdbc具体的实现类,java程序员只需要利用接口来写程序。
加载驱动 → 建立连接 → 创建 statement → 执行 sql → 处理结果 → 释放资源
二、开发环境准备(maven 项目)
maven类似于应用商店,在maven仓库中维护了所有java工程所用到的依赖。maven仓库是国外的,可以用阿里的镜像。
1. 配置 maven 阿里云镜像
加速依赖下载,在 settings.xml 的 <mirrors> 中加入:
<mirror> <id>aliyunmaven</id> <mirrorof>*</mirrorof> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
2. 引入 mysql 驱动依赖
pom.xml:
<dependencies>
<!-- mysql 8.x 驱动 -->
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>8.0.33</version>
</dependency>
</dependencies>
三、jdbc 核心 api
1. drivermanager(传统连接)
class.forname("com.mysql.cj.jdbc.driver");
connection connection= drivermanager.getconnection(url, user, password);
driver类(驱动类)

2. datasource(连接池)
datasource通过一个连接池去管理很多个连接,当需要执行sql时拿出一个空的连接,用完返还给连接池。是更高效、支持连接复用,企业开发标准用法
mysqldatasource datasource = new mysqldatasource(); datasource.seturl(url); datasource.setuser(user); datasource.setpassword(password);
drivermanager vs datasource
drivermanagergetconnection每次获取的是一个物理连接,每执行一次都会打开一个会话窗口,新建连接,用完销毁,性能低datasourse一个连接可以执行很多sql,直到关闭数据源。连接可复用,关闭只是归还,性能极高
3. connection(连接对象)
代表一次数据库会话,用于创建 statement。
4. statement(执行对象)
- statement:静态 sql,存在 sql 注入风险
- preparedstatement:预编译 sql,解决sql注入问题
- callablestatement:执行存储过程
5. resultset(结果集)
封装 select 查询结果,用 next() 遍历,getxxx(列名/下标) 取值。
四、sql 注入
什么是 sql 注入?
用户输入恶意字符串,破坏原有 sql 逻辑,实现越权查询/删改数据。
示例:
select * from student where name = '' or/**/1=1;#' and class_id=1
直接查出所有数据:

解决方案
preparedstatement + 占位符 ?
statement执行静态的sql语句,preparedstatement可以预处理sql执行对象。参数会被安全转义,从根本杜绝注入。
五、完整代码
功能:根据 name 查询学生
基础版
package org.daisy;
import java.sql.*;
import java.text.messageformat;
import java.util.scanner;
public class demo01_drivermanager {
static scanner in = new scanner(system.in);
public static void main(string[] args) throws classnotfoundexception, sqlexception {
//1. 加载数据库厂商提供的驱动
// "com.mysql.cj.jdbc.driver" 通过完全限定名加载指定的类到jvm
class.forname("com.mysql.cj.jdbc.driver");
//2. 建立连接
connection connection = drivermanager.getconnection("jdbc:mysql://127.0.0.1:3306/test20260422?characterencoding=utf8" +
"&allowpublickeyretrieval=true&usessl=false", "root", "pullmecloser00");
//3. 创建statement对象
//sql语句通过connection发送
statement statement = connection.createstatement();
//4. 定义sql语句
system.out.println("input name:");
string name = in.nextline();
string sql = "select studentid,sn,name,mail,classid from student where name ='"+name+"';";
//5. 执行sql语句,获取结果集
resultset resultset = statement.executequery(sql);
//6. 遍历结果集
// resultset.next() 如果有下一条数据就返回true
while(resultset.next()){
//获取学生id,sql中的int对应java中的int
int stuid = resultset.getint(1);
string stusn = resultset.getstring(2);
string stuname = resultset.getstring(3);
string stumail = resultset.getstring(4);
string stuclassid = resultset.getstring(5);
system.out.println(messageformat.format(
"学生编号 = {0},学号 = {1},学生姓名 = {2},邮箱 = {3},班级 = {4}",
stuid,stusn,stuname,stumail,stuclassid)
);
}
//7. 释放资源,关闭连接
resultset.close();
statement.close();
connection.close();
}
}
datasourse , preparement 优化
package org.daisy;
import com.mysql.cj.jdbc.mysqldatasource;
import javax.sql.*;
import java.text.messageformat;
import java.util.scanner;
public class demo02_datasource {
static scanner in = new scanner(system.in);
public static void main(string[] args) throws sqlexception {
// 定义mysql数据源对象
mysqldatasource mysqldatasource = new mysqldatasource();
//设置数据库连接串,用户名,密码
mysqldatasource.seturl("jdbc:mysql://127.0.0.1:3306/test20260422?characterencoding=utf8" +
"&allowpublickeyretrieval=true&usessl=false");
mysqldatasource.setuser("root");
mysqldatasource.setpassword("pullmecloser00");
//定义jdbc数据源对象
datasource datasource = mysqldatasource;
//1. 通过数据源获取数据库连接
connection connection = datasource.getconnection();
//2. 获取预处理sql执行对象
//定义要执行的sql语句
string sql = "select studentid,sn,name,mail,classid from student where name = ?";
//sql执行对象
preparedstatement preparedstatement = connection.preparestatement(sql);
//用户输入查询信息
system.out.println("input name:");
string name = in.nextline();
//3. 用真实值来替换占位符
//序号1对应第一个占位符
preparedstatement.setstring(1,name);
//4. 执行sql,获取结果
//结果集对象
resultset resultset = preparedstatement.executequery();
//遍历结果
while(resultset.next()){
//获取学生id,sql中的int对应java中的int
int stuid = resultset.getint(1);
string stusn = resultset.getstring(2);
string stuname = resultset.getstring(3);
string stumail = resultset.getstring(4);
string stuclassid = resultset.getstring(5);
system.out.println(messageformat.format(
"学生编号 = {0},学号 = {1},学生姓名 = {2},邮箱 = {3},班级 = {4}",
stuid,stusn,stuname,stumail,stuclassid)
);
}
//5. 关闭资源,释放连接
resultset.close();
preparedstatement.close();
connection.close();
}
}
把建立连接和关闭资源封装成对象
dbutil类
package org.daisy.dbutil;
import com.mysql.cj.jdbc.mysqldatasource;
import javax.sql.datasource;
import java.sql.connection;
import java.sql.resultset;
import java.sql.sqlexception;
import java.sql.statement;
public class dbutil {
/**
* 构造方法私有化,禁止其他类创建dbutil对象,是单例模式的一个重要特征
*/
private dbutil(){}
//数据源
private static datasource datasource = null;
//连接串,用户名,密码
private static string url = "jdbc:mysql://127.0.0.1:3306/test20260422?characterencoding=utf8" +
"&allowpublickeyretrieval=true&usessl=false";
private static string user = "root";
private static string password = "pullmecloser00";
//类加载到jvm时,执行数据源的初始化
static {
mysqldatasource mysqldatasource = new mysqldatasource();
mysqldatasource.seturl(url);
mysqldatasource.setuser(user);
mysqldatasource.setpassword(password);
datasource = mysqldatasource;
}
/**
* 获取数据库连接
* @return
* @throws sqlexception
*/
public static connection getconnection() throws sqlexception {
return datasource.getconnection();
}
/**
* 释放资源,关闭连接
* @param resultset
* @param statement
* @param connection
* @throws sqlexception
*/
public static void close(resultset resultset, statement statement,connection connection) throws sqlexception {
if(resultset!=null)
resultset.close();
if(statement!=null)
statement.close();
if(connection!=null)
connection.close();
}
}
insert类
package org.daisy;
import org.daisy.dbutil.dbutil;
import java.sql.connection;
import java.sql.preparedstatement;
import java.sql.sqlexception;
import java.util.scanner;
public class demo03_insert {
static scanner in = new scanner(system.in);
public static void main(string[] args) throws sqlexception {
//1. 获取数据库连接
connection connection = dbutil.getconnection();
//2. 定义sql
string sql = "insert student (sn,name,mail,classid) values (?,?,?,?)";
//3. 定义预处理对象
preparedstatement statement = connection.preparestatement(sql);
//4. 用真实数据填充占位符
system.out.println("input sn:");
string sn = in.nextline();
system.out.println("input name:");
string name = in.nextline();
system.out.println("input mail:");
string mail = in.nextline();
system.out.println("input classid:");
string classid = in.nextline();
statement.setstring(1,sn);
statement.setstring(2,name);
statement.setstring(3,mail);
statement.setstring(4,classid);
//5. 执行并判断 executeupdate返回结果是受影响的行数
int row = statement.executeupdate();
if(row == 1)
system.out.println("insert successfully");
else
system.out.println("insert fail");
//6. 关闭资源
dbutil.close(null,statement,connection);
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论