当前位置: 首页 > news >正文

jdbc相关知识

JDBC (Java Database Connectivity) 介绍

JDBC 是 Java 平台中用于与关系型数据库进行交互的标准 API,它提供了一套统一的接口,使 Java 程序能够连接和操作各种不同的数据库系统。

核心概念

  1. 定义:JDBC 是 Java 语言中用来规范客户端程序如何访问数据库的应用程序接口(API)

  2. 作用

    • 建立与数据库的连接
    • 发送 SQL 语句
    • 处理结果
  3. 架构

    Java应用程序 → JDBC API → JDBC驱动管理器 → JDBC驱动 → 数据库

主要组件

  1. DriverManager:管理数据库驱动程序的加载和连接建立
  2. Connection:表示与数据库的连接
  3. Statement:用于执行静态 SQL 语句并返回结果
  4. PreparedStatement:预编译的 Statement,用于执行参数化查询
  5. CallableStatement:用于执行数据库存储过程
  6. ResultSet:表示数据库查询返回的结果集

工作流程

  1. 加载驱动

    java

    Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL示例
  2. 建立连接

    java

    Connection conn = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/mydb", "username", "password");
  3. 创建语句对象

    java

    Statement stmt = conn.createStatement();
    // 或
    PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id=?");
  4. 执行查询

    java

    ResultSet rs = stmt.executeQuery("SELECT * FROM users");
    // 或
    pstmt.setInt(1, 1001);
    ResultSet rs = pstmt.executeQuery();
  5. 处理结果

    java

    while(rs.next()) {
    System.out.println(rs.getString("username"));
    }
  6. 关闭资源

    java

    rs.close();
    stmt.close();
    conn.close();

优势

  1. 数据库无关性:通过统一的接口访问不同数据库
  2. 简单易用:提供了简单直观的 API
  3. 功能强大:支持所有 SQL 操作
  4. 广泛支持:几乎所有主流数据库都提供 JDBC 驱动

常见驱动类型

  1. JDBC-ODBC 桥驱动:通过 ODBC 连接数据库(已过时)
  2. 本地API驱动:部分Java实现,部分本地代码
  3. 网络协议驱动:纯Java实现,通过数据库网络协议通信
  4. 本地协议驱动:纯Java实现,模拟数据库客户端协议

现代改进

  1. try-with-resources(Java 7+):自动资源管理

    java

    try (Connection conn = DriverManager.getConnection(...);
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(...)) {
    // 处理结果
    }
  2. 连接池:如 HikariCP, DBCP 等提高性能

  3. 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;
}
}
http://www.dtcms.com/a/394799.html

相关文章:

  • yolov12 导出onnx
  • Linux 环境变量与程序地址空间
  • LeetCode:48.路径总和Ⅲ
  • 计算机网络的性能
  • 深度学习笔试选择题:题组1
  • 统一配置管理根据不同域名展现不同信息或相近信息 Vue3类单例模式封装
  • 人工智能深度学习——循环神经网络(RNN)
  • 单例模式指南:全局资源的安全访问
  • 容器化 Tomcat 应用程序
  • Vue Router【前端】
  • 数据结构——受限线性表之栈
  • 数据结构(1)------ 三要素
  • BaaS(Backend as a Service)概述、平台、项目
  • 区间dp,数据结构优化dp等5种dp,各种trick深度讲解
  • 数据结构笔试选择题:题组1
  • 前端基础:从0到1实现简单网页效果(一)
  • 数据结构|图论:从数据结构到工程实践的核心引擎
  • AI赋能个人效能提升:实战演练工作规划、项目复盘与学习发展
  • 7. Linux RAID 存储技术
  • iOS 上架 App 费用详解 苹果应用发布成本、App Store 上架收费标准、开发者账号与审核实战经验
  • kafka 2.12_3.9.1 版本修复 Apache Commons BeanUtils 访问控制错误漏洞(CVE-2025-48734)
  • 二分查找经典——力扣153.寻找旋转排序数组中的最小值
  • 离散数学之命题逻辑
  • 【Linux命令从入门到精通系列指南】ping 命令详解:网络连通性诊断的终极工具
  • 游戏UI告别“贴图”时代:用Adobe XD构建“活”的设计系统
  • NXP - 用MCUXpresso IDE导入lpcopen_2_10_lpcxpresso_nxp_lpcxpresso_1769.zip中的工程
  • ✅ Python+Django租房推荐系统 双协同过滤+Echarts可视化 租房系统 推荐算法 全栈开发(建议收藏)✅
  • Django入门-3.公共视图
  • 【 设计模式 | 结构型模式 代理模式 】
  • 小杰机器学习高级(five)——分类算法的评估标准