Java笔试面试题AI答之JDBC(3)

news2024/11/15 15:50:43

文章目录

  • 13. 编写JDBC连Oracle的程序?
  • 14. 简述JDBC的主要组件有哪些 ?
  • 15. JDBC中如何防止SQL注入攻击?
      • 1. 使用预处理语句(PreparedStatement)
      • 2. 避免在SQL查询中直接拼接用户输入的数据
      • 总结
  • 16. JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?
      • 脏读(Dirty Read)
      • 哪种数据库隔离级别能防止脏读?
  • 17. 简述JDBC execute,executeQuery,executeUpdate的区别 ?
      • 1. executeQuery(String sql)
      • 2. executeUpdate(String sql)
      • 3. execute(String sql)
      • 总结
  • 18. 编写JDBC - SQL查询出来的结果分页展示 ?
      • 1. 准备JDBC连接
      • 2. 实现分页查询
      • 3. 调用分页查询方法
      • 注意事项

13. 编写JDBC连Oracle的程序?

要使用JDBC(Java Database Connectivity)连接到Oracle数据库,你需要首先确保你的开发环境中已经包含了Oracle JDBC驱动(通常是ojdbc.jar文件)。然后,你可以按照以下步骤编写一个基本的JDBC程序来连接Oracle数据库并执行简单的SQL查询。

以下是一个简单的示例,展示如何连接到Oracle数据库,并执行一个查询来获取一些数据:

  1. 添加JDBC驱动到你的项目

    • 如果你在使用IDE(如IntelliJ IDEA, Eclipse等),可以通过项目的库管理功能添加ojdbc.jar文件。
    • 或者,如果你在使用构建工具(如Maven或Gradle),可以添加相应的依赖项(但注意,Oracle JDBC驱动可能不在公共Maven仓库中,你可能需要手动下载并添加到项目中)。
  2. 编写JDBC程序

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class OracleJDBCExample {
    public static void main(String[] args) {
        // 数据库URL,包含协议、数据库IP、端口号、数据库名称
        String url = "jdbc:oracle:thin:@localhost:1521:XE"; // XE是Oracle Express Edition的默认SID
        // Oracle数据库的用户名和密码
        String user = "system";
        String password = "your_password";

        try {
            // 加载Oracle JDBC驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");

            // 获取数据库连接
            Connection conn = DriverManager.getConnection(url, user, password);

            // 创建Statement对象
            Statement stmt = conn.createStatement();

            // 执行SQL查询
            String sql = "SELECT * FROM your_table_name"; // 替换your_table_name为你的表名
            ResultSet rs = stmt.executeQuery(sql);

            // 处理查询结果
            while (rs.next()) {
                // 假设表有两列,分别名为column1和column2
                int id = rs.getInt("column1");
                String name = rs.getString("column2");
                System.out.println("ID: " + id + ", Name: " + name);
            }

            // 关闭资源
            rs.close();
            stmt.close();
            conn.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意

  • 你需要将jdbc:oracle:thin:@localhost:1521:XE中的localhost1521XE替换为你的Oracle数据库的实际地址、端口号和SID(或ServiceName)。
  • systemyour_password应替换为你的Oracle数据库的实际用户名和密码。
  • 确保Oracle数据库正在运行,并且可以从你的Java应用程序访问。
  • 你需要替换your_table_name以及对应的列名(column1column2)以匹配你的数据库表结构。
  • 处理JDBC连接时,不要忘记处理可能抛出的异常,并且在最后关闭ResultSet、Statement和Connection资源,以避免资源泄露。

以上就是使用JDBC连接Oracle数据库并执行简单查询的基本步骤。

14. 简述JDBC的主要组件有哪些 ?

JDBC(Java Database Connectivity)是一个Java API,用于执行SQL语句,并访问存储在数据库中的数据。JDBC为Java应用程序提供了一套完整的接口来连接数据库,发送SQL语句,并处理结果。JDBC的主要组件包括以下几个方面:

  1. JDBC API

    • 这是一组Java类和接口,它们定义了在Java应用程序中如何连接到数据库、发送SQL语句、处理结果以及关闭数据库连接的标准方法。JDBC API主要由java.sql包提供,包括用于数据库连接(Connection)、执行SQL语句(Statement, PreparedStatement, CallableStatement)、处理结果集(ResultSet)、管理元数据(DatabaseMetaData, ResultSetMetaData)等的类和接口。
  2. JDBC Driver(JDBC驱动程序):

    • JDBC驱动程序是实现JDBC API的类库,它负责将JDBC调用转换为特定数据库系统能理解的协议。JDBC驱动程序有四种类型:JDBC-ODBC桥接器、本地API部分Java驱动程序、纯Java网络协议JDBC驱动程序(中间层驱动程序)和纯Java数据库JDBC驱动程序(直接驱动程序)。
  3. JDBC URL

    • JDBC URL(统一资源定位符)用于标识数据库的位置和如何连接到数据库。它包含了数据库的位置、数据库的名称以及连接数据库所需的其他参数(如用户名和密码)。JDBC URL的格式依赖于所使用的JDBC驱动程序。
  4. Connection

    • Connection接口代表与特定数据库的连接。它提供了创建StatementPreparedStatementCallableStatement对象的方法,以及控制事务边界(例如,提交和回滚)的方法。
  5. Statement

    • Statement接口用于执行静态SQL语句并返回它所产生结果的对象。它提供了执行SQL语句(executeQuery用于返回结果集的SQL查询,executeUpdate用于更新数据的SQL语句,如INSERT、UPDATE或DELETE)的方法。
  6. PreparedStatement

    • PreparedStatement接口继承自Statement接口,它表示预编译的SQL语句。与Statement相比,PreparedStatement对象可以具有不同的SQL语句,但它允许数据库预编译这些语句,从而提高性能,并防止SQL注入攻击。
  7. ResultSet

    • ResultSet接口表示数据库查询的结果集,它封装了从数据库表中检索的数据。ResultSet对象具有指向其当前行的光标,并提供了遍历其数据、检索列值以及更新行中列值的方法。
  8. SQLException

    • SQLException是处理数据库操作时可能抛出的异常类型。它是所有JDBC异常的超类,用于表示在数据库访问过程中发生的错误。

这些组件共同构成了JDBC的核心,使得Java应用程序能够以一种统一和标准化的方式访问各种数据库系统。

15. JDBC中如何防止SQL注入攻击?

在JDBC(Java Database Connectivity)中防止SQL注入攻击主要依赖于两个策略:使用预处理语句(PreparedStatement)和避免在SQL查询中直接拼接用户输入的数据。下面详细介绍这两个策略:

1. 使用预处理语句(PreparedStatement)

预处理语句是防止SQL注入的首选方法。PreparedStatement对象允许你发送参数化SQL语句到数据库,而不必将用户输入数据直接拼接到SQL语句中。这样,数据库就会知道哪些部分是SQL语句本身,哪些部分是参数值,从而避免了SQL注入的风险。

示例代码

String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
try (Connection conn = DriverManager.getConnection(url, username, password);
     PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setString(1, userInputUsername);
    pstmt.setString(2, userInputPassword);
    
    ResultSet rs = pstmt.executeQuery();
    while (rs.next()) {
        // 处理结果集
    }
} catch (SQLException e) {
    e.printStackTrace();
}

在这个例子中,?是参数占位符,它们将在执行前被setString方法提供的实际值替换。

2. 避免在SQL查询中直接拼接用户输入的数据

如果你不使用PreparedStatement,而是选择构建动态SQL语句,那么你需要非常小心地处理用户输入,避免SQL注入。这通常涉及到对用户输入进行严格的验证和清理,但这并不是一个可靠的防御措施,因为总有可能遗漏某些攻击模式。

不推荐的做法(仅为说明问题,不应在生产代码中这样做):

String userInput = "someUser; DROP TABLE users;";
String sql = "SELECT * FROM users WHERE username = '" + userInput + "'";
// 这里存在SQL注入的风险

总结

  • 始终使用PreparedStatement:这是防止SQL注入的最有效方法。
  • 避免在SQL语句中直接拼接用户输入:这种做法极易受到SQL注入攻击。
  • 验证和清理用户输入:虽然不是防止SQL注入的主要手段,但在处理用户输入时仍应进行基本的验证和清理,以防止其他类型的攻击或错误。

通过使用预处理语句,你可以大大减少应用程序中SQL注入的风险,同时保持代码的清晰和可维护性。

16. JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?

JDBC(Java Database Connectivity)是Java语言中用于执行SQL语句的API,它允许Java应用程序连接到数据库,并执行查询或更新操作。在数据库操作中,尤其是涉及到多个事务时,会出现一些并发问题,如脏读(Dirty Read)、不可重复读(Non-Repeatable Read)和幻读(Phantom Read)。

脏读(Dirty Read)

脏读是指一个事务读取到了另一个事务未提交的数据。这通常发生在两个事务并发执行时,其中一个事务修改了数据但尚未提交,而另一个事务却读取了这些尚未提交的数据。如果第一个事务回滚(撤销其更改),则第二个事务读取的数据将是不一致的或“脏”的。

哪种数据库隔离级别能防止脏读?

数据库事务的隔离级别决定了事务可能受并发操作影响的程度。SQL标准定义了四个隔离级别,从低到高依次为:

  1. READ UNCOMMITTED(读未提交):最低级别,允许脏读,即一个事务可能读取到另一个事务未提交的数据。
  2. READ COMMITTED(读已提交):保证一个事务不会读取到另一个事务未提交的数据,从而避免了脏读。但是,它不能保证一个事务重新读取它之前读取过的数据时,数据不会发生变化(即可能遇到不可重复读)。
  3. REPEATABLE READ(可重复读):保证在同一个事务中多次读取同一数据的结果是一致的,从而避免了脏读和不可重复读。但是,它仍然可能遇到幻读(即当事务重新执行一个查询时,可能会看到之前不存在的额外记录)。
  4. SERIALIZABLE(可串行化):最高的隔离级别,它通过强制事务串行执行,来避免脏读、不可重复读和幻读。但是,这会严重影响性能,因为它实际上是通过锁定表或行来阻止其他事务插入、更新或删除同一表中的数据。

因此,能够防止脏读的最低数据库隔离级别是READ COMMITTED。在这个级别下,一个事务只能读取到已经被其他事务提交的数据,从而避免了脏读的问题。

17. 简述JDBC execute,executeQuery,executeUpdate的区别 ?

JDBC(Java Database Connectivity)是Java编程语言中用于执行SQL语句的一套API,它允许Java程序与数据库进行交互。在JDBC中,executeexecuteQueryexecuteUpdateStatement接口中用于执行SQL语句的三个重要方法,它们各自有不同的用途和返回值。

1. executeQuery(String sql)

  • 用途:用于执行返回单个ResultSet对象的SQL语句,通常是SELECT语句。
  • 返回值:返回一个ResultSet对象,该对象包含SQL查询的结果。如果查询不返回任何结果,则返回的ResultSet对象将为空。
  • 注意:如果执行的SQL语句不是SELECT语句,那么executeQuery方法将抛出SQLException

2. executeUpdate(String sql)

  • 用途:用于执行INSERT、UPDATE、DELETE或DDL(数据定义语言)语句,如CREATE TABLE、DROP TABLE等,这些语句不返回结果集。
  • 返回值:返回一个整数,表示受影响的行数(即,由于执行该语句而更新、插入或删除的行数)。对于不返回任何行数的SQL语句,返回0。
  • 注意:如果执行的SQL语句是SELECT语句,那么executeUpdate方法将抛出SQLException

3. execute(String sql)

  • 用途:是一个更通用的方法,可以用来执行任何类型的SQL语句,并返回一个布尔值来指示返回的结果类型。
  • 返回值
    • 如果返回的结果是一个ResultSet对象,则此方法返回true
    • 如果返回的是更新计数(即受影响的行数)或没有结果,则返回false
  • 注意execute方法需要额外的步骤来检索ResultSet对象或更新计数。如果返回true,可以通过调用getResultSet方法来获取ResultSet对象;如果返回false,可以通过调用getUpdateCount方法来获取受影响的行数。

总结

  • executeQuery:用于执行SELECT语句,返回查询结果集。
  • executeUpdate:用于执行INSERT、UPDATE、DELETE或DDL语句,返回受影响的行数。
  • execute:是一个更通用的方法,可以执行任何类型的SQL语句,并返回一个布尔值来指示返回的结果类型,需要额外的步骤来获取结果集或更新计数。

18. 编写JDBC - SQL查询出来的结果分页展示 ?

在Java中,使用JDBC进行数据库操作时,分页查询通常不会直接在SQL查询语句中完成(虽然某些数据库如MySQL、PostgreSQL等提供了分页的SQL语法),而是通过应用层代码来控制。这里我将展示一个通用的方法来使用JDBC实现分页查询,并通过修改查询的起始点和查询的行数来分页展示结果。

以下是一个基本的步骤和示例代码,假设我们使用MySQL数据库,并且有一个users表,它包含id(主键)、nameemail等字段。

1. 准备JDBC连接

首先,你需要准备JDBC连接到你的数据库。这通常包括加载数据库驱动、建立连接等步骤。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class PaginationExample {

    private static final String URL = "jdbc:mysql://localhost:3306/your_database";
    private static final String USER = "your_username";
    private static final String PASSWORD = "your_password";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }

    // ... 其他代码
}

2. 实现分页查询

接下来,我们需要编写一个方法来执行分页查询。这个方法将接受页码(pageNo)和每页显示的记录数(pageSize)作为参数,并返回该页的记录。

public static void fetchDataWithPagination(int pageNo, int pageSize) {
    String sql = "SELECT * FROM users LIMIT ?, ?";
    try (Connection conn = getConnection();
         PreparedStatement pstmt = conn.prepareStatement(sql)) {

        // 计算LIMIT语句中的起始索引(注意:LIMIT的起始索引是从0开始的)
        int offset = (pageNo - 1) * pageSize;
        pstmt.setInt(1, offset);
        pstmt.setInt(2, pageSize);

        ResultSet rs = pstmt.executeQuery();

        while (rs.next()) {
            // 假设users表有id, name, email字段
            int id = rs.getInt("id");
            String name = rs.getString("name");
            String email = rs.getString("email");
            // 打印或其他处理...
            System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
        }

    } catch (SQLException e) {
        e.printStackTrace();
    }
}

3. 调用分页查询方法

现在,你可以通过调用fetchDataWithPagination方法来获取不同页的数据了。

public static void main(String[] args) {
    // 假设我们想要获取第1页的数据,每页显示5条记录
    fetchDataWithPagination(1, 5);

    // 如果你想获取第2页的数据,只需更改pageNo的值
    // fetchDataWithPagination(2, 5);
}

注意事项

  • 在实际应用中,你还需要处理一些额外的逻辑,比如计算总页数、处理用户输入的页码等。
  • 如果数据库本身支持分页查询(如MySQL的LIMIT、PostgreSQL的LIMITOFFSET),则可以直接在SQL语句中完成分页,但JDBC中的处理方式通常更为灵活和通用。
  • 考虑到性能和资源使用,分页查询时应该尽量避免一次性加载大量数据。

答案来自文心一言,仅供参考
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110611.html

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

相关文章

Windows下Python和PyCharm的应用(一)__第一个测试程序

1、下载Python安装包 直接从官网下载,百度里搜出来的Python下载,很多是别的公司的商业广告,千万要注意,不要乱点进去,免得浪费时间。 从官网下载,链接:Download Python | Python.org 2、安装Pyt…

网络编程day03(网络体系结构、调试命令、TCP/IP对比)

目录 1》网络的体系结构 1> OSI模型 2> TCP/IP模型 3> 常见网络协议 4> DNS域名解析协议 2》 网络调试命令 1> ping:测试网络连通性(ICMP) 2> netstat 3》Dos (拒绝式服务)攻击?…

怎么在mathtype中打空格 MathType空格键不能用

MathType是一款数学公式编辑器,可以帮助用户创建复杂的数学公式和方程式。它提供了一个用户友好的界面,使得编辑和排版数学公式变得更加容易和高效。用户可以直接在其界面中输入公式,也可以将已有的公式从其他文档中复制粘贴过来进行编辑。在…

【2024数模国赛赛题思路公开】国赛B题第二套思路丨附可运行代码丨无偿自提

2024年数模国赛B题解题思路 B 题 生产过程中的决策问题 一、问题1解析 问题1的任务是为企业设计一个合理的抽样检测方案,基于少量样本推断整批零配件的次品率,帮助企业决定是否接收供应商提供的这批零配件。具体来说,企业需要依据两个不同…

秋燥拜拜,中秋润起来,酒茶香中秋有“礼”

话说这初秋啊,真是个让人又爱又恨的季节! 爱它的秋高气爽,恨它的天干物燥。就像是我们刚刚结束了一个炎热的夏天,身体还没来得及适应,就被秋天的干燥给来了个“突然袭击”。鼻子干、嘴唇干、喉咙干,感觉整个…

hcip什么时候考试?一文带您了解hcip考试报名与预约流程

其他考试一般都会有固定的时间,但hcip不一样,它的考试时间并不固定,这就让考生很是疑惑:hcip什么时候考试呢?除了知道考试时间之外,还要了解hcip的报名条件、报名流程等相关内容。关于这些问题的答案,小编…

blender图像如何分层导出?blender动画云渲染

在blender渲染时产品会被其他物体影响,这时候就可以用到blender中的阻隔;分层导出图像到PS中进行校色等后期处理。 在分层前,我们需要先打开渲染属性-胶片-透明,这样导出的图像才是透明背景的,反之会变成黑色底。 第一…

使用GPU加速及配置

配置CUDA 英伟达 https://developer.nvidia.com/cuda-downloadsPython python要求3.8.x版本以上 python下载 https://www.python.org/getit/使用pytorch 查询地址: https://pytorch.org/index.html给出建议: 可以直接 pip3 install torch torchv…

如何实现思维导图简单漂亮?其实并不难

如何实现思维导图简单漂亮?思维导图是一种非常有效的思考和组织工具,它通过图形化的方式帮助我们梳理信息、激发创意。一个简单又漂亮的思维导图不仅能提高工作效率,还能让人赏心悦目。为了帮助你在学习和工作中更加得心应手,下面…

win10任务栏颜色怎么调?分享几个简单操作,附上详细图文教程

win10任务栏颜色怎么调?相信在大家的日常生活中,电脑是不可或缺的一部分。我们平时上班都需要使用到电脑,最近有个小伙伴问:Win10系统的任务栏颜色可以调整吗?答案当然是可以的。任务栏颜色调整可以帮助我们提高桌面美…

828华为云征文|部署电影收藏管理器 Radarr

828华为云征文|部署电影收藏管理器 Radarr 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 应用场景1.3 性能模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Radarr3.1 Radarr 介绍3.2 Docker 环境搭建3.3 Radarr 部署3.4 R…

C++11: 智能指针(unique_ptr,shared_ptr和weak_ptr的使用及简单实现)

目录 1. 为何需要智能指针? 1.1 抛异常场景 1.2 什么是内存泄漏 2. 智能指针的原理 2.1 RAII技术 2.2 补充实现 3. auto_ptr 4. unique_ptr 4.1 使用及原理 4.2 定制删除器 5. shared_ptr 5.1 shared_ptr简介及使用 5.2 shared_ptr简单实现 5.2.1 基本…

CentOS7 部署 Zabbix 监控平台———监控网络设备,Linux 主机、Windows 主机

Node 有自己的配置文件和数据库,其要做的是将配置信息和监控数据向 Master 同步。 当 Master 发生故障或损坏, Node 可以保证架构的完整性。 3)Server-Prxoy-Client 架构 Proxy 是 Server、Client 之间沟通的桥梁,Proxy 本身没…

Cortex-M3架构学习:存储器系统

存储系统功能 CM3 的存储器系统与从传统 ARM 架构的相比,进行如下改革: 它的存储器映射是预定义的,并且还规定好了哪个位置使用哪条总线。 CM3 的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实…

超详细!!!electron-vite-vue开发桌面应用之创建新窗口以及主进程和子进程的通信监听(十二)

云风网 云风笔记 云风知识库 一、新建打开窗口 1、在electron/main.ts中加入主进程打开窗口逻辑代码 import { ipcMain } from "electron"; ipcMain.handle("open-win", (_, arg) > {const childWindow new BrowserWindow({webPreferences: {preloa…

代码执行漏洞-Log4j2漏洞

1.执行以下命令启动靶场环境并在浏览器访问 cd log4j/CVE-2021-44228docker-compose up -ddocker ps 2.先在自己搭建的DNSLOG平台上获取⼀个域名来监控我们注⼊的效果 3.可以发现 /solr/admin/cores?action 这⾥有个参数可以传,可以按照上⾯的原理 先构造⼀个请求…

TomCat环境配置(实验报告)

实验 Tomcat 实验环境配置 一、实验目的 1、掌握Tomcat的安装和启动 2、掌握在IntelliJ IDEA中配置Tomcat的方法 二、实验环境 1、硬件:PC电脑一台,网络正常; 2、配置:Windows10系统,内存8G及以上,硬盘…

LAN变压器的DCR

在变压器技术中,DCR代表直流电阻(DC Resistance)。它是变压器线圈在直流条件下测得的电阻值,通常用来评估变压器的质量和效率。直流电阻是线圈材料和尺寸的一个函数,它与变压器线圈的发热量和功率损耗直接相关。在变压…

在平板电脑上使用Chrome观看视频的最佳技巧

随着移动设备的普及,越来越多的人选择在平板电脑上观看视频。谷歌浏览器(Chrome)作为一款功能强大的网页浏览器,提供了许多方便的功能来优化你的视频观看体验。以下是一些在平板电脑上使用Chrome观看视频时的最佳技巧。 &#xf…

个人旅游网(2)——功能详解——用户登录注册功能

文章目录 一、用户登录1.1、接口详解1.1.1、isLogged (判断用户是否登录)1.1.2、find-by-telephone(输入手机号时校验手机号是否注册)1.1.3、send-message(发送验证码)1.1.4、login-by-telephone(登录按钮)…