学习内容
怎么在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加密连接 | false | useSSL=false |
| serverTimezone | 服务器时区 | 系统默认 | serverTimezone=Asia/Shanghai |
| useUnicode | 是否使用Unicode编码 | true | useUnicode=true |
| characterEncoding | 字符编码 | 无 | characterEncoding=utf8 |
| allowPublicKeyRetrieval | 是否允许获取公钥 | false | allowPublicKeyRetrieval=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);
- 1.写sql语句,用?代替所要传入的值:
- 代码演示
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() | ResultSet | SELECT查询语句 |
| 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编程中至关重要的一步,它负责释放数据库连接、语句对象和结果集等资源,防止内存泄漏和数据库连接耗尽。
资源关闭顺序
正确的关闭顺序(从里到外):
- ResultSet(结果集) ← 最先关闭
- Statement/PreparedStatement(语句对象) ← 其次
- 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嵌套