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

Java之使用JDBC

学习内容

怎么在Idea里面使用jdbc

文章目录

  • 学习内容
  • 前言
    • 什么是JDBC?
  • jdbc的使用步骤
    • 1.注册驱动
      • 为什么需要注册驱动?
      • 三种注册方式:
    • 2.获取连接
      • 连接的核心要素:
      • 获取连接的方式
    • 3.获取操作对象
      • 三种操作对象对比:
      • 代码演示
      • SQL注入解决方法:
    • 4.执行SQL
      • 三种执行方法:
      • 代码演示
    • 5.处理结果集
      • ResultSet核心概念:
      • ResultSet常用方法:
      • 获取元数据信息
    • 6.关闭资源
      • 资源关闭顺序
      • 基础关闭方式
        • 1.try-catch-finally
        • 2.try-with-resources
  • 总结

前言

什么是JDBC?

JDBC(Java Database Connectivity) 是Java提供的一套用于执行SQL语句的API,它允许Java程序与各种关系型数据库(如MySQL、Oracle、PostgreSQL等)进行交互。


jdbc的使用步骤

1.注册驱动

是将数据库驱动程序加载到Java虚拟机(JVM)中,并告知DriverManager(驱动管理器)这个驱动可用。

为什么需要注册驱动?

不同的数据库有不同的通信协议(MySQL、Oracle、SQL Server等)
DriverManager需要知道使用哪个驱动来建立连接
相当于告诉Java:“我要连接MySQL数据库,请加载对应的驱动程序”

三种注册方式:

方式代码优点缺点
Class.forName()Class.forName(“com.mysql.cj.jdbc.Driver”)兼容性好,推荐需要处理ClassNotFoundException
DriverManager.registerDriver()DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver())直观会创建驱动实例两次
自动注册(JDBC 4.0+)无需代码简单依赖META-INF/services

2.获取连接

获取连接 是通过DriverManager与数据库建立网络连接,返回一个Connection对象。

连接的核心要素:

  • URL:数据库的位置和协议

    • jdbc:mysql://localhost:3306/database_name?参数1=值1&参数2=值2
    • 协议 子协议 主机地址 端口 数据库名 连接参数
    • 常见参数及介绍
参数名说明默认值示例
useSSL是否使用SSL加密连接falseuseSSL=false
serverTimezone服务器时区系统默认serverTimezone=Asia/Shanghai
useUnicode是否使用Unicode编码trueuseUnicode=true
characterEncoding字符编码characterEncoding=utf8
allowPublicKeyRetrieval是否允许获取公钥falseallowPublicKeyRetrieval=true
  • 用户名:数据库登录账号
  • 密码:数据库登录密码

获取连接的方式

// 方式1:使用URL + 用户名 + 密码Connectionconn=DriverManager.getConnection(url,user,password);// 方式2:使用URL + Properties对象Propertiesprops=newProperties();props.setProperty("user","*****");props.setProperty("password","*****");Connectionconn=DriverManager.getConnection(url,props);// 方式3:仅使用URL(需要URL中包含用户信息)Stringurl="jdbc:mysql://user:password@localhost:3306/jdbc";Connectionconn=DriverManager.getConnection(url);

结束时需要关闭conn

3.获取操作对象

获取操作对象 是创建用于执行SQL语句的对象。

三种操作对象对比:

类型用途特点适用场景
Statement执行静态SQL每次都需要编译SQL固定SQL,无参数
PreparedStatement执行带参数的SQL预编译,防SQL注入动态SQL,有参数
CallableStatement调用存储过程支持存储过程调用执行存储过程

代码演示

Statementstmt=conn.createStatement();

结束时需要关闭stmt

SQL注入解决方法:

使用prepare statement进行预编译,再将需要传入的数据作为值传进去

  • 语法
    • 1.写sql语句,用?代替所要传入的值:
      String sql = "select * from tuser where name= ? and password= ? ";
    • 2.进行预编译:
      PreparedStatement pstmt = conn.prepareStatement(sql)
    • 3.将值传入:
      pstmt.setString(1,name);
      pstmt.setString(2,password);
  • 代码演示
packagejbdc;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.sql.*;/* 1.在JDBC中Statement有一个子接口叫PreparedStatement(预编译的数据库操作对象) 2.它是如何解决sql注入的问题的 它会对sql语句进行预先编译,然后再给sql传值,即使用户提供的信息含有sql语句的关键字, 这些关键字也只会被当作“值”来处理,不会参与sql语句的编译,进而解决sql注入的问题 */publicclassjdbctest06{staticvoidmain()throwsException{BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));System.out.println("请输入姓名");Stringname=br.readLine();System.out.println("请输入密码");Stringpassword=br.readLine();try{Class.forName("com.mysql.cj.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/jbdc";Stringuser="******";Stringpassword1="******";try(Connectionconn=DriverManager.getConnection(url,user,password1)){Stringsql="select * from tuser where name= ? and password= ? ";try(PreparedStatementpstmt=conn.prepareStatement(sql)){pstmt.setString(1,name);pstmt.setString(2,password);try(ResultSetrs=pstmt.executeQuery()){if(rs.next()){System.out.println("登陆成功");}else{System.out.println("登陆失败");}}}}}catch(Exceptione){e.printStackTrace();}}}

4.执行SQL

执行行SQL 是将SQL语句发送到数据库执行,并获取执行结果。

三种执行方法:

方法返回值适用场景
executeQuery()ResultSetSELECT查询语句
executeUpdate()int(影响行数)INSERT/UPDATE/DELETE
execute()boolean不确定SQL类型或DDL语句

代码演示

Stringsql="INSERT INTO tuser (id, name, password, gender, phone) VALUES (?, ?, ?, ?, ?)";ResultSetrs=stmt.executeQuery(sql);###

5.处理结果集

处理结果集 是从ResultSet中提取查询结果数据。

ResultSet核心概念:

1.游标(Cursor):指向当前数据行的指针
2.列索引:从1开始计数
3.数据获取:按列名或列索引获取

ResultSet常用方法:

方法作用
next()移动到下一行
getString(“列名”)获取字符串类型数据
getInt(“列名”)获取整数类型数据
getDouble(“列名”)获取浮点数类型数据
getDate(“列名”)获取日期类型数据
wasNull()判断上一列是否为NULL

获取元数据信息

ResultSetMetaData .getMetaData()

6.关闭资源

关闭资源 是JDBC编程中至关重要的一步,它负责释放数据库连接、语句对象和结果集等资源,防止内存泄漏和数据库连接耗尽。

资源关闭顺序

正确的关闭顺序(从里到外):

  1. ResultSet(结果集) ← 最先关闭
  2. Statement/PreparedStatement(语句对象) ← 其次
  3. Connection(连接) ← 最后关闭

原因:ResultSet依赖Statement,Statement依赖Connection

基础关闭方式

1.try-catch-finally
// 先关闭ResultSetif(rs!=null){try{rs.close();System.out.println("✅ ResultSet已关闭");}catch(SQLExceptione){System.err.println("❌ ResultSet关闭失败: "+e.getMessage());e.printStackTrace();}}// 再关闭Statementif(stmt!=null){try{stmt.close();System.out.println("✅ Statement已关闭");}catch(SQLExceptione){System.err.println("❌ Statement关闭失败: "+e.getMessage());e.printStackTrace();}}// 最后关闭Connectionif(conn!=null){try{conn.close();System.out.println("✅ Connection已关闭");}catch(SQLExceptione){System.err.println("❌ Connection关闭失败: "+e.getMessage());e.printStackTrace();}}
2.try-with-resources
  • 核心要点
    1.自动关闭:资源在使用完毕后自动调用 close() 方法
    2.必须实现 AutoCloseable:只有实现了 AutoCloseable 接口的资源才能使用
    3.声明在括号内:资源在 try 后的括号中声明和初始化
    4.逆序关闭:多个资源会按照声明的逆序关闭
  • 代码演示
try(Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery("SELECT id, name FROM tuser LIMIT 3")){System.out.println("【资源创建顺序】");System.out.println(" 1️⃣ Connection 已创建");System.out.println(" 2️⃣ Statement 已创建");System.out.println(" 3️⃣ ResultSet 已创建");System.out.println("\n【使用资源】");while(rs.next()){System.out.printf(" ID: %d, 姓名: %s%n",rs.getInt("id"),rs.getString("name"));}System.out.println("\n【退出 try 块,自动关闭资源】");System.out.println(" 关闭顺序(逆序):");System.out.println(" 3️⃣ → 2️⃣ → 1️⃣");System.out.println(" ResultSet → Statement → Connection");}catch(SQLExceptione){System.err.println("❌ 错误: "+e.getMessage());}

也可以使用try嵌套

总结

http://www.jsqmd.com/news/1332078/

相关文章:

  • Windows 本地 AI 自动化工具 OpenClaw 2.9.0 完整部署实操指南
  • 喇叭驱动与腔体怎么匹配?净化器D类功放+BOX腔体联合调试实战
  • Nginx proxy_temp目录权限问题深度解析与解决方案
  • 可视化数据图表全分类新手入门指南
  • 2026甘肃耐用的水肥一体化施肥机销售厂家推荐业内推荐优选指南,实地考察甄选更可靠。 - geo交流
  • 从自动化到智能自治:构建L4级无人运维体系的核心架构与实践
  • 四川工厂老旧电路配电柜整改施工怎么选?2026年专业公司评估与参考指南 - 优质品牌商家
  • Unity二次元桌宠开发实战:从Live2D模型到桌面交互全流程
  • 从零构建AI智能体:基于LangChain的Hello-Agents实战指南
  • SQL窗口函数RANK()详解:分组排名、跳跃机制与实战应用
  • JetBrains Rider
  • 招聘会转了三圈,没有一个摊位招 .NET
  • 珠穆朗玛登峰简记
  • Friedman检验结果解读:多组配对数据的非参数比较
  • 解锁加密音乐的终极方案:Unlock Music Electron 桌面版完整指南
  • 国内注塑用脱模剂市场占有率靠前的品牌有哪些 - 优企甄选
  • 机器学习实战:决策树训练、回归树、随机森林与垃圾邮件识别
  • 2026年北京GEO公司优选指南:泛海明心为何值得信赖? - GrowthUME
  • Ubuntu用户登录与操作历史全解析:从基础命令到auditd审计实战
  • 达梦数据库错误码解析:从-20040唯一约束违反看数据库运维实战
  • 终极指南:5步让老款Mac重获新生,运行最新macOS系统
  • GaussDB登录失败锁定机制:原理、配置与运维实战指南
  • 如何快速解锁网易云音乐NCM格式:ncmdump工具终极指南
  • 《荣耀出征点卡服》手游官方网站8月最新下载入口,告别通胀内卷,在公平奇迹大陆找寻长久稳定的打宝之旅
  • PostgreSQL核心配置与目录结构深度解析:从原理到生产环境调优实践
  • 今天我们来真正地认识 AI Agent
  • SpringBoot日志配置全解析:从核心原理到千万级流量生产实践
  • Linux磁盘性能测试全攻略:从dd到fio,精准评估IOPS与延迟
  • 杰理AC695、AC696系列之外挂FLASH的用途
  • Unlock Music Electron:现代音频加密破解与本地化隐私保护的技术实现