SpringBoot 数据库全栈整合

前置通俗铺垫 :任何后端项目的核心都是数据持久化 ,SpringBoot 摒弃了 SSM 时代繁琐的数据源、框架手动配置,通过自动配置启动器 实现数据库框架零配置快速整合。日常开发中最常用的数据库技术栈分为两套:MyBatis(半自动ORM,灵活可控)Hibernate/JPA(全自动ORM,开发高效),搭配企业级主流 Druid 高性能数据源,构成生产级数据库解决方案。

易混淆知识点前置区分 :很多新手混淆「数据源」和「ORM框架」,Druid是数据源连接池 ,负责数据库连接创建、复用、监控;MyBatis/Hibernate是ORM持久化框架,负责SQL执行、对象映射,二者各司其职、搭配使用,互不冲突。

一、SpringBoot 数据库整合核心背景与基础认知

1.1 传统SSM数据库配置痛点

在SpringBoot诞生前,SSM框架整合数据库需要手动配置大量冗余代码:手动创建DataSource数据源、手动配置连接池参数、手动注册SqlSessionFactory、手动配置事务管理器、编写大量XML全局配置文件。配置繁琐、复用性差、极易出错,且不同项目配置不统一,维护成本极高。

1.2 SpringBoot数据库整合核心优势

SpringBoot通过自动配置启动器(starter) 机制,预设所有数据库框架的默认配置,开发者仅需引入依赖、填写少量核心配置即可快速使用,同时支持自定义覆盖默认参数,兼顾开发效率与生产灵活性。

1.3 技术栈整体架构(由底层到上层)

数据库操作完整层级:MySQL数据库 → Druid数据源连接池 → SpringBoot JDBC → ORM框架(MyBatis/Hibernate) → 业务代码

底层Druid负责连接管理,上层ORM框架负责数据映射与SQL执行,分层解耦,符合企业生产架构标准。

二、Druid高性能数据源完整整合

2.1 Druid核心背景与优势

Druid是阿里开源的高性能、高可用、带监控功能的数据库连接池,是目前国内企业项目的绝对主流数据源,完全替代SpringBoot默认的HikariDataSource(新版SpringBoot默认数据源)。

版本变动特殊标注:Druid 1.2.16+版本修复了高危SQL注入漏洞,1.2.3版本为老旧稳定版(本文适配经典企业版本),新项目建议使用1.2.20+最新稳定版;druid-spring-boot-starter启动器为官方自动化适配依赖,彻底替代手动配置模式。

核心优势:高性能连接复用、内置SQL监控、慢SQL统计、防火墙拦截、IP访问控制、日志统计,原生支持SpringBoot自动配置。

2.2 Druid两种整合方式(易混淆知识点对比)

  1. 手动配置方式:引入原生druid依赖,手动编写配置类注册数据源、监控台、过滤器,自由度高、配置繁琐,适合老旧项目;

  2. 启动器自动配置方式(推荐):引入druid-spring-boot-starter,零配置注册核心组件,按需自定义参数,新项目首选。

2.3 方式一:Druid手动整合实战(依赖+配置+代码)

2.3.1 步骤1:引入Maven依赖(原理+用途)

步骤原理:导入Druid原生核心依赖与MySQL驱动、JDBC场景依赖,为项目提供数据源连接能力与数据库驱动支持。

核心功能:提供DruidDataSource数据源核心类、数据库连接驱动、JDBC操作基础能力。

实际用途:支撑后续手动配置数据源、连接池参数、监控组件。

复制代码
<dependencies>
    <!-- SpringBoot JDBC基础场景 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- Druid原生数据源依赖 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.3</version>
    </dependency>
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

步骤小结:基础依赖导入完成后,项目具备数据库连接基础能力,但无自动配置,需要手动编码注册Bean。

2.3.2 步骤2:application.yml核心配置(原理+用途)

步骤原理:通过spring.datasource前缀配置数据库连接信息与Druid连接池参数,后续通过配置绑定注解读取配置注入数据源。

核心功能:配置数据库地址、账号密码、驱动、连接池大小、超时时间、监控过滤器规则。

实际用途:统一管理数据源参数,避免硬编码,支持动态修改。

复制代码
# 数据源核心配置
spring:
  datasource:
    # 数据库连接地址
    url: jdbc:mysql://localhost:3306/springboot_mybatis?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
    # 数据库账号密码
    username: root
    password: 123456
    # 驱动类(MySQL8.0+使用cj驱动)
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 指定Druid数据源类型
    type: com.alibaba.druid.pool.DruidDataSource
    # 连接池基础参数
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    # 空闲连接回收参数
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    # 心跳检测SQL
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 预编译语句池
    poolPreparedStatements: true
    # 监控过滤器:stat统计、wall防火墙
    filters: stat,wall
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

步骤小结:配置文件完成所有数据源参数定义,等待配置类读取绑定。

2.3.3 步骤3:手动编写Druid配置类(数据源+监控台+过滤器)

步骤原理:通过@ConfigurationProperties绑定yml配置,手动注册Druid数据源Bean、监控台Servlet、Web统计过滤器,完成全组件初始化。

核心功能:实例化Druid数据源、开启可视化监控台、配置请求过滤规则、IP黑白名单、登录权限。

实际用途:实现数据库连接池生效、SQL监控、安全防护、请求统计。

复制代码
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * Druid手动配置类
 * 包含:数据源、监控台、过滤器完整配置
 */
@Configuration
public class DruidConfig {

    /**
     * 绑定yml中spring.datasource配置,注册Druid数据源
     */
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

    /**
     * 注册Druid监控台Servlet
     * 访问地址:http://localhost:8080/druid
     */
    @Bean
    public ServletRegistrationBean<StatViewServlet> statViewServlet() {
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        // 登录账号密码
        bean.addInitParameter("loginUsername", "admin");
        bean.addInitParameter("loginPassword", "123456");
        // IP白名单
        bean.addInitParameter("allow", "127.0.0.1");
        // IP黑名单(优先级高于白名单)
        bean.addInitParameter("deny", "");
        // 禁止重置数据
        bean.addInitParameter("resetEnable", "false");
        return bean;
    }

    /**
     * 注册DruidWeb统计过滤器
     * 统计所有请求、SQL执行情况
     */
    @Bean
    public FilterRegistrationBean<WebStatFilter> statFilter() {
        FilterRegistrationBean<WebStatFilter> bean = new FilterRegistrationBean<>(new WebStatFilter());
        // 拦截所有请求
        bean.addUrlPatterns("/*");
        // 忽略静态资源与监控台请求
        bean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return bean;
    }
}

步骤小结:手动配置模式完成全组件注册,可直接启动项目访问druid监控台,查看数据库连接、SQL执行、慢日志统计。

2.4 方式二:Druid启动器自动整合(推荐)+底层原理

2.4.1 启动器依赖引入

步骤原理:druid-spring-boot-starter是阿里官方适配SpringBoot的自动化启动器,内置自动配置类,无需手动注册Bean。

核心功能:自动初始化Druid数据源、监控Servlet、Web过滤器、加载默认配置。

实际用途:简化开发,一行依赖替代数十行配置代码。

复制代码
<!-- Druid官方SpringBoot启动器 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.3</version>
</dependency>

2.4.2 启动器底层自动配置原理(分步源码拆解)

整体原理:Druid启动器通过SPI机制加载自动配置类,在Spring数据源自动配置之前初始化Druid组件,条件注解保证唯一生效,自动装配所有核心功能。

步骤1:自动配置类加载原理

原理:项目启动时SPI加载DruidDataSourceAutoConfigure自动配置类,优先级高于Spring原生数据源自动配置。

功能:抢占数据源初始化时机,优先创建Druid数据源。

用途:覆盖SpringBoot默认的Hikari数据源,实现Druid默认生效。

步骤2:条件注解生效原理

原理:通过@ConditionalOnClass判断存在Druid核心类则生效,@ConditionalOnMissingBean保证全局唯一数据源。

功能:避免重复创建Bean,保证容器中只有一个Druid数据源。

用途:防止多数据源冲突,保证项目稳定。

步骤3:批量导入组件配置原理

原理:通过@Import批量导入监控、过滤器、AOP统计等配置类,一次性装配所有Druid功能。

功能:自动注册监控台、Web过滤器、SQL统计组件。

用途:无需手动编码,自动开启全套监控能力。

复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import com.alibaba.druid.pool.DruidDataSource;

/**
 * Druid启动器核心自动配置类
 */
@Configuration
@ConditionalOnClass(DruidDataSource.class)
// 在Spring原生数据源自动配置之前执行
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
// 绑定Druid配置属性
@EnableConfigurationProperties({DruidStatProperties.class})
// 批量导入所有Druid组件配置
@Import({
    DruidSpringAopConfiguration.class,
    DruidStatViewServletConfiguration.class,
    DruidWebStatFilterConfiguration.class,
    DruidFilterConfiguration.class
})
public class DruidDataSourceAutoConfigure {

    private static final Logger LOGGER = LoggerFactory.getLogger(DruidDataSourceAutoConfigure.class);

    /**
     * 初始化Druid数据源,无Bean则自动创建
     */
    @Bean(initMethod = "init")
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        LOGGER.info("Init DruidDataSource");
        return new DruidDataSourceWrapper();
    }
}

Druid启动器整体流程总结:引入启动器依赖 → SPI加载自动配置类 → 优先于原生数据源初始化 → 条件校验创建Druid数据源 → 批量导入监控、过滤器组件 → 自动加载yml配置参数 → 全套功能生效。

特殊备注:该文中的示例代码为源代码整理后抽取部分核心点的代码作为理解展示,非真实源码,要看源码请自行根据方法名 / 类名前往对应的源码文件查看

三、SpringBoot整合MyBatis全解

3.1 MyBatis整合背景与核心优势

MyBatis是半自动轻量级ORM框架,对比原生JDBC简化了冗余代码,对比Hibernate更加灵活可控,支持自定义SQL、动态SQL、SQL优化,是互联网企业主流持久化框架。

易混淆知识点:MyBatis需要手动编写SQL,Hibernate全自动生成SQL;MyBatis灵活适配复杂业务、多表关联、SQL优化,Hibernate适合简单CRUD业务。

3.2 MyBatis启动器核心原理与源码拆解

3.2.1 启动器依赖

复制代码
<!-- MyBatis SpringBoot启动器 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>

3.2.2 MyBatis自动配置分步原理

步骤1:SqlSessionFactory自动创建原理

原理:MyBatis自动配置类读取项目DataSource数据源,自动构建SqlSessionFactoryBean,封装MyBatis核心工厂。

功能:创建MyBatis核心会话工厂,管理数据库会话。

用途:替代传统手动创建SqlSessionFactory的繁琐代码。

步骤2:配置参数绑定原理

原理:自动读取yml中mybatis配置,绑定别名包、映射文件路径、全局配置、插件、类型处理器。

功能:自动装配MyBatis全局参数,无需编写mybatis-config.xml。

用途:简化配置,统一参数管理。

步骤3:Mapper扫描自动注册原理

原理:自动扫描标注@Mapper的接口,动态生成代理对象,注入Spring容器。

功能:实现Mapper接口无需手动注册,直接@Autowired使用。

用途:简化Mapper开发,实现零配置注册。

复制代码
/**
 * MyBatis自动配置核心源码(精简核心版)
 */
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    // 1. 创建SqlSessionFactory工厂Bean
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    // 2. 绑定数据源
    factory.setDataSource(dataSource);
    factory.setVfs(SpringBootVFS.class);

    // 3. 读取外部全局配置文件
    if (StringUtils.hasText(this.properties.getConfigLocation())) {
        factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
    }

    // 4. 绑定configuration自定义参数
    applyConfiguration(factory);

    // 5. 注册插件、拦截器
    if (!ObjectUtils.isEmpty(this.interceptors)) {
        factory.setPlugins(this.interceptors);
    }

    // 6. 设置实体类别名包
    if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
        factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
    }

    // 7. 加载mapper.xml映射文件
    if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
        factory.setMapperLocations(this.properties.resolveMapperLocations());
    }

    return factory.getObject();
}

MyBatis启动器整体流程总结:引入启动器 → 自动配置类生效 → 绑定Druid数据源 → 创建SqlSessionFactory → 加载全局配置与映射文件 → 扫描Mapper接口 → 注入Spring容器 → 业务层直接调用。

特殊备注:该文中的示例代码为源代码整理后抽取部分核心点的代码作为理解展示,非真实源码,要看源码请自行根据方法名 / 类名前往对应的源码文件查看

3.3 MyBatis常用配置(两种配置方式详解)

3.3.1 application.yml主流配置方式(推荐)

原理:通过mybatis.configuration直接配置全局参数,无需引入外部xml文件,SpringBoot优先推荐。

用途:开启驼峰命名、配置日志、超时、缓存等全局特性。

复制代码
mybatis:
  # 实体类别名包
  type-aliases-package: com.tulingxueyuan.pojo
  # mapper映射文件路径
  mapper-locations: classpath:mappers/*.xml
  # 全局配置(替代mybatis-config.xml)
  configuration:
    # 驼峰命名自动转换
    map-underscore-to-camel-case: true
    # 关闭默认日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.3.2 外部全局配置文件方式(兼容旧项目)

原理:通过config-location指定外部mybatis-config.xml路径,兼容传统SSM配置方式。

用途:适配老旧项目迁移,支持复杂全局配置。

复制代码
mybatis:
  config-location: classpath:mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <typeAliases>
        <package name="com.tulingxueyuan.pojo"/>
    </typeAliases>
</configuration>

3.4 配置冲突重点说明(易混淆知识点)

核心禁忌configuration(yml内配置)和config-location(外部xml)不能同时使用,同时配置会触发冲突报错,这是高频面试考点与生产踩坑点。

四、MyBatis Generator代码生成器全解

4.1 核心背景

日常开发中,数据库表对应的POJO实体、Mapper接口、Mapper XML文件代码高度重复、模板化,手动编写效率极低、容易出错。MyBatis Generator(MBG)是MyBatis官方代码生成插件,可根据数据库表自动生成全套基础CRUD代码

4.2 工作原理

  1. 读取数据库连接配置,连接目标数据库; 2. 读取指定数据表信息,解析字段名、字段类型、约束; 3. 根据配置的生成规则,自动生成POJO实体类、Mapper接口、Mapper XML映射文件; 4. 支持覆盖旧代码、按需生成简单/复杂CRUD逻辑。

4.3 实战使用方式

4.3.1 步骤1:POM引入插件

复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.5</version>
            <configuration>
                <configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.22</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

4.3.2 步骤2:编写generatorConfig.xml配置文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 生成规则上下文:MyBatis3Simple仅生成基础CRUD -->
    <context id="simple" targetRuntime="MyBatis3Simple">
        <!-- 关闭默认注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 数据库连接配置 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="root"
                        password="123456"/>

        <!-- 实体类生成路径 -->
        <javaModelGenerator targetPackage="cn.tulingxueyuan.pojo" targetProject="src/main/java"/>

        <!-- Mapper XML生成路径 -->
        <sqlMapGenerator targetPackage="cn.tulingxueyuan.mapper" targetProject="src/main/resources"/>

        <!-- Mapper接口生成路径 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.tulingxueyuan.mapper" targetProject="src/main/java"/>

        <!-- 指定需要生成代码的数据表 -->
        <table tableName="emp" domainObjectName="Emp" mapperName="EmpMapper"/>
        <table tableName="dept" domainObjectName="Dept" mapperName="DeptMapper"/>
    </context>
</generatorConfiguration>

4.3.3 步骤3:执行插件生成代码

通过Maven插件执行 mybatis-generator:generate 命令,自动生成全套CRUD代码。

4.4 MBG优缺点与适用场景

4.4.1 优点

  1. 零手写模板代码,大幅提升开发效率;

  2. 代码规范统一,避免人为编写BUG;

  3. 支持批量生成多表代码,适配快速迭代项目。

4.4.2 缺点

  1. 仅生成基础CRUD,复杂业务SQL仍需手动编写;

  2. 重复生成会覆盖自定义代码,需谨慎操作;

  3. 动态SQL冗余,部分场景代码臃肿。

4.4.3 使用场景

快速迭代项目、基础CRUD业务居多的后台管理系统、数据表数量多的中小型项目、新手规范代码开发。

五、SpringBoot整合Hibernate全解

5.1 Hibernate整合背景

Hibernate是全自动ORM框架,属于JPA规范的经典实现,彻底摆脱手写SQL,通过面向对象的方式操作数据库,框架自动生成SQL执行,适合快速开发、标准化CRUD业务,是传统企业级项目主流框架。

易混淆对比:MyBatis半自动、SQL可控、灵活;Hibernate全自动、无需写SQL、开发快、SQL不可控、复杂业务适配差。

5.2 Hibernate启动器原理

SpringBoot通过spring-boot-starter-data-jpa整合Hibernate,JPA是持久化规范,Hibernate是JPA的默认实现。启动器自动配置实体管理器、事务管理器、ORM映射规则,零配置实现数据库操作。

5.3 实战整合配置

5.3.1 引入依赖

复制代码
<!-- JPA/Hibernate启动器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

5.3.2 核心yml配置

复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    # 自动更新表结构
    hibernate:
      ddl-auto: update
    # 控制台打印SQL
    show-sql: true
    # 格式化SQL
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect

5.4 Hibernate整体原理总结

引入JPA启动器 → 自动加载Hibernate核心包 → 自动配置实体工厂、事务管理器 → 读取yml映射规则 → 实体类绑定数据表 → 面向对象操作数据库 → 框架自动生成SQL执行。

六、全文整体知识点总结

  1. Druid数据源:分为手动配置与启动器自动配置,启动器基于SPI+条件注解自动装配全套数据源、监控、过滤器能力,是企业生产首选;

  2. MyBatis整合:启动器自动创建SqlSessionFactory、绑定配置、扫描Mapper,支持yml配置与xml配置二选一,禁止同时使用避免冲突;

  3. MBG代码生成器 :基于数据表反向生成全套CRUD代码,提升开发效率,适合基础业务场景; 4. Hibernate/JPA:全自动ORM框架,无需手写SQL,适合快速开发,与MyBatis形成互补;

  4. 技术层级关系:Druid负责连接池管理,MyBatis/Hibernate负责数据持久化映射,分层解耦,构成完整数据库解决方案。

相关推荐
xn71331 小时前
别再把 MCP Roots 当安全沙箱:一个符号链接就能逃逸目录
人工智能·后端·mcp
SamDeepThinking1 小时前
Java面向对象在JVM里怎么实现
java·后端·面试
学以智用1 小时前
HTTP 请求头 Headers 完整详解
前端·后端
是上好佳佳佳呀1 小时前
MySQL 基础:从数据库概念到表结构管理DDL
数据库·mysql
Nturmoils1 小时前
Oracle 迁移评估时,我把这两类问题列在了检查清单最前面
数据库
妙码生花1 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(三十五):控制台静态页面、深入研究时间格式化方案
后端·go·ai编程
程序猿大帅1 小时前
Java 虚拟线程发布两年后,我们把它从生产环境移除了
后端
Database_Cool_1 小时前
数据库性能不够用,升级到什么方案好?阿里云 PolarDB(云原生数据库领导者,兼容 MySQL/PostgreSQL/Oracle)平滑升级与百倍弹性
数据库·阿里云·云原生
程序猿秃头之路1 小时前
DDD 系列:聚合和聚合根详解
数据库·oracle·ddd·领域驱动设计