JDBC基本使用

news2024/11/15 1:50:04

文章目录

  • 一、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://www.coloradmin.cn/o/134768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java中线程安全问题及解决方法、线程状态、线程间通信(线程等待唤醒机制)

线程安全 概述&#xff1a; 多线程访问了共享数据&#xff0c;此时会产生冲突&#xff08;如&#xff1a;在多个线程中执行售卖货物的业务&#xff0c;要求是某个货被某个线程售卖后&#xff0c;其他线程应该不再可以售卖此个货&#xff0c;但是默认被某个线程售卖后&#xf…

JVM 教程

jvm教程jvm概述前言JVM 定义JVM 的作用查看自己的 JVMJVM&#xff0c;JRE 和 JDK 联系小结JVM 整体架构目标JVM 整体架构类加载子系统运行时数据区执行引擎小结JVM 常用参数配置IntelliJ IDEA 添加运行参数JVM 参数&#xff1a;跟踪垃圾回收JVM 参数&#xff1a;跟踪类的加载与…

手把手代码实现五级流水线CPU——第二篇:分支预测流水线

系列文章目录 第三篇&#xff1a;流水线控制逻辑 第一篇&#xff1a;初级顺序流水线 文章目录系列文章目录一、流水线硬件结构二、流水线各阶段的实现实现原理一、流水线硬件结构 取指阶段 PC增加器&#xff1a;用来计算下一条指令的地址valP 译码阶段 一次译码操作读出俩个寄…

学习vue的准备工作

一、前提&#xff1a; 1、vscode安装&#xff1a; https://blog.csdn.net/m0_55400356/article/details/1260267332、node.js安装&#xff1a; 已安装 16.0 或更高版本的 Node.js&#xff1b; https://www.runoob.com/nodejs/nodejs-install-setup.html3、安装vue&#xff…

hadoop之ranger权限配置(二)

文章目录一、编译ranger&#xff08;node12&#xff09;二、安装前环境准备&#xff08;node12&#xff09;三、安装RangerAdmin&#xff08;node12&#xff09;(root)五、Ranger Hive-plugin&#xff08;node10&#xff09;六、Ranger Hdfs-plugin&#xff08;node10、11&…

ansible远程控制及其相关操作

1.控制主机和受控主机通过root用户通过免密验证方式远程控住受控主机实施对应&#xff08;普通命令&#xff0c;特权命令&#xff09;任务&#xff08;以下所有结果均见截图&#xff09; (1)控住主机--server通过主机名匹配对应连接的受控主机 [rootserver ~]#vim /etc/hosts …

一本通 1267:【例9.11】01背包问题(详细代码+严谨思路+清晰图片)

经典01背包问题 这里给你3种方法 目录 DFS 思路&#xff1a; 代码&#xff1a; DFS记忆化 思路&#xff1a; 代码&#xff1a; 动态规划 思路&#xff1a; 代码&#xff1a; DFS 时间复杂度 &#xff1a;O(2^n) 思路&#xff1a; DFS求出所有选法&#xff0c;再用…

Git Stash、Git Merge、Git Rebase、Git Revert

GIT 日常使用总结git stashgit mergegit rebase将多个commit合并成一个commitgit revert撤销修改撤销commit 但是不撤销add 的内容撤销addGIT Rebase 补充说明&#xff1a;git stash git stash&#xff1a;将修改后的代码存储到本地的一个栈结构&#xff0c;将工作区和暂存区恢…

37-Vue之ECharts高级-交互API

交互API前言全局ECharts对象echartsInstance对象前言 本篇来学习下ECharts中交互API的使用 全局ECharts对象 全局 echarts 对象是引入 echarts.js 文件之后就可以直接使用的 init &#xff1a;初始化ECharts实例对象&#xff0c;使用主题 registerTheme&#xff1a;注册主题…

Avatar和虚拟场景如何影响用户VR社交行为

对于VR社交来讲&#xff0c;虚拟场景&#xff08;社交环境&#xff09;、Avatar&#xff08;虚拟化身&#xff09;是两个重要的元素&#xff0c;一个代表了人们在VR中互动的空间&#xff0c;而另一个则代表他们在这个空间中所扮演的角色。现阶段&#xff0c;Avatar有多种形态&a…

已解决import tensorflow.contrib.layers as layers导包错误

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘cudart64_110.dll’; dlerror: cudart64_110.dll not found I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not ha…

opencv-python常用函数解析及参数介绍(八)——轮廓与轮廓特征

轮廓与轮廓特征前言1.获取轮廓通过膨胀与腐蚀获得轮廓通过梯度获取轮廓通过边缘检测获取轮廓2.寻找轮廓参数及作用对比3.轮廓特征前言 在前面的文章中我们已经学会了使用膨胀与腐蚀、使用梯度、使用边缘检测的方式获得图像的轮廓&#xff0c;那么在获得轮廓后我们可以对图像进…

​赛分科技冲刺科创板上市:拟募资8亿元,复星、高瓴为股东​

近日&#xff0c;苏州赛分科技股份有限公司&#xff08;下称“赛分科技”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺上市&#xff0c;赛分科技计划募资8亿元&#xff0c;将用于20万升/年生物医药分离纯化用辅料、研发中心建设项目&#xf…

《收获,不止Oracle》读书笔记一

当今时代 技术人员&#xff0c;真正的差距其实在意识 1.忽略了知识的重点 20%的知识&#xff0c;解决80%的问题 2.从未考虑知识落地 知识要落地&#xff0c; 要思考应用的场合。 学习任何技术都是一样的&#xff0c;没有思考过你所学的某项技术有什么用&#xff0c;没有想…

P1827 [USACO3.4] 美国血统 American Heritage

题目描述 农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛 们的家谱作成二叉树&#xff0c;并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而 不是用图形的方法。 你的任务是在被给予奶牛家谱的“树中序遍历…

计算机网络 | 湖科大教书匠

一、因特网概述 1、网络、互联网和因特网 网络是由若干结点和连接这些结点的链路组成 多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;互联网 因此&#xff0c;互联网是网络的网络&#xff08;Network of Networks&#xff0…

hadoop+ranger+kerberos页面权限配置(四)

一、原理介绍 hdfs 指令测试&#xff1a;hdfs dfs -mkdir /ranger 原理&#xff1a;根据路径进行文件夹操作赋权。一旦指定文件夹权限&#xff0c;则该用户可以操作该文件夹及该文件夹底下的子文件夹。 yarn 指令测试&#xff1a;hadoop jar /home/hadoop/module/hadoop-3.2.2…

跨平台数据库管理器DbGate

本文软件由网友 zxc 推荐&#xff1b;隔了很久才开始写&#xff0c;又隔了很久才想起来发 &#x1f602; 什么是 DbGate &#xff1f; DbGate 是跨平台的数据库管理器。支持 MySQL、PostgreSQL、SQL Server、MongoDB、SQLite 等的数据库管理器。能够在 Windows、Linux、Mac 下运…

Z函数(扩展KMP)

1,定义 z函数存储字符串s(长度n&#xff0c;下标从0开始&#xff09;与其所有后缀s[i,n-1](0<i<n-1)的最大公共前缀LCP的值&#xff08;一般默认z[0]0,有时是n) 2,思路 叫他扩展KMP是有原因的&#xff0c;因为思想相近&#xff0c;我们求取z[i]&#xff0c;尝试利用前…

20230102单独编译原厂RK3588开发板的开发板rk3588-evb1-lp4-v10的Android12的内核

20230102单独编译原厂RK3588开发板的开发板rk3588-evb1-lp4-v10的Android12的内核 2023/1/2 20:52 《RK3588_Android12_SDK_Developer_Guide_CN.pdf》 原厂的开发板rk3588-evb1-lp4-v10单独编译内核的方式&#xff1a; cd kernel-5.10 export PATH../prebuilts/clang/host/linu…