JDBC的两种实现方法及区别

2023-11-05

JDBC

一、JDBC简介

  • JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。
  • JDBC的作用:可以通过java代码操作数据库。

二、通过DriverManager实现JDBC

实现JDBC的步骤:

  1. 注册驱动
  2. 获取数据库的连接
  3. 准备sql语句
  4. 预编译sql语句
  5. 执行sql语句
  6. 释放资源

具体实现:

准备sql语句public static void main(String[] args) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取数据库的连接
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123");
        //准备sql语句
        String sql = "select * from websites where id=?";
        //预编译sql语句
        ps = conn.prepareStatement(sql);
        //这里是对sql语句中的?进行赋值,第几个?就写数字几
        int id = 5
        ps.setString(1, id);
        //执行sql语句
        //查询是返回一个数据集ResultSet
        //增加、删除、修改是返回一个int值,表示有几条数据发生改变
        rs = ps.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getString("name"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        //释放资源
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

注意:

  1. DriverManager

    • DriverManager:驱动管理对象
    • 实现方法:Class.forName(“com.mysql.jdbc.Driver”)和Class.forName(“com.mysql.cj.jdbc.Driver”)
    • com.mysql.jdbc.Driver 不支持mysql 8
  2. PreparedStatement和Statement

方法声明 作用
int executeUpdate(String sql) 可执行增,删,改,返回执行受到影响的行数
ResultSet executeQuery(String sql) 执行SQL查询,并返回ResultSet对象
//使用Statement
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "select * from websites";

rs = statement.executeQuery(sql);

while(rs.next()){
    String name = rs.getString("name");
    System.out.println(name);
}

image-20230320094547951

通过源代码我们可以看到PreparedStatement继承了Statement,我们在JDBC中也可以Statement,推荐使用 PreparedStatement。

原因:Statement直接执行sql语句,PreparedStatement先预编译sql语句,后面添加字段后再具体执行,有效防止sql注入的发生。

​ 3. ?占位符

在这里插入图片描述

三、通过DataSource实现JDBC

public static void main(String[] args) throws SQLException {
    //1.创建数据源
    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false");
    dataSource.setUser("root");
    dataSource.setPassword("123");
    //2.建立连接
    Connection connection = dataSource.getConnection();

    //3.sql语句
    String sql = "select * from websites where id=?";
    //PreparedStatement预编译sql语句,同时还能设置数据
    PreparedStatement ps = connection.prepareStatement(sql);
    int id = 5
    ps.setString(1, id);
    //4.执行sql语句
    ResultSet ret = ps.executeQuery();
    while (ret.next()){
        int id = ret.getInt("id");
        String name = ret.getString("name");
        System.out.println("id="+id+" name="+name);
    }

    //5.释放资源
    ret.close();
    ps.close();
    connection.close();
}

四、DataSource和DriverManager的区别

1.获取的对象不同。DataSource主要是获取数据库连接池,而DriverManager主要是获取数据库连接,通过管理JDBC驱动程序来建立连接。

2.DataSource中封装了DriverManager的使用。

3.DataSource创建的connection可以被复用,而DriverManager的则不行。

至于为什么要推荐使用DataSource进行数据池的连接,这主要是因为使用DriverManager.getConnection()耗费内存和时间,实用性低且这种方式获取的connection需要手动关闭,不然会大量的占用内存。如果你对数据库的操作很频繁,显然这种方式费力不讨好。而数据库连接池(DataSource)主要负责创建、管理和分配数据库连接。初始化数据库连接池时,会创建一定数量的数据库连接对象,并存放于数据库连接池中。当请求连接数据库时,连接池会分配处于空闲状态的连接;数据库连接不被使用时,会被连接池回收,并设置为空闲状态;当连接空闲时间大于在初始化连接池设定的连接空闲时间,连接池释放该连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC的两种实现方法及区别 的相关文章

  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要

随机推荐

  • Mybatis映射文件中动态sql语句

    目录 Mybatis映射文件深入 动态sql语句 官方文档中动态sql 动态SQL之if 测试示例if 动态sql之foreach 测试示例foreach sql片段的抽取 Mybatis映射文件深入知识小结 Mybatis映射文件深入 动
  • 分段,分页与段页式存储管理

    一 分页存储管理 1 基本思想 用户程序的地址空间被划分成若干固定大小的区域 称为 页 相应地 内存空间分成若干个物理块 页和块的大小相等 可将用户程序的任一页放在内存的任一块中 实现了离散分配 1 等分内存 页式存储管理将内存空间划分成等
  • Go 定时器(timer)

    创建一个定时器 package main import fmt time func main timer time NewTimer time Second 3 3秒定时器 fmt Printf timertype timer fmt Pr
  • Mysql 8配置驱动

    1 依赖的注入 spring datasource url jdbc mysql localhost 3306 你的数据库名 useUnicode true characterEncoding utf 8 serverTimezone As
  • SpringBoot中的注解@SpringBootApplication和(@Configuration......)

    以下选自官方的文档 这里写链接内容 Many Spring Boot developers always have their main class annotated with Configuration EnableAutoConfig
  • Ping报文分析

    打开Windows虚拟 执行ipconfig的操作 用Kali执行Ping操作 并用Kali自带wireshark分析 可以看到Ping报文发送的是ICMP数据报文 通过网上查阅资料可知 ICMP报头格式 ICMP报文包含在IP数据报中 I
  • yolov5使用

    参考网址 https zhuanlan zhihu com p 501798155 源码下载及使用 release下载source及pt文件 yolov5s pt https github com ultralytics yolov5 ta
  • c# 连接Oracle数据库必须安装客户端吗

    以下方案在oracle9 10上测试通过 其他版本恕不一一测试 复制以下几个文件 从oracle xe 10g中提取的 到应用程序根目录即可 若有使用tns 请再建立tnsnames ora文件 oci dll ociw32 dll ora
  • 【Excel VBA】得到最后数据的行数

    纲举目张 得到最后数据的行数 说明 代码 code 解析 拓展 得到最后数据的行数 说明 在编写代码时我们时常用到的是 取得数据表的最后一行数据所在的行号 这样在编写循环语句时就不用猜着自定义终止值 代码 code Dim FinalRow
  • Vue 的实用开发技巧

    文章目录 v for 中使用 key 何时使用何种key 所以使用 index 作为 key 需要满足 哪何时使用 id 作为 key 呢 v if v else if v else 中使用 key 使用条件 例子 v for 和 v if
  • 共享DLL中使用MFC 和在静态库中使用MFC

    使用VS2008 在项目属性中有一项MFC的使用 有三种设置 1 使用标准Windows库 2 在共享DLL中使用MFC 3 在静态库中使用MFC 第一种顾名思义 第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中 所以EX
  • 树莓派4B 安装preem-PT 实时系统那些坑

    拿到一个树莓派之后 最好uname a 看一下内核版本号 比如同样的树莓派4B 不同出厂批次和时间 是有一定改动的 比如有些是4 14 4 19 而有些是5 4 5 15 等 较新的树莓派如果向下刷固件 比如用树莓派最新的4B 刷ubunt
  • ZooKeeper集群环境搭建

    大数据学习记录篇 持续更新中 个人主页 beixi 本文章收录于专栏 点击传送 大数据学习 持续更新中 感谢各位前辈朋友们支持学习 文章目录 1 ZooKeeper集群环境介绍 2 搭建环境准备 3 搭建步骤 1 ZooKeeper集群环境
  • 网络安全事件应急响应实战

    一 应急响应 1 Window入侵排查 当企业发生黑客入侵 系统崩溃或其它影响业务正常运行的安全事件时 急需第一时间进行处理 使企业的网络信息系统在最短时间内恢复正常工作 进一步查找入侵来源 还原入侵事故过程 同时给出解决方案与防范措施 为
  • hyper-v开启与关闭

    1 控制面板 2 服务 以管理员身份运行msconfig 3 cmd命令 以管理员运行 开启 上次关闭docker服务时 重新启动虚拟化技术执行了上面个两个步骤 未执行下面命令 检查了好久查了网上的资料才想起来 bcdedit set hy
  • java 遍历map 方法 集合 五种的方法

    package com jackey topic import java util ArrayList import java util HashMap import java util Iterator import java util
  • git如何克隆代码

    首先你要去官网安装 Git Downloads 下载好了一直下一步就行 找到一个装文件的文件夹右击 点击git bash here 然后 git clone 加上git上的网址 回车就可以下载了 希望有帮助到你
  • crm服务器 系统盘,crm搭建云服务器

    crm搭建云服务器 内容精选 换一换 购买多台云服务器时 有以下两种方式设置有序的云服务器名称 自动排序 购买多台云服务器时自动按序增加4位数字后缀 正则排序 按照name prefix begin number bits name suf
  • Windows系统缺失crypt32.dll文件导致程序无法运行解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个crypt32
  • JDBC的两种实现方法及区别

    文章目录 toc JDBC 一 JDBC简介 二 通过DriverManager实现JDBC 三 通过DataSource实现JDBC 四 DataSource和DriverManager的区别 JDBC 一 JDBC简介 JDBC Jav