【Spring Boot 应用开发】-04-02 自动配置-数据源-手撸一个最简持久层工具类

设计概述

有时候我们不需要太重的持久层,就像要一个最简的、轻量的持久层,便于维护和扩展,代码掌握在自己手里,那么我们可以基于springboot的自动配置,快速的构建一个自己的持久层轻量框架,不说废话,直接上代码,可以根据自己的需要扩展

类图

uses
uses
DbUtils
+insert(String sql, Object... args)
+insert(String sql, Map params)
+update(String sql, Object... args)
+update(String sql, Map params)
+delete(String sql, Object... args)
+delete(String sql, Map params)
+queryForObject(String sql, RowMapper rowMapper, Object... args)
+queryForObject(String sql, Map params)
+query(String sql, RowMapper rowMapper, Object... args)
+query(String sql, Map params)
SqlBuilder
-StringBuilder sql
+SqlBuilder()
+abstract String build()
+append(String part)
+appendWithSpace(String part)
SelectBuilder
+columns(String... columns)
+from(String table)
+where(String condition)
+and(String condition)
+or(String condition)
+limit(int limit)
InsertBuilder
+columns(String... columns)
+values(List values)
+values(Map values)
UpdateBuilder
+set(Map updates)
+where(String condition)
+and(String condition)
+or(String condition)
DeleteBuilder
+where(String condition)
+and(String condition)
+or(String condition)
JdbcTemplate
NamedParameterJdbcTemplate

工程结构

在这里插入图片描述

代码说明

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;

    @Override
    public 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() 方法用于获取 JdbcTemplateNamedParameterJdbcTemplate 实例。
  • insert, update, delete 方法用于执行相应的数据库操作。
  • queryForObjectquery 方法用于查询单个对象和多个对象。

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 方法用于指定要插入的值。支持 ListMap 两种参数类型。
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 方法用于添加删除条件。

完整工程链接(无需积分直接下)

最简持久层工具类

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MicroServer Gen8再玩之三 OCP万兆光口+12G阵列卡

前一段时间&#xff0c;做了一片双OCP的合成转接卡&#xff0c;在GEN8上用了起来&#xff0c;有些小伙伴觉得还不错&#xff0c;有些则对LSI2308这块阵列卡性能表示不甚满意。 于是乎&#xff0c;就有了后续折腾的理由。 前一段时间&#xff0c;我还不了解阵列卡有啥区别&…

PostgreSQL10 物理流复制实战:构建高可用数据库架构!

背景 PostgreSQL 10 在高可用架构中提供了物理复制&#xff0c;也称为流复制&#xff08;Streaming Replication&#xff09;&#xff0c;用于实现实例级别的数据同步。PostgreSQL 复制机制主要包括物理复制和逻辑复制&#xff1a;物理复制依赖 WAL 日志进行物理块级别的同步&…

Linux网络安全技术与实现

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Linux 网络安全和优化 Jephe Wu 翻译整理 简介 网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的恰当的话,Li…

[黑马点评]关于原子性,锁的笔记

不得不说&#xff0c;黑马点评是一个非常不错的课程&#xff0c;对于线程安全方面的讲解十分详细且明朗&#xff0c;故写下这篇笔记方便复习及帮助后人&#xff08;&#xff09; 目标 我们的目标是对于大量对于优惠劵的访问时&#xff0c;要防止超卖问题以及一人多单问题。 单J…

mapbox高阶,结合threejs(threebox)添加三维球体

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Sphere静态对象二、🍀使用t…

MAC 本地搭建部署 dify(含 github访问超时+Docker镜像源拉取超时解决方案)

目录 一、什么是 dify&#xff1f; 二、安装 docker 1. 什么是 docker&#xff1f; 2. docker下载地址 三、安装 dify 1. dify下载地址 2.可能遇到问题一&#xff1a; github访问超时 3.下载后完成解压 4.进入到 cmd 终端环境&#xff0c;执行下面三个命令 5.可能遇到…

Pytorch xpu环境配置 Pytorch使用Intel集成显卡

1、硬件集显要为Intel ARC并安装正确驱动 2、安装Intel oneAPI Base Toolkit &#xff08;https://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/base-toolkit-download.html&#xff09;安装后大约20G左右&#xff0c;注意安装路径 3、安装Visual Studio Build To…

若依前后端分离版使用Electron打包前端Vue为Exe文件

1.前言 本文详细介绍如何使用electron将若依框架前后端分离版的前端Vue页面打包为Exe文件&#xff0c;并且包括如何实现应用更新。使用若依基础代码体现不出打包功能&#xff0c;因此我使用开发的文件管理系统&#xff0c;介绍上述过程&#xff0c;具体可以查看我的文章《若依…

docker:Dockerfile案例之自定义centos7镜像

1 案例需求 自定义centos7镜像。要求&#xff1a; 默认登录路径为 /usr可以使用vim 2 实施步骤 编写dockerfile脚本 vim centos_dockerfile 内容如下&#xff1a; #定义父镜像 FROM centos:7#定义作者信息 MAINTAINER handsome <handsomehandsome.com># 设置阿里云…

SpringBoot校园管理系统设计与实现

在现代校园管理中&#xff0c;一个高效、灵活的管理系统是不可或缺的。本文将详细介绍基于SpringBoot的校园管理系统的设计与实现&#xff0c;涵盖管理员、用户和院校管理员三大功能模块&#xff0c;以及系统的部署步骤和数据库配置。 管理员功能模块 管理员是系统的核心管理…

[项目]基于FreeRTOS的STM32四轴飞行器: 四.LED控制

基于FreeRTOS的STM32四轴飞行器: 四.LED控制 一.配置Com层二.编写驱动 一.配置Com层 先在Com_Config.h中定义灯位置的枚举类型&#xff1a; 之后定义Led的结构体&#xff1a; 定义飞行器状态&#xff1a; 在Com_Config.c中初始化四个灯&#xff1a; 在Com_Config.h外部声明…

Linux部署java项目

前言 Xshell下载地址 点击连接 常见命令 ls ls:显示当前目录下的文件 ll:可以显示隐藏文件和非隐藏文件与ls -l一样 ls -a -l这两个掌握就可以了 ls --help就可以知道这个后面可以跟什么 ls -al还可以这样 cd cd&#xff1a;进入文件夹 cd后面可以跟相对路径&#xff0…

鸿蒙Android4个脚有脚线

效果 min:number122max:number150Row(){Stack(){// 底Text().border({width:2,color:$r(app.color.yellow)}).height(this.max).aspectRatio(1)// 长Text().backgroundColor($r(app.color.white)).height(this.max).width(this.min)// 宽Text().backgroundColor($r(app.color.w…

盛铂科技 SLMF315频率综合器200MHz至15GHz 国产频综模块

在当今科技飞速发展的时代&#xff0c;射频技术在众多领域发挥着关键作用&#xff0c;从通信、雷达系统到科研实验&#xff0c;对频率综合器的性能要求日益严苛。以下是关于盛铂科技的 SLMF315 超低相位噪声频率综合器的介绍&#xff1a; SLMF315超低相位噪声0.2至15GHz频率综合…

wheel_legged_genesis 开源项目复现与问题记录

Reinforcement learning of wheel-legged robots based on Genesis System Requirements Ubuntu 20.04/22.04/24.04 python > 3.10 开始配置环境&#xff01; 点击releases后进入&#xff0c;下载对应最新版本的代码&#xff1a; 将下载后的代码包解压到你的自定义路径下&…

软考架构师笔记-计算机网络

1.9 计算机网络 OSI/RM 七层模型 物理层 二进制传输(中继器、集线器) (typedef) 数据链路层 传送以帧为单位的信息(网桥、交换机、网卡) 网络层 分组传输和路由选择(三层交换机、路由器)ARP/RARP/IGMP/ICMP/IP 传输层 端到端的连接(TCP/UDP)在前向纠错系统中&#xff0c;当接…

Qt6.8.2创建WebAssmebly项目使用FFmpeg资源

Qt6新出了WebAssmebly功能&#xff0c;可以将C写的软件到浏览器中运行&#xff0c;最近一段时间正在研究这方便内容&#xff0c;普通的控件响应都能实现&#xff0c;今天主要为大家分享如何将FFmpeg中的功能应用到浏览器中。 开发环境&#xff1a;window11&#xff0c;Qt6.8.2…

浅论数据库聚合:合理使用LambdaQueryWrapper和XML

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数据库聚合替代内存计算&#xff08;关键优化&#xff09;二、批量处理优化四、区域特殊处理解耦五、防御性编程增强 前言 技术认知点&#xff1a;使用 XM…

DeepSeek大模型深度解析:架构、技术与应用全景

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 一、大模型时代与DeepSeek的定位1.1 大模型发展历程回顾大模型发展历程时间轴&#xff08;20…

极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6

本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码&#xff0c;我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS&#xff0c;技术团队已经进行了升级&#xff0c;无需用户采取任何…