当前位置: 首页 > news >正文

MyBatis源码系列1(使用JDBC查询数据)

使用原生jdbc进行查询数据步骤.
  • 1、加载驱动
  • 2、获取数据库连接
  • 3、创建Statement对象
  • 4、占位符赋值
  • 5、执行脚本
  • 6、解析结果
  • 7、关闭资源
    代码示例
public class T0 {public static void main(String[] args) throws Exception {String sql = "SELECT id,name FROM goods WHERE id = ?";List<Object> params = new ArrayList<>(1);params.add(1);new T0().jdbcForSql(sql, params);}public void jdbcForSql(String sql, List<Object> params) throws Exception {//从配置文件中读取配置信息Properties pro = new Properties();pro.load(Resources.getResourceAsStream("database.properties"));String driver = pro.get("db.driver").toString();String userName = pro.getProperty("db.username").toString();String pwd = pro.getProperty("db.password").toString();String url = pro.getProperty("db.url").toString();//加载驱动Class.forName(driver);//创建数据库链接Connection connection = DriverManager.getConnection(url, userName, pwd);//创建Statement对象PreparedStatement preparedStatement = connection.prepareStatement(sql);//给占位符赋值for (int i = 0; i < params.size(); i++) {preparedStatement.setObject(i + 1, params.get(i));}//执行脚本ResultSet resultSet = preparedStatement.executeQuery();//结果解析while (resultSet.next()) {System.out.println(resultSet.getString("name"));}//关闭资源if (resultSet != null) {resultSet.close();}if (null != preparedStatement) {preparedStatement.close();}if (connection != null) {connection.close();}}
}

从上面代码中可以看出明显的缺点:
1、每与数据库交互一次,都要执行一遍上面的流程,流程繁琐,
2、脚本与业务代码强耦合,不利于复用和维护。

优化思路:

  • 1、步骤1、步骤2 可以引入数据库连接池解决。
  • 2、步骤3~步骤7可以封装,唯一不同的是执行脚本不同(传递参数),返回值不同[反射解决](查询操作)

步骤3~步骤7中,核心是执行脚本,执行脚本之前需要给脚本动态赋值,脚本执行以后需要对结果进行解析,正好对应代理模式(动态代理)。
基于以上分析,可以将查询数据库的操作简化为两步:
1、从数据库连接池中获取数据库连接;
2、传入脚本获取结果。

下一篇基于 动态代理+注解 实现简易版的MyBatis。

相关文章:

MyBatis源码系列1(使用JDBC查询数据)

使用原生jdbc进行查询数据步骤. 1、加载驱动2、获取数据库连接3、创建Statement对象4、占位符赋值5、执行脚本6、解析结果7、关闭资源 代码示例 public class T0 {public static void main(String[] args) throws Exception {String sql "SELECT id,name FROM goods WH…...

【微服务】Nacos配置中心和客户端数据同步模式

一、Nacos概述 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它提供了一组简单易用的特性集&#xff0c;帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。 二、数据同步模式 1. 实时同步 Push模式&#xff1a;在服务端的配置信…...

WebRTC音视频开发读书笔记(六)

数据通道不仅可以发送文本消息, 还可以发送图片、二进制文件,将其类型binaryType属性设置成arraybuffer类型即可. 九\、文件传输 1、文件传输流程 &#xff08;1&#xff09;使用表单file打开本地文件 &#xff08;2&#xff09;使用FileReader读取文件的二进制数据 &#…...

高级列表组件ReList

高级列表组件ReList 组件实现基于 Vue3 Element Plus Typescript&#xff0c;同时引用 vueUse lodash-es tailwindCss (不影响功能&#xff0c;可忽略) 主要基于JSX风格实现高度动态的列表渲染组件&#xff0c;可以通过信息配置Metas配置控制信息项展示&#xff0c;同时支持…...

Vxe UI vue vxe-table 实现表格数据分组功能,根据字段数据分组

Vxe UI vue vxe-table 实现表格数据分组功能&#xff0c;根据字段数据分组 实现数据分组功能 基于树结构功能就可以直接实现数据分组功能&#xff0c;代码如下&#xff1a; <template><div><vxe-button status"primary" click"listToGroup()&…...

oracle创建账户

1、查看表空间 SELECT tablespace_name FROM user_tablespaces;2、创建用户 CREATE USER FLINKCDC2 IDENTIFIED BY "123456";也可以使用指定表空间的方式 CREATE USER FLINKCDC2 IDENTIFIED BY "123456" DEFAULT TABLESPACE LOGMINER_TBS QUOTA UNLIMIT…...

2024新型数字政府综合解决方案(五)

新型数字政府综合解决方案通过集成人工智能、大数据、区块链和云计算技术&#xff0c;打造了一个智能化、透明化和高效的政务服务平台&#xff0c;旨在提升政府服务的响应速度、处理效率和数据安全性。该方案实现了跨部门的数据共享与实时更新&#xff0c;通过智能化的流程自动…...

datawind可视化查询-其他函数

飞书文档学习链接:https://www.volcengine.com/docs/4726/47275 1. 用户名函数 用户名函数并非 ClickHouse 官方函数,而是与项目用户信息相结合,用于返回当前使用用户的指定信息的函数。 USERNAME()可返回当前用户的用户名,如下所示。该函数也可与其他函数组合使用 2. J…...

数据库MySQL之事务、索引

目录 1.概述 2.事务 3.索引 3.1索引结构 3.2操作语法 1.概述 场景&#xff1a;假如我们需要解散教学部&#xff0c;那么该部门下的所有员工都需要删除。如果教学部成功删除了&#xff0c;但员工出于某些原因(比如SQL语句写错了等)并没有删除&#xff0c;此时就会出现数据…...

AI学习记录 - transformers的decoder和encoder中的自注意力矩阵和掩码矩阵的数据处理

掩码掩码&#xff0c;指的是掩盖住后面的词汇的词向量对我当前词汇造成影响。把PAD字符设置成负无穷大&#xff0c;概念上不叫掩码&#xff0c;只是计算方式和掩码一样。 怎么生成掩码&#xff0c;在非掩码注意力矩阵中&#xff0c;把PAD词向量每个维度设置成负无穷大&#xf…...

【Solidity】代币

ERC20 ERC-20 全称 “Ethereum Request for Comment 20”&#xff0c;是一种标准接口&#xff0c;用于实现代币合约。ERC20 标准定义了一组函数和事件&#xff0c;使得代币可以在不同的应用和平台之间互操作。 ERC20 标准接口定义了一组必须实现的函数和事件&#xff1a; in…...

5 - Linux YUM仓库及NFS共享服务

目录 一、YUM概述 1.YUM简介 2.软件仓库的提供方式 3.RPM软件包的来源 4. yum 命令的运用 二、搭建ftp YUM仓库 三、NFS共享服务 1.NFS简述 2.模拟NFS 一、YUM概述 1.YUM简介 YUM&#xff08;Yellow dog Updater Modified&#xff09;是一个专门为了解决包的依赖关系…...

上传文件,文件类型限制语法,各种媒体视频文件的Content-Type

各种媒体视频文件的Content-Type “application/x-apple-diskimage”: “DMG”, “application/epubzip”: “EPUB”, “application/java-archive”: “JAR”, “video/x-matroska”: “MKV”, “text/html”: “HTML|HTM”, “text/css”: “CSS”, “text/javascript…...

类和对象(下)(2)

类和对象&#xff08;下&#xff09;(2) static成员 • ⽤static修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;静态成员变量⼀定要在类外进⾏初始化。 • 静态成员变量为当前类的所有对象所共享&#xff0c;不属于某个具体的对象&#xff0c;不存在对象中&#…...

软件测试 - 自动化测试(概念)(Java)(自动化测试分类、web自动化测试、驱动、selenium自动化测试工具的安装)

一、自动化的概念 ⾃动洒⽔机&#xff0c;主要通上⽔就可以⾃动化洒⽔并且可以⾃动的旋转。 ⾃动洗⼿液&#xff0c;免去了⼿动挤压可以⾃动感应出洗⼿液 超市⾃动闸⻔&#xff0c;不需要⼿动的开⻔关⻔ ⽣活中的⾃动化案例有效的减少了⼈⼒的消耗&#xff0c;同时也提⾼了⽣…...

wpf datagrid 实现双向绑定

前台 <DataGridAutoGenerateColumns"False"Background"White"CanUserAddRows"True"Grid.Row"1"RowEditEnding"DataGrid_OnRowEditEnding"RowHeight"60"SelectionUnit"CellOrRowHeader"x:Name"…...

使用循环在el-select下拉框中循环出-3至50

问: 使用循环在el-select下拉框中循环出-3至50 回答: <el-form-itemprop"adPosition"label"广告位置":rules"{required: true, message: 广告位置不能为空, trigger: change}" ><el-select v-model"addDataForm.adPosition"…...

全球海事航行通告解析辅助决策系统

“全球海事航行通告解析辅助决策系统”是一个针对海事行业设计的智能系统&#xff0c;旨在帮助海上导航和航运操作人员解析和应对全球发布的海事航行通告。 要做这样的系统我们必须要了解海事签派员的日常工作。 海事签派员&#xff0c;也称为船舶操作员或船运调度员&#xff0…...

Spring 解决bean的循环依赖

Spring循环依赖-博客园 1. 什么是循环依赖 2. 循环依赖能引发什么问题 循环依赖可能引发以下问题&#xff1a; 初始化顺序不确定&#xff1a;循环依赖导致无法确定哪个对象应该先被创建和初始化&#xff0c;从而造成初始化顺序的混乱。这可能导致错误的结果或意外的行为。死…...

鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main

阅读之前的说明 先说明&#xff0c;本篇很长&#xff0c;也很枯燥&#xff0c;若不是绝对的技术偏执狂是看不下去的.将通过一段简单代码去跟踪编译成ELF格式后的内容.看看ELF究竟长了怎样的一副花花肠子&#xff0c;用readelf命令去窥视ELF的全貌&#xff0c;最后用objdump命令…...

C++头文件和cpp文件的原理分析

通常&#xff0c;在一个C程序中&#xff0c;只包含两类文件——.cpp文件和.h文件。 .cpp文件被称作C源文件&#xff0c;里面放的都是C的源代码.h文件则被称作C头文件&#xff0c;里面放的也是C的源代码&#xff0c;头文件不用被编译 C语言支持“分别编译”&#xff08;separa…...

接入Taotoken后感受到的API调用延迟降低与错误率改善

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 接入Taotoken后感受到的API调用延迟降低与错误率改善 1. 背景与切换契机 作为一名长期在项目中集成大模型能力的开发者&#xff0…...

Unity VR立体反射与抗锯齿技术实战解析

1. Unity VR 立体反射与抗锯齿技术深度解析在VR开发中&#xff0c;视觉真实感直接决定了用户体验的质量。立体反射和抗锯齿作为两项核心技术&#xff0c;前者解决了传统平面反射缺乏深度感的问题&#xff0c;后者则消除了画面边缘的锯齿瑕疵。本文将基于实际项目经验&#xff0…...

基于BLE与伺服电机的非侵入式墙壁开关遥控改造方案

1. 项目概述想给家里的老式墙壁灯开关加个遥控功能&#xff0c;但又不想碰那危险的220V强电线路&#xff1f;这个项目或许能给你一个既安全又有趣的解决方案。我最近用Adafruit的几块开发板&#xff0c;配合一个微型伺服电机和3D打印的支架&#xff0c;做了一个蓝牙遥控的机械式…...

上海国际航运研究中心:全球绿色航运发展报告(2024-2025)

本报告由上海国际航运研究中心与世界海事大学联合编制&#xff0c;聚焦 2024 年 1 月至 2025 年 9 月全球绿色航运发展&#xff0c;围绕政策、机制、清洁能源、减排技术、发展趋势五大核心展开&#xff0c;全面呈现航运业低碳转型的全球格局、关键进展与挑战。一、核心政策&…...

Simulink仿真PMSM时,那个神秘的‘4’和‘30/π’到底怎么来的?手把手带你算清楚

Simulink仿真PMSM时关键参数转换原理与实战解析 在永磁同步电机(PMSM)的Simulink仿真过程中&#xff0c;工程师们常常会遇到几个看似"神秘"的增益系数——特别是30/π和4这两个数值。这些参数并非随意设置&#xff0c;而是深植于电机物理本质与单位系统转换的数学表达…...

TarsCpp协程实现原理:从用户态上下文切换看高性能RPC框架设计

1. 从线程到协程&#xff1a;为什么TarsCpp要拥抱协程&#xff1f;在分布式微服务架构里&#xff0c;我们每天都在和RPC、网络IO、并发处理打交道。传统的多线程模型&#xff0c;一个请求一个线程&#xff0c;逻辑清晰&#xff0c;但线程创建、上下文切换的开销&#xff0c;以及…...

对比直连与通过taotoken调用大模型api的实际延迟感受

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直连与通过 Taotoken 调用大模型 API 的实际延迟感受 在集成大模型 API 到实际应用时&#xff0c;响应延迟是影响开发者体验和…...

AMD处理器硬件深度调试终极方案:SMUDebugTool完全实战手册

AMD处理器硬件深度调试终极方案&#xff1a;SMUDebugTool完全实战手册 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…...

如何在IDEA中打造你的私人阅读空间:3个实用技巧提升编程效率与阅读体验

如何在IDEA中打造你的私人阅读空间&#xff1a;3个实用技巧提升编程效率与阅读体验 【免费下载链接】thief-book-idea IDEA插件版上班摸鱼看书神器 项目地址: https://gitcode.com/gh_mirrors/th/thief-book-idea 在快节奏的编程工作中&#xff0c;如何有效利用碎片化时…...