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

【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 方法用于添加删除条件。

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

最简持久层工具类


http://www.kler.cn/a/572751.html

相关文章:

  • 驱动开发系列43 - Linux 显卡KMD驱动代码分析(四)- DRM设备操作
  • Golang的数据库分库分表
  • 【网络安全】API安全防护完整指南
  • 【计算机网络入门】TCP拥塞控制
  • OpenGL ES -> GLSurfaceView纹理贴图
  • 词向量(Word Embedding)
  • 【SegRNN 源码理解】图示理解 forward的过程
  • 使用 marked.min.js 实现 Markdown 编辑器 —— 我的博客后台选择之旅
  • MySQL8 忘记密码
  • 【金融量化】Ptrade中交易环境支持的业务类型
  • Mysql命令大全(连接Mysql)
  • 单体架构、集群、分布式、微服务的区别!
  • Web服务器配置
  • shell文本处理
  • 美股行情数据:历史高频分钟回测数据策略分析
  • nvm的使用汇总
  • 【C++设计模式】第二篇:工厂方法模式(Factory Method)
  • mapbox高阶,结合threejs(threebox)实现立体三维飞线图
  • 15. 示例:创建AXI-Lite事务类(addr/data/rw)
  • JavaWeb-CS和BS的异同点