【Spring Boot 应用开发】-04-02 自动配置-数据源-手撸一个最简持久层工具类
设计概述
有时候我们不需要太重的持久层,就像要一个最简的、轻量的持久层,便于维护和扩展,代码掌握在自己手里,那么我们可以基于springboot的自动配置,快速的构建一个自己的持久层轻量框架,不说废话,直接上代码,可以根据自己的需要扩展
类图
工程结构

代码说明
DbUtils.java
这个类是一个工具类,实现了 ApplicationContextAware 接口,用于获取 Spring 应用上下文。它提供了一系列静态方法,用于执行插入、更新、删除和查询操作。这些方法支持两种参数类型:可变参数数组和 Map。
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.Map;@Component
public class DbUtils implements ApplicationContextAware {private static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {context = applicationContext;}private static JdbcTemplate getJdbcTemplate() {return context.getBean(JdbcTemplate.class);}private static NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {return new NamedParameterJdbcTemplate(getJdbcTemplate());}// 插入数据public static void insert(String sql, Object... args) {getJdbcTemplate().update(sql, args);}// 更新数据public static void update(String sql, Object... args) {getJdbcTemplate().update(sql, args);}// 删除数据public static void delete(String sql, Object... args) {getJdbcTemplate().update(sql, args);}// 查询单个对象public static <T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args) {return getJdbcTemplate().queryForObject(sql, rowMapper, args);}// 查询多个对象public static <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args) {return getJdbcTemplate().query(sql, rowMapper, args);}// 插入数据public static void insert(String sql, Map<String, Object> params) {getNamedParameterJdbcTemplate().update(sql, params);}// 更新数据public static void update(String sql, Map<String, Object> params) {getNamedParameterJdbcTemplate().update(sql, params);}// 删除数据public static void delete(String sql, Map<String, Object> params) {getNamedParameterJdbcTemplate().update(sql, params);}// 查询单个对象public static Map<String, Object> queryForObject(String sql, Map<String, Object> params) {return getNamedParameterJdbcTemplate().queryForMap(sql, params);}// 查询多个对象public static List<Map<String, Object>> query(String sql, Map<String, Object> params) {return getNamedParameterJdbcTemplate().queryForList(sql, params);}}
getJdbcTemplate()和getNamedParameterJdbcTemplate()方法用于获取JdbcTemplate和NamedParameterJdbcTemplate实例。insert,update,delete方法用于执行相应的数据库操作。queryForObject和query方法用于查询单个对象和多个对象。
sql 子文件夹
SqlBuilder.java
这是一个抽象类,用于构建 SQL 语句。它包含一个 StringBuilder 对象,用于拼接 SQL 语句的各个部分。
// ... existing code ...
protected void append(String part) {sql.append(part);
}
// ... existing code ...
append方法用于直接拼接字符串。appendWithSpace方法用于在拼接字符串之前添加一个空格。build方法是一个抽象方法,由子类实现,用于返回最终的 SQL 语句。
SelectBuilder.java
这个类继承自 SqlBuilder,用于构建 SELECT 语句。
// ... existing code ...
public SelectBuilder columns(String... columns) {appendWithSpace(String.join(", ", columns));return this;
}
// ... existing code ...
columns方法用于指定要查询的列。from方法用于指定查询的表。where,and,or方法用于添加查询条件。limit方法用于限制查询结果的数量。
InsertBuilder.java
这个类继承自 SqlBuilder,用于构建 INSERT 语句。
// ... existing code ...
public InsertBuilder columns(String... columns) {appendWithSpace("(");appendWithSpace(String.join(", ", columns));append(")");return this;
}
// ... existing code ...
columns方法用于指定要插入的列。values方法用于指定要插入的值。支持List和Map两种参数类型。
UpdateBuilder.java
这个类继承自 SqlBuilder,用于构建 UPDATE 语句。
// ... existing code ...
public UpdateBuilder set(Map<String, Object> updates) {appendWithSpace("SET");appendWithSpace(updates.keySet().stream().map(key -> key + " = ?").collect(joining(", ")));return this;
}
// ... existing code ...
set方法用于指定要更新的列和值。where,and,or方法用于添加更新条件。
DeleteBuilder.java
这个类继承自 SqlBuilder,用于构建 DELETE 语句。
// ... existing code ...
public DeleteBuilder where(String condition) {appendWithSpace("WHERE");appendWithSpace(condition);return this;
}
// ... existing code ...
where,and,or方法用于添加删除条件。
完整工程链接(无需积分直接下)
最简持久层工具类
相关文章:
【Spring Boot 应用开发】-04-02 自动配置-数据源-手撸一个最简持久层工具类
设计概述 有时候我们不需要太重的持久层,就像要一个最简的、轻量的持久层,便于维护和扩展,代码掌握在自己手里,那么我们可以基于springboot的自动配置,快速的构建一个自己的持久层轻量框架,不说废话&#…...
学之思社区版考试系统docker-compose部署
参考 开源项目-Docker部署学之思管理系统 安装docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Bas…...
1.11.信息系统的分类【DSS】
决策支持系统(DSS)技术解析 一、DSS核心定义 🚀 智能决策引擎 由三大智能模块构成的复合系统: #mermaid-svg-UdoVtlw3MrxynK6Q {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#me…...
mfc140u.dll是什么?当程序遭遇mfc140u.dll问题:快速恢复正常的秘诀
在使用Windows操作系统运行某些软件时,不少用户会遇到令人头疼的mfc140u.dll文件丢失错误。mfc140u.dll这个错误一旦出现,往往导致相关程序无法正常启动或运行,给用户带来诸多不便。这天的这篇文章将给大家分析mfc140u.dll是什么?…...
傅里叶变换:跨越时空的数学魔法
引言:从振动到信息——傅里叶的智慧 傅里叶变换(Fourier Transform)是数学与工程领域最具影响力的工具之一。它的核心思想是将复杂的信号分解为简单的正弦波和余弦波的叠加,从而揭示隐藏在数据背后的频率信息。自19世纪法国数学家…...
【YOLOv12改进trick】StarBlock引入YOLOv12,创新涨点优化,含创新点Python代码,方便发论文
🍋改进模块🍋:StarBlock 🍋解决问题🍋:采用StarBlock将输入数据映射到一个极高维的非线性特征空间,生成丰富的特征表示,使得模型在处理复杂数据时更加有效。 🍋改进优势🍋:简单粗暴的星型乘法涨点却很明显 🍋适用场景🍋:目标检测、语义分割、自然语言处理…...
基于大数据的电影情感分析推荐系统
【大数据】基于大数据的电影情感分析推荐系统(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本系统通过结合Flask框架、Vue前端、LSTM情感分析算法以及pyecharts和numpy、pandas等技术&#x…...
手写一个Tomcat
Tomcat 是一个广泛使用的开源 Java Servlet 容器,用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂,但通过手写一个简易版的 Tomcat,我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat,并深…...
清华北大推出的 DeepSeek 教程(附 PDF 下载链接)
清华和北大分别都有关于DeepSeek的分享文档,内容非常全面,从原理和具体的应用,大家可以认真看看。 北大 DeepSeek 系列 1:提示词工程和落地场景.pdf 北大 DeepSeek 系列 2:DeepSeek 与 AIGC 应用.pdf 清华 Deep…...
用CMake编译glfw进行OpenGL配置,在Visual Studio上运行
Visual Studio的下载 Visual Studio 2022 C 编程环境 GLFW库安装 GLFW官网地址 GLFW官网地址:https://www.glfw.org下载相应版本,如下图: CMake软件进行编译安装 下载CMake 下载的如果是源码包,需要下载CMake软件进行编译安装…...
使用MPU6050产生中断,唤醒休眠中的STM32
本篇文章源码:STM32L431_RT_Thread_PM_mpu6050_wakeup: 使用MPU6050产生中断,唤醒休眠中的STM32L4 书接上回【笔记】STM32L4系列使用RT-Thread Studio电源管理组件(PM框架)实现低功耗-CSDN博客 上一篇文章使用PA0外接一个按键实…...
如何借助人工智能AI模型开发一个类似OpenAI Operator的智能体实现电脑自动化操作?
这几天关于Manus的新闻铺天盖地,于是研究了一下AI智能体的实现思路,发现Openai 的OpenAI Operator智能体已经实现了很强的功能,但是每月200美金的价格高不可攀,而Manus的邀请码据说炒到了几万块!就想能不能求助人工智能…...
蓝桥杯备赛:炮弹
题目解析 这道题目是一道模拟加调和级数,难的就是调和级数,模拟过程比较简单。 做法 这道题目的难点在于我们在玩这个跳的过程,可能出现来回跳的情况,那么为了解决这种情况,我们采取的方法是设定其的上限步数。那么…...
Mysql中的常用函数
1、datediff(date1,date2) date1减去date2,返回两个日期之间的天数。 SELECT DATEDIFF(2008-11-30,2008-11-29) AS DiffDate -- 返回1 SELECT DATEDIFF(2008-11-29,2008-11-30) AS DiffDate -- 返回-1 2、char_length(s) 返回字符串 s 的字符数 3、round(x,d)…...
安孚科技携手政府产业基金、高能时代发力固态电池,开辟南孚电池发展新赛道
安孚科技出手,发力固态电池。 3月7日晚间,安孚科技(603031.SH)发布公告称,公司控股子公司南孚电池拟与南平市绿色产业投资基金有限公司(下称“南平绿色产业基金”)、高能时代(广东横…...
前端知识点---库和包的概念
1. 什么是库(Library)? 库(Library) 是一组可复用的代码集合,提供特定功能(如网络请求、UI 组件、数据处理等)。 特点: 只是代码的集合,没有完整的应用结构…...
【AD】5-14 多跟走线设置
多跟走线 快捷键UM 先拉出线头并框选或线选(快捷键SL),点击交互式总线布线(快捷键UM),走线过程中CtrlB调小线间距,shiftB调大线间距或按TAB键直接修改...
生物电阻抗技术:精准洞察人体营养的“智能窗口”
生物电阻抗技术:精准洞察人体营养的“智能窗口” 引言:营养监测的新兴力量 在健康管理日益受到重视的今天,人体营养监测成为保障健康的关键环节。 传统营养评估方法往往依赖于主观问卷或侵入性检测,存在诸多局限性。 而生物电阻…...
国产操作系统之系统分区及分区的作用
国产操作系统之系统分区及分区的作用和挂载 Linux的系统分区跟Windows有着本质区别,在windows中大家知道c盘一般为系统盘,除c盘系统盘外,我们再分为D、E等文件存储盘,而在Linux中虽然是以文件目录著称的系统,但思路也一样的,比如针对系统分区中 /home、/var 和 /opt 等文…...
大模型AI平台DeepSeek 眼中的SQL2API平台:QuickAPI、dbapi 和 Magic API 介绍与对比
目录 1 QuickAPI 介绍 2 dbapi 介绍 3 Magic API 介绍 4 简单对比 5 总结 统一数据服务平台是一种低代码的方式,实现一般是通过SQL能直接生成数据API,同时能对产生的数据API进行全生命周期的管理,典型的SQL2API的实现模式。 以下是针对…...
快速理清 Attention 注意力和 Encoder, Decoder 概念
之前一直以为 Attention 和 RNN 没关系是凭空蹦出来的新概念;以为 Transformer, Encoder, Decoder 这几个概念是绑在一起的。并不尽然。 Encoder 和 Decoder RNN 里就有 Encoder Decoder 的概念。其中,encoder 接受用户输入,写入 hidden stat…...
爬虫案例八js逆向爬取网易音乐
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、js逆向的前期准备二、网站分析三、代码 前言 提示:这里可以添加本文要记录的大概内容: 爬取网易音乐 提示:以下是本篇…...
Sentinel 笔记
Sentinel 笔记 1 介绍 Sentinel 是阿里开源的分布式系统流量防卫组件,专注于 流量控制、熔断降级、系统保护。 官网:https://sentinelguard.io/zh-cn/index.html wiki:https://github.com/alibaba/Sentinel/wiki 对比同类产品࿱…...
使用 vxe-table 导出 excel,支持带数值、货币、图片等带格式导出
使用 vxe-table 导出 excel,支持带数值、货币、图片等带格式导出,通过官方自动的导出插件 plugin-export-xlsx 实现导出功能 查看官网:https://vxetable.cn gitbub:https://github.com/x-extends/vxe-table gitee:htt…...
powershell@宝塔面板批量建站脚本@批量设置@批量部署伪静态设置
文章目录 abstract批量设置 abstract 对于需要大量建站,并且站点类型都很接近的宝塔用户,可以考虑使用如下powershell脚本进行批量建站语句生成 请根据宝塔的要求的批量建站语句格式创建脚本 例如 function Get-BatchSiteBuilderLines {<# .SYNOPSIS获取批量站点生成器的…...
基于multisim的自动干手器设计与仿真
1 设计的任务与要求 设计一个输出 5V 的直流稳压电源。用开关的闭合模拟手挡住光线的功能。用灯的亮灭模拟烘干吹风功能。 2 方案论证与选择 2.1 自动干手器的系统方案 本设计由5V直流电源、红外发射电路、红外接收电路、灯模拟电路构成。 1. 5V直流电源系统 这一部分是整…...
webflux响应式编程
webflux&webclient 尚硅谷SpringBoot响应式编程教程,最新springboot3入门到实战 响应式编程设计实战及SpringWebFlux源码剖析 - 拉勾 文章目录 前置知识1、Lambda2、Function3、StreamAPI中间操作:Intermediate Operations终止操作:Ter…...
关于tresos Studio(EB)的MCAL配置之GPT
概念 GPT,全称General Purpose Timer,就是个通用定时器,取的名字奇怪了点。定时器是一定要的,要么提供给BSW去使用,要么提供给OS去使用。 配置 General GptDeinitApi控制接口Gpt_DeInit是否启用 GptEnableDisable…...
JavaScript基础-比较运算符
在JavaScript编程中,比较运算符用于比较两个值,并返回一个布尔值(true或false),这对于我们进行条件判断和逻辑控制至关重要。掌握这些运算符不仅有助于编写高效的代码,也是处理复杂逻辑的基础。本文将详细介…...
Uniapp项目运行到微信小程序、H5、APP等多个平台教程
摘要:Uniapp作为一款基于Vue.js的跨平台开发框架,支持“一次开发,多端部署”。本文将手把手教你如何将Uniapp项目运行到微信小程序、H5、APP等多个平台,并解析常见问题。 一、环境准备 在开始前,请确保已安装以下工具…...
