Spring Boot生态中ORM对数据治理的支持有哪些?

有哪些ORM框架可用?

在 Spring Boot 生态中,ORM(对象关系映射)框架的选择丰富多样,主要分为 JPA 规范实现半自动化 ORM代码生成型 ORM扩展工具 等类型。以下是主流 ORM 框架的详细介绍,包括其特点、适用场景及与 Spring Boot 的集成方式:

一、JPA 规范实现(标准 ORM)

JPA(Java Persistence API)是 Java 官方定义的 ORM 规范,Spring Boot 主流实现包括 HibernateEclipseLink ,二者均通过 spring-boot-starter-data-jpa 快速集成。

1. Hibernate
  • 定位:最流行的 JPA 实现,功能全面,支持自动 Schema 生成、二级缓存、延迟加载等高级特性。

  • 特点

    • 高度抽象 :通过注解(如 @Entity@OneToMany)定义实体与表的映射,自动处理对象-关系转换。
    • 自动 DDL :支持 hibernate.hbm2ddl.auto 配置(如 updatecreate),自动生成或更新数据库表结构(开发环境友好)。
    • 缓存机制:内置一级缓存(Session 级)和二级缓存(应用级),提升查询性能。
    • 数据库兼容性:支持主流数据库(MySQL、PostgreSQL、Oracle 等),并提供方言适配。
  • 适用场景:快速开发、需要自动化管理数据库 Schema、对 ORM 抽象要求高的项目(如企业级后台管理系统)。

  • Spring Boot 集成

    xml 复制代码
    <!-- pom.xml -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    配置 application.yml

    yaml 复制代码
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
      jpa:
        hibernate:
          ddl-auto: update  # 开发环境自动生成表结构
        show-sql: true      # 打印 SQL 日志
  • 定位:另一个主流 JPA 实现,由 Oracle 维护(原 TopLink),功能与 Hibernate 类似,但在某些特性(如缓存、查询优化)上有差异。

  • 特点

    • 轻量高效:内存占用较低,适合资源受限的环境。
    • 高级查询优化:支持更复杂的 JPQL 查询转换,对某些数据库(如 Oracle)的优化更深入。
    • 与 Spring 集成 :需手动配置 LocalContainerEntityManagerFactoryBean,但 Spring Boot 提供自动配置支持。
  • 适用场景:需要替代 Hibernate、对特定数据库(如 Oracle)有深度优化需求的项目。

  • Spring Boot 集成
    需排除 Hibernate 依赖,引入 EclipseLink:

    xml 复制代码
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>4.0.2</version> <!-- 需匹配 Spring Boot 版本 -->
    </dependency>

二、半自动化 ORM:MyBatis 系列

MyBatis 是半自动化 ORM框架,强调 SQL 控制,通过 XML 或注解定义 SQL 语句,适合需要手动优化 SQL 性能的场景。

1. MyBatis
  • 定位 :通过 Mapper 接口与 XML/注解绑定 SQL,开发者需手动编写 SQL 语句,灵活性高。

  • 特点

    • SQL 可控:直接编写 SQL,便于性能调优和数据库方言适配。
    • 灵活映射:支持复杂结果集映射(如多表关联、动态 SQL)。
    • 插件扩展 :支持自定义插件(如分页插件 PageHelper)。
  • 适用场景:对 SQL 性能要求高、需要精细控制数据库操作的场景(如高并发交易系统、大数据量查询)。

  • Spring Boot 集成

    xml 复制代码
    <!-- pom.xml -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.0.3</version> <!-- 匹配 Spring Boot 版本 -->
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    配置 application.yml

    yaml 复制代码
    mybatis:
      mapper-locations: classpath:mapper/*.xml  # XML 映射文件路径
      configuration:
        map-underscore-to-camel-case: true      # 自动驼峰命名转换(如 user_name → userName)
2. MyBatis-Plus(MP)
  • 定位 :MyBatis 的增强工具(国产),通过 BaseMapper 接口提供通用 CRUD 方法,大幅减少重复代码。

  • 特点

    • 无侵入性:完全兼容原生 MyBatis,仅通过注解或接口扩展功能。
    • 通用 CRUD :内置 insertselectByIdupdateById 等方法,无需编写 XML。
    • 条件构造器 :通过 QueryWrapper 动态构建查询条件(替代复杂 XML)。
    • 分页支持:内置分页插件,简化分页查询。
  • 适用场景:需要快速开发 CRUD 功能,同时保留 MyBatis SQL 灵活性的项目(如中后台管理系统)。

  • Spring Boot 集成

    xml 复制代码
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3.1</version>
    </dependency>

    使用示例:

    java 复制代码
    // 实体类(继承 Model)
    @Data
    public class User extends Model<User> {
        @TableId(type = IdType.AUTO)
        private Long id;
        private String username;
    }
    
    // Mapper 接口(继承 BaseMapper)
    public interface UserMapper extends BaseMapper<User> {}
    
    // Service 中直接使用通用方法
    @Service
    public class UserService {
        @Autowired
        private UserMapper userMapper;
    
        public User getById(Long id) {
            return userMapper.selectById(id); // 无需编写 SQL
        }
    }

三、代码生成型 ORM:jOOQ

  • 定位:基于数据库 Schema 生成类型安全的 Java 代码,通过流畅的 API 构建 SQL,避免手写字符串拼接。

  • 特点

    • 类型安全:编译期检查 SQL 字段、表名,避免运行时错误。
    • SQL 可控:生成的代码与数据库 Schema 严格一致,适合复杂查询(如多表 JOIN)。
    • 支持多种数据库:自动生成适配不同数据库的 SQL 方言。
  • 缺点:商业许可(社区版免费但功能受限),学习成本较高。

  • 适用场景:对 SQL 正确性要求极高、需要类型安全的项目(如金融系统、高可靠性服务)。

  • Spring Boot 集成

    xml 复制代码
    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq</artifactId>
        <version>3.18.7</version>
    </dependency>
    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-meta</artifactId>
        <version>3.18.7</version>
    </dependency>
    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-codegen</artifactId>
        <version>3.18.7</version>
    </dependency>

    配置代码生成(jooq-config.xml):

    xml 复制代码
    <configuration>
        <jdbc>
            <driver>com.mysql.cj.jdbc.Driver</driver>
            <url>jdbc:mysql://localhost:3306/mydb</url>
            <user>root</user>
            <password>123456</password>
        </jdbc>
        <generator>
            <database>
                <name>org.jooq.meta.mysql.MySQLDatabase</name>
                <includes>.*</includes>
                <inputSchema>mydb</inputSchema>
            </database>
            <generate>
                <pojos>true</pojos>       <!-- 生成 POJO -->
                <daos>true</daos>         <!-- 生成 DAO -->
            </generate>
            <target>
                <packageName>com.example.jooq</packageName>
                <directory>src/main/java</directory>
            </target>
        </generator>
    </configuration>

    通过 Maven 插件生成代码后,使用生成的 DAO 操作数据库:

    java 复制代码
    // 生成的 DAO
    UserDao userDao = new UserDao(configuration);
    UserRecord user = userDao.fetchOne(USERS.ID, 1L); // 类型安全查询

四、扩展工具与框架

除上述主流 ORM 外,Spring Boot 生态还有一些辅助工具,可结合 ORM 框架提升开发效率:

1. Spring Data JPA
  • 定位 :基于 JPA 规范的仓库抽象层 ,通过接口方法名自动生成 SQL(如 findByUsername(String username)),进一步简化 CRUD 操作。
  • 特点
    • 零代码 CRUD :仅需定义接口(如 UserRepository extends JpaRepository<User, Long>),自动生成基础方法。
    • 查询方法解析 :支持方法名关键字(findByAndOrBetween)自动生成查询。
    • 自定义查询 :通过 @Query 注解编写 JPQL 或原生 SQL。
  • 适用场景:快速开发简单 CRUD 功能,减少样板代码(如内部管理系统)。
  • 与 Hibernate 关系:底层默认使用 Hibernate 作为 JPA 实现。
2. Querydsl
  • 定位:类型安全的查询构建工具,支持 JPA、SQL、MongoDB 等多种数据源。

  • 特点

    • 类型安全 :通过编译生成的 Q 类(如 QUser)构建查询,避免字符串拼接错误。
    • 流畅 API :链式调用构建复杂查询(如 query.from(user).where(user.username.eq("admin")).list(user))。
  • 适用场景:需要动态构建复杂查询(如多条件筛选)的项目。

  • Spring Boot 集成

    xml 复制代码
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>6.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>6.0.0</version>
        <scope>provided</scope>
    </dependency>

    通过 Maven 插件生成 Q 类后使用:

    java 复制代码
    QUser user = QUser.user;
    List<User> result = queryFactory.selectFrom(user)
                                    .where(user.username.eq("admin")
                                            .and(user.age.gt(18)))
                                    .fetch();

五、如何选择 ORM 框架?

根据项目需求和团队技术栈,可参考以下决策逻辑:

需求维度 推荐框架
快速开发、减少样板代码 Spring Data JPA(底层 Hibernate)
需要手动优化 SQL MyBatis 或 MyBatis-Plus
类型安全的 SQL 构建 jOOQ(商业)或 Querydsl(开源)
高度自动化的 ORM Hibernate
兼容旧系统 SQL 逻辑 MyBatis(直接编写 SQL)

总结

Spring Boot 生态中的 ORM 框架覆盖了从高度抽象 (Hibernate、Spring Data JPA)到手动控制 SQL (MyBatis)的全场景需求。选择时需结合项目对开发效率、SQL 可控性、类型安全的要求,以及团队对框架的熟悉度。对于大多数企业级应用,MyBatis-Plus (平衡开发效率与 SQL 控制)或 Spring Data JPA (快速开发)是最常用的选择;而对 SQL 要求极高的场景(如金融系统),则推荐 jOOQMyBatis

ORM框架对数据治理的支持

在 Spring Boot 体系中,ORM(对象关系映射)框架是连接业务对象与数据库的核心桥梁,其设计不仅关注数据持久化,还通过扩展能力支持企业级数据治理需求。数据治理结构通常涵盖数据模型定义、元数据管理、数据质量、数据安全、审计日志、多租户支持、事务管理 等关键维度。以下从主流 ORM 框架(如 Hibernate、MyBatis、Spring Data JPA)出发,结合 Spring Boot 特性,详细说明其对数据治理的支持:

在 Spring Boot 体系中,ORM(对象关系映射)框架是连接业务对象与数据库的核心枢纽,其设计不仅关注数据持久化,还通过扩展能力深度支持企业级数据治理需求。数据治理涵盖数据模型定义、元数据管理、数据质量、数据安全、审计日志、多租户隔离、事务管理等关键维度。以下结合主流 ORM 框架(Hibernate、MyBatis、Spring Data JPA),详细说明其对数据治理的支持:

一、数据模型定义与标准化

ORM 框架通过声明式映射将 Java 对象与数据库表/视图关联,确保业务模型与数据模型的一致性,是数据治理的起点。

1. JPA 规范的标准化映射(Hibernate/Spring Data JPA)
  • 注解驱动定义 :通过 JSR 338(JPA 2.2)标准注解(如 @Entity@Table@Column@Id@OneToMany)定义实体类与表的映射关系,明确字段约束(如 @Column(nullable=false, length=50))、主键生成策略(@GeneratedValue)、关联关系(一对一、一对多)。
    示例:

    java 复制代码
    @Entity
    @Table(name = "user", schema = "auth") // 指定表名和 Schema
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键
        private Long id;
    
        @Column(nullable = false, unique = true, length = 50) // 非空、唯一、长度限制
        private String username;
    
        @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) // 级联保存/删除
        private List<Role> roles;
    }
  • 自动 Schema 管理 :通过 hibernate.hbm2ddl.auto 配置(如 updatecreate),自动生成或更新数据库表结构(开发环境友好),确保模型与数据库同步。

2. MyBatis 的灵活映射
  • XML/注解绑定 SQL :通过 resultMap 定义复杂字段映射(如多表关联、字段别名),或通过 @Result 注解简化映射。
    示例(XML):

    xml 复制代码
    <resultMap id="userMap" type="User">
        <id id-column="user_id" property="id"/>
        <result column="user_name" property="username"/>
        <collection 
            property="roles" 
            column="user_id"
            ofType="Role"
            select="selectRolesByUserId"/>
    </resultMap>
  • 动态 SQL 支持 :通过 <if><foreach> 等标签动态拼接 SQL,适应复杂查询场景(如多条件筛选),避免硬编码。

二、元数据管理

元数据(如实体字段描述、关联关系、约束规则)是数据治理的核心资产,ORM 框架通过内置或扩展机制支持元数据的提取与管理。

1. 内置元数据访问
  • Hibernate Metadata API :通过 SessionFactory 获取 Metadata 对象,动态查询实体类、字段、关联关系的元数据(如字段类型、是否可为空、外键目标表)。
    示例:

    java 复制代码
    Metadata metadata = sessionFactory.getMetadata();
    EntityPersister userPersister = metadata.getEntityPersister(User.class.getName());
    // 获取字段元数据(如 username 是否可为空)
    boolean isUsernameNullable = userPersister.getPropertyNullability()[0];
  • Spring Data JPA 审计元数据 :通过 AuditingHandler 跟踪实体的创建/修改时间、操作人(@CreatedBy@LastModifiedBy),元数据可用于数据溯源。

2. 元数据扩展与集成
  • 自定义注解 + AOP :通过自定义注解(如 @DataOwner(department="HR") 标记数据归属部门)结合 AOP 扫描实体类,提取元数据并存储到治理平台(如 Apache Atlas)。
    示例:

    java 复制代码
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface DataOwner {
        String department();
    }
    
    // 在实体中使用
    public class User {
        @DataOwner(department = "HR")
        private String employeeId;
    }
  • 与 Apache Atlas 集成 :通过自定义 MetadataCollector 扫描 JPA 实体或 MyBatis 映射文件,将表结构、字段描述、血缘关系同步到 Atlas 可视化管理。

三、数据质量保障

ORM 框架通过校验、约束、级联操作等机制保障数据完整性,避免脏数据流入数据库。

1. 声明式数据校验
  • JSR 380(Bean Validation)集成 :Spring Boot 自动集成 Hibernate Validator,通过 @NotBlank@Email@Min 等注解在实体字段上定义校验规则,持久化前自动触发校验(结合 @Valid@Validated)。
    示例:

    java 复制代码
    public class User {
        @NotBlank(message = "用户名不能为空")
        @Email(message = "邮箱格式错误")
        private String email;
    }
    
    // Service 中触发校验
    @PostMapping("/users")
    public User createUser(@Valid @RequestBody User user) {
        return userRepository.save(user); // 校验失败抛 MethodArgumentNotValidException
    }
  • 自定义校验器 :通过 @ConstraintConstraintValidator 实现复杂业务规则校验(如身份证号格式、手机号归属地)。

2. 数据一致性控制
  • 级联操作(Cascade) :通过 @OneToMany(cascade = CascadeType.PERSIST) 定义级联保存/删除,避免因手动操作遗漏导致的数据不一致。

  • 乐观锁(Optimistic Locking) :通过 @Version 注解标记版本字段,Hibernate 自动检测并发修改,防止脏写(适合高并发场景)。
    示例:

    java 复制代码
    @Entity
    public class Product {
        @Version // 乐观锁版本号
        private Long version;
        private Integer stock;
    }

四、数据安全与隐私保护

ORM 框架通过字段过滤、权限控制、加密存储等机制保护敏感数据,满足 GDPR、等保等合规要求。

1. 字段级访问控制
  • Spring Data JPA 投影(Projection) :通过接口或类投影限制查询返回的字段,避免敏感信息(如密码、手机号)泄露。
    示例:

    java 复制代码
    public interface UserProjection {
        String getUsername(); // 仅返回用户名,隐藏密码等敏感字段
    }
    
    public interface UserRepository extends JpaRepository<User, Long> {
        UserProjection findByUsername(String username);
    }
  • Hibernate @Filter :通过动态过滤条件隐藏特定数据(如根据用户角色过滤可见的行)。
    示例:

    java 复制代码
    Session session = sessionFactory.openSession();
    Filter filter = session.enableFilter("departmentFilter")
                            .setParameter("deptId", currentUser.getDeptId());
    List<User> users = session.createQuery("FROM User").list(); // 仅返回当前部门用户
2. 敏感数据加密
  • 字段加密存储 :通过 Hibernate @Type 自定义类型(如 AES 加密),在持久化时自动加密字段,读取时解密。
    示例:

    java 复制代码
    @Column
    @Type(type = "com.example.AesEncryptType") // 自定义加密类型
    private String phone;
  • MyBatis 插件加密 :通过 Interceptor 拦截 SQL 执行,在参数设置或结果集映射时对敏感字段加解密。

五、审计与溯源

数据治理要求记录数据的变更历史(Who、When、What),ORM 框架通过内置或扩展工具支持审计日志。

1. Spring Data JPA 审计
  • 自动记录变更信息 :通过 @CreatedDate@LastModifiedDate 标记时间字段,@CreatedBy@LastModifiedBy 标记操作人,配合 AuditorAware 接口动态获取当前用户。
    示例:

    java 复制代码
    @EntityListeners(AuditingEntityListener.class)
    public class User {
        @CreatedDate
        private LocalDateTime createTime;
    
        @CreatedBy
        private String createdBy;
    }
    
    // 配置 AuditorAware 获取当前用户
    @Bean
    public AuditorAware<String> auditorAware() {
        return () -> Optional.ofNullable(SecurityContextHolder.getContext())
                             .map(SecurityContext::getAuthentication)
                             .map(Authentication::getName);
    }
2. Hibernate Envers 深度审计
  • 全量变更记录 :Hibernate Envers 是官方审计插件,通过监听 Hibernate 事件,自动将实体变更(增删改)记录到独立的审计表(如 User_AUD),包含修订号、时间戳、修改人、旧值/新值。
    配置:

    properties 复制代码
    # application.properties
    spring.jpa.properties.hibernate.envers.audit_table_suffix=_AUD
    spring.jpa.properties.hibernate.envers.revision_field_name=rev
    spring.jpa.properties.hibernate.envers.revision_type_field_name=revtype

六、多租户数据隔离

针对 SaaS 场景,ORM 框架支持通过租户 ID 隔离不同租户的数据,确保数据安全。

1. Hibernate 多租户策略
  • 共享数据库(推荐) :所有租户共享同一数据库,通过租户 ID 字段区分(hibernate.multiTenancy=DISCRIMINATOR),Hibernate 自动在 SQL 中添加 tenant_id = ? 条件。
    配置:

    properties 复制代码
    spring.jpa.properties.hibernate.multiTenancy=DISCRIMINATOR
    spring.jpa.properties.hibernate.tenant_identifier_resolver=com.example.CurrentTenantIdentifierResolver
    spring.jpa.properties.hibernate.multi_tenant_connection_provider=com.example.MultiTenantConnectionProviderImpl
2. MyBatis 多租户实现
  • 插件拦截 SQL :通过 Interceptor 拦截所有 SQL 语句,自动添加租户 ID 条件(需配合租户上下文)。
    示例:

    java 复制代码
    @Intercepts({
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
    })
    public class TenantInterceptor implements Interceptor {
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            Object parameter = invocation.getArgs()[1];
            Long tenantId = TenantContext.getCurrentTenantId();
            // 修改 SQL,添加 tenant_id = #{tenantId}
            return invocation.proceed();
        }
    }

七、事务与一致性保障

ORM 框架与 Spring 事务管理深度集成,通过声明式事务确保 ACID 特性,支持分布式事务扩展。

1. 声明式事务(Spring)
  • @Transactional 注解 :通过 Spring AOP 为方法添加事务边界,支持传播行为(Propagation.REQUIRED)、隔离级别(Isolation.READ_COMMITTED)、回滚规则(rollbackFor=Exception.class)。
    示例:

    java 复制代码
    @Service
    public class OrderService {
        @Autowired
        private OrderRepository orderRepo;
        @Autowired
        private InventoryRepository inventoryRepo;
    
        @Transactional(rollbackFor = Exception.class) // 所有异常回滚
        public void createOrder(Order order) {
            orderRepo.save(order); // 保存订单
            inventoryRepo.decreaseStock(order.getProductId(), order.getCount()); // 扣减库存
        }
    }
2. 分布式事务(Seata 集成)
  • Spring Boot + Seata :针对跨微服务的分布式事务,通过 Seata 的 AT/TCC 模式,ORM 框架配合完成本地事务与全局事务的协调。
    流程:
    1. 全局事务协调器(TC)开启全局事务。
    2. 各微服务执行本地事务(通过 ORM 提交),并向 TC 报告状态。
    3. TC 根据所有分支事务状态决定提交或回滚。

八、扩展与集成能力

Spring Boot 的自动配置和扩展机制允许开发者结合 ORM 框架与其他数据治理工具,构建完整的治理体系。

1. 与数据库迁移工具集成
  • Flyway/Liquibase:Spring Boot 集成 Flyway 或 Liquibase,通过版本化的 SQL 脚本管理数据库 Schema 变更,确保开发、测试、生产环境的 Schema 一致性(与 ORM 实体定义解耦或对齐)。
2. 与数据治理平台集成
  • Apache Atlas:通过自定义元数据采集器扫描 JPA 实体或 MyBatis 映射文件,将表结构、字段描述、血缘关系同步到 Atlas 进行可视化管理。

总结

Spring Boot 体系下的 ORM 框架(Hibernate、MyBatis、Spring Data JPA)通过标准化模型定义、元数据管理、数据校验、安全控制、审计日志、多租户隔离、事务协调等核心能力,全面支持数据治理的关键需求。实际应用中,需根据业务场景(如高并发、合规性、灵活性)选择合适的 ORM 框架,并结合 Spring 生态工具(如 Spring Security、Seata、Flyway)扩展治理能力,最终实现数据的全生命周期管理。

相关推荐
22:30Plane-Moon1 小时前
项目1总结其三(图片上传功能)
ide·spring boot·vue
武昌库里写JAVA4 小时前
使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程
java·vue.js·spring boot·sql·学习
一只爱撸猫的程序猿5 小时前
创建一个关于智能博物馆导览案例
spring boot·aigc·ai编程
java水泥工6 小时前
Java项目:基于SpringBoot和VUE的在线拍卖系统(源码+数据库+文档)
java·vue.js·spring boot
zooooooooy6 小时前
Electron实现自定义全量更新
spring boot·electron
neoooo6 小时前
JDK 新特性全景指南:从古早版本到 JDK 17 的华丽变身
java·spring boot·后端
我是场7 小时前
Android14内核调试 - boot & vendor_boot
java·开发语言·spring boot
StuVan8 小时前
springboot2整合nacos作为配置中心
spring boot
Q_Q5110082859 小时前
python的校园研招网系统
开发语言·spring boot·python·django·flask·node.js·php