首页 > 其他分享 >最简单的示例:通过JDBC查询数据

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

时间:2024-10-07 21:49:25浏览次数:8  
标签:JDBC rs 数据库 示例 查询 SQL MyBatis

引言

在现代企业级应用开发中,持久层框架(如 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。
在这里插入图片描述

标签:JDBC,rs,数据库,示例,查询,SQL,MyBatis
From: https://blog.csdn.net/woshichenpi/article/details/142534338

相关文章

  • 怎么查找登陆网站后台?(如何查询网站后台地址)
    查找或确定一个网站的后台登录地址通常不是一件直接的事情,因为不同的网站可能会有不同的后台管理入口。不过,这里有一些通用的方法可以帮助你找到或猜测一个网站的后台登录地址:常见的后台路径许多网站使用一些常见的路径作为后台登录页面,例如:/admin/administrator/wp-ad......
  • MySQL Limit 分页查询优化
    前言在各类系统的表格类信息展示的功能中,经常会用到“翻页”这个操作,在页面上每次只展示有限的数据,需要看其他数据的时候则像翻书一样翻到后面的“页”。在MySQL支持的SQL语法中对此有特殊的支持,开发人员在实现这类功能的时候很方便:select*fromxxxlimitM,Nselect*f......
  • R12 SLA 子分类帐和GL总帐关联查询
    --R12SLA子分类帐和GL总帐关联查询selectxte.application_id"应用",xte.entity_id,xte.ledger_id"分类帐SOB",xte.entity_code,xett.name"事务实体类型",le.name"法人主体",le.legal_entity_identifier......
  • P3332 K大数查询 题解
    Solution整体二分板子题vector太好写了111#include<bits/stdc++.h>usingnamespacestd;#definerep(i,j,k)for(inti=(j);i<=(k);++i)#definereo(i,j,k)for(inti=(j);i>=(k);--i)typedeflonglongll;constintN=50010;intn,m,ans[......
  • 织梦数据库配置一个典型的 common.inc.php 文件中的数据库配置示例
    <?php//数据库配置$cfg_dbhost='localhost';//数据库服务器地址$cfg_dbport=3306;//数据库端口$cfg_dbase='your_database_name';//数据库名称$cfg_dbuser='your_username';//数据库用户名$cfg_dbpw='your_password';......
  • sql 查询(分组查询)
    分组函数groupbySELECT*FROMstudetail;groupbystusex根据性别进行分组count()统计个数SELECTstusex,count(stusex)FROMstudetailgroupbystusex;根据年龄进行分组统计个数SELECTstuage,count(*)FROMstudetailgroupbystuage;根据性别进行分组求......
  • 前端媒体查询的用法及案例
    媒体查询:实现响应式设计的强大工具在数字时代,网页必须适应各种设备和屏幕尺寸,以满足用户不断变化的需求。这就是响应式设计的重要性所在,而媒体查询(MediaQueries)则是实现这一目标的强大工具。本文将深入探讨媒体查询的原理、用法以及它如何帮助设计师和开发者创建灵活、适......
  • 分页使用示例
    1.代码classUserModelSerializer(serializers.ModelSerializer):role_display=UserRoleSerializer(many=True,source='roles',read_only=True)classMeta:model=models.Userfields=["id","username",&#......
  • 鸿蒙应用示例:镂空效果实现教程
    在鸿蒙系统中,为了给用户带来更加生动的视觉体验,我们可以使用不同的技术手段来实现图像和文字的镂空效果。本文将通过三个具体的示例来展示如何在鸿蒙系统中实现实心矩形镂空、实心圆镂空以及文字镂空的效果。示例代码//定义一个名为Index的应用入口组件@Entry@Componentstruct......
  • DataInOut 文件输入输出示例
    publicclassDataInOutTest{publicstaticvoidmain(String[]args){DataOutputStreamdos=null;DataInputStreamdis=null;FileInputStreamfis=null;FileOutputStreamfos=null;try{fis=newFileInp......