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

jdbc相关内容

1.什么是 jdbc?

jdbc 是连接和操作数据库的一种标准 API。

2.jdbc的主要作用

第一个是数据库的连接,第二个是执行 SQL 语句,第三个处理查询结果,第四个事务管理,第五个跨数据库兼容

3.jdbc开发的步骤

a.加载驱动使用DriverManager
b. 获取连接,返回Connection接口,说明连接上数据库的服务器
 执行SQL语句
 编写SQL语句
c.获取能执行SQL语句的对象(Statement接口)
d. 如果执行的查询的语句,返回的结果,封装ResultSet接口中,遍历该接口
e. 释放资源(调用close()方法)

4.分别介绍jdbc的开发步骤

DriverManager类(驱动)

 DriverManager是JDBC中管理数据库驱动的核心类,主要负责管理各种数据库驱动的实现类。 它的主要作用有两个: 第一个是加载驱动,通过registerDriver(Driver driver)方法来注册驱动,但直接传入new Driver()这种方式有缺点,一方面会让代码过度依赖具体的驱动实现类,不利于更换数据库;另一方面还会导致驱动的jar包被加载两次。

所以更好的做法Class.forName("com.mysql.jdbc.Driver")这种方式,它会加载驱动类并自动完成注册,避免了上述问题。 第二个是获取数据库连接,通过getConnection(String url, String user, String password)方法实现。

这个方法需要三个参数: 第一个是数据库URL,格式是jdbc:mysql://localhost:3306/数据库名,其中jdbc是主协议,mysql是子协议,localhost是主机名,3306是默认端口号。如果是访问本地数据库,localhost:3306可以省略,简写为jdbc:mysql:数据库名 - 第二个是数据库用户名,通常是root - 第三个是数据库密码

简单来说,DriverManager就是用来管理驱动,并通过加载驱动和获取连接这两个主要功能,让Java程序能够和数据库建立连接。

再结合后面提到的内容总结一下:DriverManager主要负责管理驱动,通过Class.forName("com.mysql.jdbc.Driver")加载驱动,通过getConnection("jdbc:mysql:///day07","root","密码")获取连接;而Connection是连接接口,Statement是能执行SQL语句的接口。

Connection 接口

代表与数据库的连接,是很珍贵的资源,用完必须释放。主要作用有:

  1. 获取执行 SQL 的对象:
    • 通过createStatement()得到 Statement 对象
    • 通过prepareStatement(String sql)得到 PreparedStatement 对象(更安全,能防 SQL 注入)
  2. 管理事务:
    • setAutoCommit(boolean)开启事务
    • commit()提交事务
    • rollback()回滚事务

Statement 接口

是执行 SQL 语句的对象,主要功能:

  1. 执行 SQL:
    • executeQuery(String sql):执行查询语句,返回结果集
    • executeUpdate(String sql):执行增删改语句,返回影响行数
  2. 批处理操作:
    • addBatch(String sql):添加 SQL 到批处理
    • clearBatch():清空批处理
    • executeBatch():执行批处理

ResultSet 接口

封装了查询语句的结果,特点是:

  • 用表格形式存储查询结果
  • 内部有个游标,默认在第一行数据前
  • 调用next()方法移动游标,只能向下移动
  • 获取数据时,根据字段类型调用对应方法:
    • 整数类型用getInt(),字符串用getString()
    • 可以用字段索引(从 1 开始)或字段名获取,常用字段名方式
    • getObject()可获取任意类型,需要自己强转

资源释放

所有连接相关的对象必须释放,标准做法是:
在 finally 代码块中释放,确保一定会执行,例如:

java

if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}conn = null;
}

5.具体程序

向上提取的思想

package cn.qcby.demo1;import com.mysql.jdbc.Driver;import java.sql.*;/*** JDBC的入门程序* 需求:把数据库中所有的数据全部查询出来,显示到控制台*/
public class JdbcTest1 {public static void main(String[] args) {// 数据库连接Connection conn = null;// 能执行SQL语句的对象Statement stmt = null;// 查询数据,把数据封装到该结果集中,表格ResultSet rs = null;try {// 加载驱动类DriverManager.registerDriver(new Driver());//Class.forName("com.mysql.jdbc.Driver");// 获取到连接 1数据库连接地址(需要编写协议) 2用户名 3密码// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 获取到连接,localhost:3306可以省略不写的,访问本地mysql服务器conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root", "root");// 执行SQL语句// 编写SQL语句String sql = "select * from t_user";// 有能执行SQL语句的对象 Statement对象,能执行SQL语句   sql注入问题  不能stmt = conn.createStatement();//conn.prepareStatement()// 执行SQL语句,数据封装到结果集中rs = stmt.executeQuery(sql);// 遍历rs结果集while(rs.next()){// 获取到数据就OKint id = rs.getInt("id");String username = rs.getString("username");String password = rs.getString("password");String email = rs.getString("email");// 做打印System.out.println(id+"-"+username+"-"+password+"-"+email);}} catch (Exception e) {e.printStackTrace();}finally {// 总是会执行的,释放的顺序相反if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}
package cn.qcby.demo1;import com.mysql.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;/*** 演示增删改的操作*/
public class JdbcTest2 {public static void main(String[] args) {// 测试保存new JdbcTest2().testInsert();// 测试修改// new JdbcTest2().testUpdate();// 测试删除// new JdbcTest2().testDelete();}/*** 新增数据*/public void testInsert(){// 连接Connection conn = null;// 执行SQL语句Statement stmt = null;try {// 注册驱动// DriverManager.registerDriver(new Driver());// 注册驱动,切换一种写法,反射代码。加载com.mysql.jdbc.Driver类,只要该类一加载,static代码块就会执行(注册驱动)// 编写的是字符串,把com.mysql.jdbc.Driver编写到一个配置文件中去Class.forName("com.mysql.jdbc.Driver");// 获取链接conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");// 编写SQL语句String sql = "insert into t_user values (null,'fff','111','ddd@126.com')";// 获取到stmt对象stmt = conn.createStatement();// 执行SQL语句,执行增删改的操作stmt.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();}finally {// 释放资源if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}/*** 修改数据*/public void testUpdate(){// 连接Connection conn = null;// 执行SQL语句Statement stmt = null;try {// 注册驱动DriverManager.registerDriver(new Driver());// 获取链接conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");// 编写SQL语句String sql = "update t_user set username = 'eee' where id = 4";// 获取到stmt对象stmt = conn.createStatement();// 执行SQL语句,执行增删改的操作stmt.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();}finally {// 释放资源if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}/*** 删除数据*/public void testDelete(){// 连接Connection conn = null;// 执行SQL语句Statement stmt = null;try {// 注册驱动DriverManager.registerDriver(new Driver());// 获取链接conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","root");// 编写SQL语句String sql = "delete from t_user where id = 4";// 获取到stmt对象stmt = conn.createStatement();// 执行SQL语句,执行增删改的操作stmt.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();}finally {// 释放资源if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}

http://www.dtcms.com/a/349641.html

相关文章:

  • 基于TimeMixer的帕金森语音分类:WAV音频输入与训练全流程
  • 基于开源 AI 智能名片链动 2+1 模式 S2B2C 商城小程序的新开非连锁品牌店开业引流策略研究
  • 云计算之中间件与数据库
  • 蜂窝物联网模组在冷链运输行业的应用价值
  • 盲盒经济新风口:盲盒抽谷机小程序系统开发全解析
  • 审核问题——首次进入APP展示隐私政策弹窗
  • JavaWeb(八)EL表达式,JSTL标签
  • 阿里云短信验证码服务
  • 奔赴少年CIIU携专辑《我们的出发》正式出道 与J.Y. Park同台首秀备受关注
  • 基于SpringBoot的招聘管理系统【2026最新】
  • 【Linux基础知识系列】第一百一十篇 - 使用Nmap进行网络安全扫描
  • C# NX二次开发:绘图区控件和指定矢量控件详解
  • [MH22D3开发笔记]2. SPI,QSPI速度究竟能跑多快,双屏系统的理想选择
  • 基于WebTransport(底层QUIC)实现视频传输(HTML+JavaScript)
  • C语言基础:(二十五)预处理详解
  • 从0到1:用 Qwen3-Coder 和 高德MCP 助力数字文旅建造——国庆山西游
  • Rust面试题及详细答案120道(58-65)-- 集合类型
  • 解锁处暑健康生活
  • Docker:部署Nginx
  • week4-[一维数组]数码个数
  • Gemini 2.5 Flash-Lite 与 GPT-5-mini:高性能低成本模型,如何选择?
  • 链表OJ习题(1)
  • redis-缓存-持久化
  • 使用 Gemini CLI作为 Claude Code的 subagent
  • OC-MVC模式下的折叠cell
  • 利用 Python 爬虫获取 1688 商品详情 API 返回值说明(代码示例)实战指南
  • 爬虫基础学习-爬取网页项目
  • vue2使用WaveSurfer实现简易的音频播放
  • 波音787项目:AR技术重塑航空制造的数字化转型
  • 用MessageBus优化模块通信:实现订阅/发布模式