最简单的示例:通过JDBC查询数据

news2024/11/23 13:47:09

引言

在现代企业级应用开发中,持久层框架(如 MyBatis、Hibernate 等)极大地简化了数据库操作,提高了开发效率和代码的可维护性。本文将通过一个最简单的示例,演示如何使用 JDBC 连接数据库、执行 SQL 语句以及处理结果,并与Mybatis源码做对比,为后续深入研究 MyBatis 源码打下基础。

通过 JDBC 查询数据

在这个例子中,我们将使用 MySQL 数据库作为示例,看一下传统的 JDBC 方式是如何执行一个简单的查询操作的,
以下代码是我们《从零开始实现MyBatis框架》的第一个类SqlSession以及selectOne方法,代码如下:

package org.apache.ibatis.session;

import java.sql.*;

/**
 * Sql会话
 *
 * @author crazy coder
 * @since 2024/10/07
 **/
public class SqlSession {
    public String selectOne(Long id) {
        // 1. 定义数据源信息:驱动、数据库连接 URL、数据库用户名、数据库密码
        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC";
        String user = "root";
        String password = "root";

        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            // 2. 加载 MySQL JDBC 驱动
            Class.forName(driver);

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

            // 4. 准备 SQL 语句、预编译 SQL语句
            String sql = "select `id`, `username`, `email` from `author` where id = ? ";
            
            pstmt = conn.prepareStatement(sql);

            // 5. 设置参数
            pstmt.setLong(1, id);

            // 6. 执行 SQL 查询操作
            rs = pstmt.executeQuery();

            // 7. 处理结果集
            StringBuilder result = new StringBuilder();
            while (rs.next()) {
                result.append("id: ").append(rs.getInt("id"))
                        .append(", username: ").append(rs.getString("username"))
                        .append(", email: ").append(rs.getString("email"));

            }
            return result.toString();

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            // 8. 关闭资源
            if (pstmt != null) {
                try {
                    pstmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        return "";
    }
}

这段代码展示了如何使用 JDBC 进行一个简单的查询操作。可以看到,我们需要手动加载 JDBC 驱动、获取连接、创建预编译语句、设置参数、执行查询,并处理结果集。此外,还需要注意资源的关闭问题。
代码关键步骤说明如下:

  1. 定义数据源信息:包括驱动、数据库连接 URL、数据库用户名、数据库密码;
  2. 加载驱动:使用 Class.forName() 方法加载 MySQL 的 JDBC 驱动。这是为了确保 JVM 知道如何处理 MySQL
    数据库的连接请求;
  3. 建立连接:通过 DriverManager.getConnection() 方法建立数据库连接。需要提供数据库的 URL、用户名和密码;
  4. 预编译 SQL语句:定义一个 SQL查询语句,并使用 PreparedStatement 来执行。PreparedStatement
    允许你预编译 SQL 语句,并安全地设置参数;
  5. 设置参数:通过 setLong() 方法设置 SQL 语句中的参数值;
  6. 执行 SQL 语句:使用 executeQuery() 方法执行 SQL查询操作;
  7. 处理结果集:这里只是简单的讲结果拼接成字符串返回;
  8. 关闭资源:无论是否成功执行 SQL,都应该在 finally 块中关闭 PreparedStatement 、ResultSet 和
    Connection 对象,以释放资源。

传统的 JDBC 方式有哪些缺点

通过以上示例。我们可以发现,使用 JDBC 方式查询数据存在一些不便之处,这些不便主要体现在代码的复杂性、重复性、易错性和维护成本等方面。

  1. 代码复杂性高
    使用 JDBC 编写 SQL 查询通常需要手动处理很多细节,包括加载 JDBC 驱动、建立数据库连接、创建 PreparedStatement、设置参数、执行查询、处理结果集等。这使得代码量较大,结构相对复杂。

  2. 代码重复性高
    由于每执行一次数据库操作都需要编写类似的代码片段(如连接数据库、关闭资源等),这导致了大量的代码重复,增加了维护难度。

  3. 易犯错误
    手动处理数据库连接、异常处理、资源关闭等操作容易出错,比如忘记关闭连接或结果集,导致内存泄漏等问题。

  4. 缺乏类型安全
    使用 JDBC 时,处理结果集通常需要手动转换为 Java 对象,这可能导致类型转换错误。此外,SQL 语句中的字段名和 Java 对象中的属性名不一致也可能引发问题。

  5. 缺少自动映射功能
    JDBC 不提供自动的 ORM(对象关系映射)功能,所有结果集到 Java 对象的映射都需要手动实现。

  6. 事务管理繁琐
    在 JDBC 中,事务管理通常需要手动开始事务、提交或回滚事务,而在复杂的业务逻辑中,事务的嵌套管理会变得更加复杂。

  7. 缺少缓存机制
    JDBC 本身不支持缓存机制,而 MyBatis 支持一级缓存(本地缓存)和二级缓存,可以显著提升查询性能。

与Mybatis源码对比

接下来,我们将看看 MyBatis 是如何完成同样的查询任务。MyBatis 通过抽象出 Configuration、SqlSession、Executor等组件,简化了数据库操作的流程,在后续的文章中,我们将继续深入探讨 MyBatis 的更多细节和内部机制,帮助读者更好地理解和使用 MyBatis。
在这里插入图片描述

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

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

相关文章

LabVIEW技术难度最大的程序

在LabVIEW开发中,技术难度最大的程序通常涉及复杂的系统架构、高精度的控制要求、大量数据处理,以及跨平台或多硬件设备的集成。以下是几类具有高技术难度的LabVIEW程序: 1. 高精度实时控制系统 LabVIEW中涉及高精度实时控制的系统程序&…

金纳米星“融入”水凝胶,原位生长的奥秘,应用前景的探索

大家好!今天来了解一项在三维水凝胶表面生长金纳米星的研究——《Growing Gold Nanostars on 3D Hydrogel Surfaces》发表于《Chemistry of Materials》。水凝胶在生物医学等诸多领域有着重要应用,而金纳米星具有独特的光学性质。这项研究通过原位合成的…

【含开题报告+文档+PPT+源码】基于SpringBoot的校园互助平台设计与实现【包运行成功】

开题报告 现代大学校园是一个多样化且充满活力的环境,拥有来自不同文化和地域的学生。然而,这种多样性也伴随着一系列挑战,包括学业压力、心理健康问题、社交挑战以及适应新环境的困难。面对这些挑战,学生常常感到信息获取困难和…

redis——哨兵机制

redis中提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。 主从复制是实现redis高可用性的基石,从节点宕机时我们仍然可以将请求发送给主节点或者其他从节点,而当主节点宕机的时候,无法执行写操作,无…

Maven、Git

1. Maven 安装 (2024.6.23)最新版MAVEN的安装和配置教程(超详细)_maven安装-CSDN博客 2. 配置IDEA和Maven的关联 1. 单个关联 (每新建一个项目都要配一次,不推荐) 配置maven home path&#…

【Linux】文件IO系统[ 库函数 ]封装了[ 系统调用 ] +【区分文件结构体FILE和file与files_srtuct表】(读写接口盘点与介绍)

前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Lin…

Unity中实现预制体自动巡逻与攻击敌人的完整实现指南

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

C语言 | Leetcode C语言题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; const int dx[4] {0, 1, 0, -1}; const int dy[4] {1, 0, -1, 0};int dfs(int x, int y, int** grid, int n, int m) {if (x < 0 || x > n || y < 0 || y > m || grid[x][y] 0) {return 1;}if (grid[x][y] 2) {return 0;}g…

读数据工程之道:设计和构建健壮的数据系统02数据工程师

1. 背景和技能 1.1. 数据工程是一个快速发展的领域&#xff0c;关于如何成为一名数据工程师仍然存在很多问题 1.2. 进入数据工程领域的人在教育、职业和技能方面有着不同的背景 1.2.1. 每个进入该领域的人都应该投入大量的时间进行自学 1.3. 从一个邻近的领域转到数据工程是…

【STM32开发之寄存器版】(七)-PWM脉冲宽度调制

一、前言 PWM简介 PWM&#xff08;脉宽调制&#xff09;是一种通过调节信号的脉冲宽度来控制功率输出的技术。其基本原理是保持固定频率的信号&#xff0c;将其高电平和低电平的持续时间调整&#xff0c;达到控制平均功率的目的。应用方面&#xff0c;PWM广泛用于电机控制、LED…

LeetCode 3310. 移除可疑的方法

LeetCode 3310. 移除可疑的方法 你正在维护一个项目&#xff0c;该项目有 n 个方法&#xff0c;编号从 0 到 n - 1。 给你两个整数 n 和 k&#xff0c;以及一个二维整数数组 invocations&#xff0c;其中 invocations[i] [ai, bi] 表示方法 ai 调用了方法 bi。 已知如果方法 k…

Qt创建插件及使用

本文使用“Qt Creator 6.0.1”和“Qt 6.2.2”完成插件创建及使用&#xff0c;主要有如下步骤&#xff1a;&#xff08;1&#xff09;创建子目录项目MyProject&#xff1b;&#xff08;2&#xff09;在子目录项目中创建应用程序项目MyApp&#xff1b;&#xff08;3&#xff09;在…

python实现RC4加解密算法

RC4算法 一、算法介绍1.1 背景1.2 密钥调度算法(KSA)1.3 伪随机生成算法(PRGA) 二、代码实现三、演示效果 一、算法介绍 1.1 背景 RC4算法是由Ron Rivest在1987年为RSA数据安全公司设计的一种流密码算法&#xff0c;其安全性主要依赖于其密钥流的随机性和不可预测性。该算法因…

Spring Cloud 3.x 集成admin快速入门Demo

1.什么是Spring Boot Admin&#xff1f; Spring Boot Admin(SBA)是一个社区开源项目&#xff0c;用于管理和监视Spring Boot 应用程序&#xff0c;它提供详细的健康(Health)信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Spring Boot 缓存…

Steam Deck掌机可装“黑苹果” 开发者成功安装macOS 15 Sequoia

在Steam Deck掌机上运行Windows 11相对轻松&#xff0c;但要让其成功搭载“黑苹果”系统则颇具挑战性。近日&#xff0c;有博主勇于尝试&#xff0c;将macOS 15 Sequoia安装到了Steam Deck上。 开发者kaitlyn在X平台上分享道&#xff1a;“在朋友们的鼎力相助下&#xff0c;我…

【机器学习】KNN算法及鸢尾花案例练习

KNN 算法 knn算法思想 : K-近邻算法&#xff08;K Nearest Neighbor&#xff0c;简称KNN&#xff09;。比如&#xff1a;根据你的“邻居”来推断出你的类别 如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别 常见距…

Mybatis测试案例

1.创建springboot工程 创建实体类user和接口 user类 注意&#xff1a;java和mysql的对象的属性数据类型要一致 mapper接口 2.配置mybatis(连接数据库信息) # spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #地址url spring.datasource.urljdbc:mysql://localho…

虚拟仿真产品图册生成器,上传PDF即可实现

随着科技的飞速发展&#xff0c;我国各行各业对虚拟仿真的需求越来越大&#xff0c;尤其在产品设计、制造、销售等领域&#xff0c;虚拟仿真技术已经成为了企业提高竞争力的重要手段。为了让企业能够更方便、快捷地展示产品&#xff0c;给大家推荐一款创新性的工具——FLBOOK在…

说说BPMN概念及应用

BPMN&#xff08;Business Process Modeling and Notation&#xff09;即业务流程建模与标注&#xff0c;是一种由OMG&#xff08;Object Management Group&#xff0c;对象管理组织&#xff09;制定的业务流程建模语言。以下是对BPMN标准的详细解释&#xff1a; 一、BPMN的起…