jdbc相关知识
JDBC (Java Database Connectivity) 介绍
JDBC 是 Java 平台中用于与关系型数据库进行交互的标准 API,它提供了一套统一的接口,使 Java 程序能够连接和操作各种不同的数据库系统。
核心概念
定义:JDBC 是 Java 语言中用来规范客户端程序如何访问数据库的应用程序接口(API)
作用:
- 建立与数据库的连接
- 发送 SQL 语句
- 处理结果
架构:
Java应用程序 → JDBC API → JDBC驱动管理器 → JDBC驱动 → 数据库
主要组件
- DriverManager:管理数据库驱动程序的加载和连接建立
- Connection:表示与数据库的连接
- Statement:用于执行静态 SQL 语句并返回结果
- PreparedStatement:预编译的 Statement,用于执行参数化查询
- CallableStatement:用于执行数据库存储过程
- ResultSet:表示数据库查询返回的结果集
工作流程
加载驱动:
java
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL示例
建立连接:
java
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb", "username", "password");
创建语句对象:
java
Statement stmt = conn.createStatement();
// 或
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id=?");
执行查询:
java
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// 或
pstmt.setInt(1, 1001);
ResultSet rs = pstmt.executeQuery();
处理结果:
java
while(rs.next()) {
System.out.println(rs.getString("username"));
}
关闭资源:
java
rs.close();
stmt.close();
conn.close();
优势
- 数据库无关性:通过统一的接口访问不同数据库
- 简单易用:提供了简单直观的 API
- 功能强大:支持所有 SQL 操作
- 广泛支持:几乎所有主流数据库都提供 JDBC 驱动
常见驱动类型
- JDBC-ODBC 桥驱动:通过 ODBC 连接数据库(已过时)
- 本地API驱动:部分Java实现,部分本地代码
- 网络协议驱动:纯Java实现,通过数据库网络协议通信
- 本地协议驱动:纯Java实现,模拟数据库客户端协议
现代改进
try-with-resources(Java 7+):自动资源管理
java
try (Connection conn = DriverManager.getConnection(...);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(...)) {
// 处理结果
}
连接池:如 HikariCP, DBCP 等提高性能
ORM框架:如 Hibernate, MyBatis 等简化数据库操作
JDBC 是 Java 持久层技术的基础,虽然现代开发中常使用更高级的框架,但理解 JDBC 对于深入掌握 Java 数据库编程至关重要。
下放一个例子
Test2 创建数据库的执行方法,提供查询函数
package com.demo;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
//查询30号部门的工作种类
String sql="SELECT * FROM tb_emp WHERE deptNo=30";
List<Emp> emps = Test2.execQuery(sql);
for (Emp emp : emps) {
System.out.println(emp.getJob());
}
}
/**
* 查询方法
* @param sql
*/
public static List<Emp> execQuery(String sql) {
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//建立连接
try {
Connection con =
DriverManager.getConnection("jdbc:mysql://localhost:3306/emp", "root", "root");
// System.out.println(con);
//创建执行sql的对象
Statement statement = con.createStatement();
//执行sql
ResultSet resultSet = statement.executeQuery(sql);
//创建集合存储所有的员工
List<Emp> list = new ArrayList<Emp>();
//解析数据
while (resultSet.next()) {
String ename = resultSet.getString("ename");//获得对应列的信息
int empno = resultSet.getInt("empno");
String job = resultSet.getString("job");
//创建员工对象
Emp emp = new Emp();
//给员工对象添加属性
emp.setEmpno(empno);
emp.setEname(ename);Emp 员工的实体类
emp.setJob(job);
//将员工添加到集合中
list.add(emp);
}
//关闭
resultSet.close();
statement.close();
con.close();
return list;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
package com.demo;
public class Emp {
//`empno``ename``job``mgr``hiredate``sal``comm``deptno`
private int empno;
private String ename;
private String job;
private String mgr;
private String hiredate;
private String sal;
private String comm;
private int deptno;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}封装增删改操作
public String getMgr() {
return mgr;
}
public void setMgr(String mgr) {
this.mgr = mgr;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
public String getSal() {
return sal;
}
public void setSal(String sal) {
this.sal = sal;
}
public String getComm() {
return comm;
}
public void setComm(String comm) {
this.comm = comm;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
}
package com.demo;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ZsgMethed {
public static void main(String[] args) {
String sql="UPDATE tb_emp SET sal=? WHERE empno=? ";
Scanner input = new Scanner(System.in);
System.out.println("请输入你要修改的员工编号");
int empno=input.nextInt();System.out.println("请输入你要修改的员工薪资");
int sal=input.nextInt();
int i = new ZsgMethed().execUpdate(sql,empno,sal);
String s = i > 0 ? "修改成功" : "修改失败";
System.out.println(s);
}
public int execUpdate(String sql,int empno,int sal){
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//建立连接
try {
Connection con =
DriverManager.getConnection("jdbc:mysql://localhost:3306/emp", "root", "root");
// System.out.println(con);
//创建执行sql的对象
PreparedStatement preparedStatement = con.prepareStatement(sql);
//给sql赋值
preparedStatement.setObject(1,sal);
preparedStatement.setObject(2,empno);
//执行sql
int result= preparedStatement.executeUpdate();
//关闭
preparedStatement.close();
con.close();
return result;
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
}