JDBC基本使用

article/2025/8/24 3:27:08

文章目录

  • 一、JDBC技术
    • 1.1、JDBC概念
    • 1.2、JDBC作用
    • 1.3、JDBC工作原理
    • 1.4、JDBC工作流程
  • 二、使用JDBC访问数据库
    • 2.1、创建Maven项目
    • 2.2、添加数据库依赖
      • 2.2.1、mysql依赖
      • 2.2.2、oracle依赖
    • 2.3、编写代码
      • 2.3.1、加载驱动
      • 2.3.2、通过DriverManager获取connection连接
      • 2.3.3、执行SQL语句
      • 2.3.4、获取执行返回值
      • 2.3.5、释放资源
  • 三、使用JDBC访问数据库代码
    • 3.1、增
    • 3.2、删
    • 3.3、改
    • 3.4、查
  • 四、Statement与PreparedStatement
    • 4.1、两者之间的关系:
    • 4.2、两者之间的区别:
      • 4.2.1、statement使用
    • 4.3、Statement执行容易出现情况(SQL注入)

一、JDBC技术

1.1、JDBC概念

JDBC(Java DataBase Connectivity)是一种Java数据库连接技术,能实现Java程序对各种数据库的访问。由一组使用Java语言编写的类和接口组成,这些类和接口称为JDBC API,它们位于java.sql以及javax.sql包中。

1.2、JDBC作用

  • 建立与数据库之间的访问连接。
  • 将编写好的SQL语句发送到数据库执行。
  • 对数据库返回的结果进行处理。

1.3、JDBC工作原理

在这里插入图片描述

  • JDBC API 定义了一系列的接口和类,集成在java.sql和javax.sql包中
  • DriverManager 管理各种不同的JDBC驱动
  • JDBC驱动 负责连接不同类型的数据库

1.4、JDBC工作流程

在这里插入图片描述

二、使用JDBC访问数据库

2.1、创建Maven项目

在这里插入图片描述

2.2、添加数据库依赖

2.2.1、mysql依赖

	<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency>

2.2.2、oracle依赖

    <dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.4</version></dependency>

2.3、编写代码

2.3.1、加载驱动

// mysql驱动
Class.forName("com.mysql.jdbc.Driver");// oracle驱动
Class.forName("oracle.jdbc.driver.OracleDriver");

2.3.2、通过DriverManager获取connection连接

mysql

  • mysql路径 jdbc:mysql://mysql地址:端口/数据库名
  • mysql默认端口为3306

oracle

  • oracle路径 jdbc:oracle:thin:@oracle地址:端口:数据库实例名
  • oracle默认端口为1521
//参数(路径,用户名,密码)
// mysql
connection = DriverManager.getConnection("jdbc:mysql://192.168.136.204:3306/jdbcdb", "root", "root");// oracle
connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.136.52:1521:prod", "taibai", "fei");

2.3.3、执行SQL语句

创建PreparedStatement实例执行sql语句

String sql = "insert into dog (name,health,love,strain,lytm) values (?,?,?,?,now())";
String name = "小黑子";
Integer health = 100;
Integer love = 68;
String strain = "泰迪";
Date lytm = new Date(System.currentTimeMillis());
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,name);
preparedStatement.setInt(2,health);
preparedStatement.setInt(3,love);
preparedStatement.setString(4,strain);
//            preparedStatement.setDate(5,lytm);

2.3.4、获取执行返回值

 int result = preparedStatement.executeUpdate();
if (result > 0){System.out.println("新增"+name+"成功");
}

2.3.5、释放资源

preparedStatement.close();
connection.close();

三、使用JDBC访问数据库代码

3.1、增

package org.example.ceshi;import java.sql.*;/*** @program: jdbcstu* @interfaceName Dog* @description:* @author: 太白* @create: 2023-01-02 14:39**/
public class Dog {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection("jdbc:mysql://192.168.136.204:3306/jdbcdb", "root", "root");//            增String sql = "insert into dog(name,health,love,strain,lytm) value (?,?,?,?,now())";String name = "可鲁可";Integer health = 99;Integer love = 100;String strain = "哈士奇";preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1,name);preparedStatement.setInt(2,health);preparedStatement.setInt(3,love);preparedStatement.setString(4,strain);int insert = preparedStatement.executeUpdate();if (insert > 0) {System.out.println("添加狗狗"+name+"成功");}} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (SQLException e) {throw new RuntimeException(e);} finally {try {if (connection != null){connection.close();}if (preparedStatement != null){preparedStatement.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}
}

3.2、删

package org.example.ceshi;import java.sql.*;/*** @program: jdbcstu* @interfaceName Dog* @description:* @author: 太白* @create: 2023-01-02 14:39**/
public class Dog {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection("jdbc:mysql://192.168.136.204:3306/jdbcdb", "root", "root");//            删String sql = "delete from dog where id = ?";Integer id = 8;preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,id);int delete = preparedStatement.executeUpdate();if (delete > 0){System.out.println("删除id为"+id+"成功");}} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (SQLException e) {throw new RuntimeException(e);} finally {try {if (connection != null){connection.close();}if (preparedStatement != null){preparedStatement.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}
}

3.3、改

package org.example.ceshi;import java.sql.*;/*** @program: jdbcstu* @interfaceName Dog* @description:* @author: 太白* @create: 2023-01-02 14:39**/
public class Dog {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection("jdbc:mysql://192.168.136.204:3306/jdbcdb", "root", "root");//            改String sql = "update dog set name=?,health=?,love=?,strain=? where id=?";String name = "阿黄";Integer health = 89;Integer love = 99;String strain = "柴犬";Integer id = 7;preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1,name);preparedStatement.setInt(2,health);preparedStatement.setInt(3,love);preparedStatement.setString(4,strain);preparedStatement.setInt(5,id);int update = preparedStatement.executeUpdate();if (update > 0){System.out.println("修改id为"+id+"成功");}} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (SQLException e) {throw new RuntimeException(e);} finally {try {if (connection != null){connection.close();}if (preparedStatement != null){preparedStatement.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}
}

3.4、查

package org.example.ceshi;import java.sql.*;/*** @program: jdbcstu* @interfaceName Dog* @description:* @author: 太白* @create: 2023-01-02 14:39**/
public class Dog {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.jdbc.Driver");connection = DriverManager.getConnection("jdbc:mysql://192.168.136.204:3306/jdbcdb", "root", "root");//            查String sql = "select id,name,health,love,strain,lytm from dog";preparedStatement = connection.prepareStatement(sql);resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.print(resultSet.getInt("id"));System.out.print(resultSet.getString("name"));System.out.print(resultSet.getInt("health"));System.out.print(resultSet.getInt("love"));System.out.print(resultSet.getString("strain"));System.out.println(resultSet.getDate("lytm"));}} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (SQLException e) {throw new RuntimeException(e);} finally {try {if (connection != null){connection.close();}if (preparedStatement != null){preparedStatement.close();}if (resultSet!=null){resultSet.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}
}

四、Statement与PreparedStatement

4.1、两者之间的关系:

preparedstatement和statement两者都是用来执行sql查询语句的API之一。
preparedstatement接口继承了statement接口。

4.2、两者之间的区别:

statement不对sql语句做处理,直接交给数据库;而prepraedstatement是支持预编译的,会将编译好的sql语句放在数据库端,相当于缓存,对于多次重复执行的sql语句,使用prepraedstatement可以使得代码的执行效率更高。
使用statement对象,在数据库只执行一次存取的时候,用statement对象进行处理,prepraedstatement对象的开销对statement大,对于一次性操作并不会带来额外的好处。
执行许多sql语句的JDBC程序产生大量的statement和preparedstatement对象,通常以为preparedstatement比statement对象更有效。
statement的sql语句使用字符串拼接的方式,非常容易导致出错,且存在sql注入的风险,preparedstatement使用“?”占位符,提升了代码的可读性和可维护性,并且这种绑定参数的方式可以有效地防止sql注入。

4.2.1、statement使用

在statement.execute的方法官方解释为:

执行给定的SQL语句,该语句可能返回多个结果。在某些(不常见的)情况下,一条SQL语句可能返回多个结果集和/或更新计数。通常你可以忽略它,除非你(1)执行一个你知道可能返回多个结果的存储过程,或者(2)动态执行一个未知的SQL字符串。 execute方法执行一条SQL语句并指示第一个结果的形式。然后必须使用getResultSet或getUpdateCount方法检索结果,并使用getMoreResults方法移动到任何后续结果。 注意:该方法不能在PreparedStatement或CallableStatement上调用。 形参: sql -任何sql语句 返回值: 如果第一个结果是ResultSet对象,则为true;如果是更新计数或没有结果,则为False

			String name = "可鲁可";Integer health = 99;Integer love = 100;String strain = "哈士奇";String sql = "insert into dog (name,health,love,strain,lytm) values ('"+name+"','"+health+"','"+love+"','"+strain+"',now())";statement =  connection.createStatement();statement.execute(sql);

4.3、Statement执行容易出现情况(SQL注入)

在此处这些变量都应该为页面传值,可能会传值为:

String name = “; drop database jdbc; drop table dog;”;

那么执行的sql语句就会是:

insert into dog (name,health,love,strain,lytm)
values (“; drop database jdbc; drop table dog;”,99,100,“哈士奇”,now());

那么在数据库中上述SQL语句执行顺序为:

  • 由于insert into dog (name,health,love,strain,lytm) values ("; 语句报错
  • 会执行下一条语句:drop database jdbc;
  • 再下一条语句:drop table dog;
  • 最后:",99,100,“哈士奇”,now()); 这条也会报错

这样的执行就会导致数据库与表皆都被删除。

上述过程就为SQL注入。


http://chatgpt.dhexx.cn/article/7NwUAC7Q.shtml

相关文章

JDBC快速入门,如何使用JDBC操作数据库?

文章目录 1. 前言2. JDBC 概述2.1 概念2.2 优点3. JDBC 快速入门Java编程基础教程系列1. 前言 在 Java 开发中,使用 Java 语言操作数据库是非常重要的一部分,那么 Java 语言是如何操作数据库的呢?我们需要使用不同厂商的数据库时,例如 MySQL,Oracle 等,显然一套 Java 代…

JDBC操作数据库

数据库驱动 10、JDBC 10.1、数据库驱动 驱动&#xff1a;声卡&#xff0c;显卡&#xff0c;数据库 10.2、JDBC 10.3、第一个JDBC程序 创建测试数据库 1、创建一个普通项目 CREATE DATABASE jdbcstudyCREATE TABLE users ( id INT (4) PRIMARY KEY, name VARCHAR(40), pass…

JDBC中com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别

最近重装了系统&#xff0c;随后在官网下载了最新版本的MySQL8.0.13和相应的mysql-connector-java-8.0.13&#xff0c;运行程序时出现好几种错误。 之前的代码是这样的&#xff1a; driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql:///db1?useUnicodetrue&characte…

JDBC概述

目录 一、JDBC概述二、JDBC搭建三、 PreparedStatement和Statement四、结果集处理 一、JDBC概述 1、JDBC&#xff08;Java DataBase Connectivity&#xff09;java 数据库连接 2、是一种用于执行SQL语句的java API &#xff0c;可以为多种关系型数据库提供统一访问&#xff0c…

JDBC使用教程详解

文章目录 一、前言二、JDBC概述2.1 JDBC定义2.2 JDBC接口调用方和实现方JDBC接口调用方JDBC接口实现方 2.3 连接数据库驱动2.5 JDBC原理 三、JDBC编程url3.1URL3.3 SQL的分类 四、JDBC编程六步曲4.1 第一步&#xff1a;注册驱动4.2 第二步&#xff1a;获取数据库连接4.3 第三步…

【MySQL】JDBC编程

目录 1、什么是JDBC&#xff1f; 2、导入 jar 包 3、JDBC 的使用 4、总结 1、什么是JDBC&#xff1f; 实际开发中&#xff0c;SQL 是很少手动输入的&#xff0c;绝大多数的 SQL 都是通过代码&#xff0c;自动执行的&#xff0c;这个时候就需要让其他编程语言来操作数据库了…

MySQL JDBC编程

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;MySQL &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 文章目录 前置知识API JDBC的使用安装数据库代码插入操作查找操作 前置知识 API API(Application Program Interface)被定义为应用…

JDBC编程

目录 什么是 JDBC&#xff1f; JDBC 架构 常见的 JDBC 组件 分析Java连接MySQL的五种方式 方式一&#xff1a;将用户名和密码封装在Properties类中 方式二&#xff1a;在方式一的基础上&#xff0c;利用反射实现驱动 方式三&#xff1a;使用DriverManger替代driver进行统…

java——jdbc编程

文章目录 JDBC的概念JDBC的常用APIJDBC示例代码PreparedStatementCallableStatement JDBC&#xff08;Java Database Connectivity&#xff09;是Java的一种数据库访问标准&#xff0c;它提供了一套API&#xff0c;使得我们可以通过Java程序来访问和操作各种关系型数据库。 下面…

JDBC是什么

JDBC介绍 JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 &#xff0c;它是一种用于数据库访问的应用程序 API &#xff0c;由一组用Java语言编写的类和接口组成&#xff0c;有了JDBC就可以 用统一的语法对多种关系数据库进行访问&#xff0c;而不用担心其数据库操作…

如何使用JDBC操作数据库?一文带你吃透JDBC规范

文章目录 1. 前言2. JDBC 概述2.1 概念2.2 优点 3. JDBC 快速入门4. JDBC API详解4.1 DriverManager4.1.1 注册驱动4.1.2 获取连接 4.2 Connection4.2.1 获取执行sql的对象4.2.2 事务管理 4.3 Statement4.4 ResultSet4.5 PreparedStatement4.5.1 sql注入问题4.5.2 preparedStat…

JDBC详解

1.JDBC是什么&#xff1f; Java DataBase Connectivity&#xff08;Java语言连接数据库&#xff09; 2.JDBC的本质是什么&#xff1f; JDBC是SUN公司制定的一套接口&#xff08;interface&#xff09; java.sql.*;&#xff08;这个软件包下有很多接口&#xff09; 接口都有…

JDBC简介

文章目录 一、JDBC简介二、JDBC执行步骤三、执行步骤中类的简介1、DriverManager类2.Connection类3、ResultSet类 一、JDBC简介 1.什么是jdbc JDBC全称&#xff1a;java database connectivity&#xff0c;简称jdbc&#xff0c; 翻译就是 Java 数据库连接。 2.jdbc有什么作用…

JDBC详细介绍

jdbc的概念 JDBC&#xff08;Java DataBase Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系型数据库提供统一访问&#xff0c;它是由一组用Java语言编写的类和接口组成的。 2.jdbc的作用 JDBC为Java程序操作不同的数据库提…

JDBC详细全解(示例超多)

文章目录 JDBCJDBC的概念1.jdbc的概念2.jdbc的本质 JDBC快速入门JDBC功能详解1、DriverManager驱动管理对象2、Connection数据库连接对象3、Statement执行sql语句的对象4、ResultSet结果集对象 JDBC案例案例需求数据准备1、数据库数据准备2、创建student类 功能实现1、查询所有…

JDBC介绍

1 JDBC简介 概念&#xff1a;JDBC(Java DataBase Connectivity) &#xff1a;Java数据库连接技术&#xff1a;具体讲就是通过Java连接广泛的数据库&#xff0c;并对表中数据执行增、删、改、查等操作的技术。如图所示&#xff1a; 此前我们学习过SQL后&#xff0c;可以通过 Na…

JDBC 连接 MySQL

哈喽~大家好&#xff0c;这次我们来看看 JDBC 如何 连接 MySQL. 目录 一、开头 二、介绍 1、JDBC 的概念 2、JDBC 的功能 3、JDBC 的常用接口和类 三、数据库的创建&#xff08;MySQL&#xff09; 1、连接 MySQL (1)、注册驱动 (2)、获取连接 (3)、获取执行者连接 …

BindingNavigator 类 - MSDN

.NET Framework 2.0 其他版本 5&#xff08;共 9&#xff09;对本文的评价是有帮助 - 评价此主题 注意&#xff1a;此类在 .NET Framework 2.0 版中是新增的。 表示窗体上绑定到数据的控件的导航和操作用户界面 (UI)。 命名空间:System.Windows.Forms 程序集:System.Windows.Fo…

Android的一个BindView工具的实现

对于Android已经有很多Bind View的工具了&#xff0c;大多都是使用了反射和注解的方法。那么如何实现一个简易的代码生成工具呢&#xff1f;其实不难&#xff0c;只要会写代码都可以试试。这些天&#xff0c;我试了一下&#xff0c;并将它做成了工具。代码如下&#xff1a; pa…

setNavigationBarTitle

wx.setNavigationBarTitle就是用来改红框框里面的内容滴 在项目开发中经常用到 使用的场景就包括了多个地方用同一套页面的时候 wx.setNavigationBarTitle({title: "我的店铺",});