Springboot整合

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Springboot整合
  • 新建一个Spring Initializr项目

  • 创建项目的文件结构以及jdk的版本

  • 选择项目所需要的依赖

  • POM文件修改
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>aoyi</groupId>
    <artifactId>sn</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sn</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
 
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.0</version>
        </dependency>
 
        <!--缺少此jar包,导致@Mapper注解无效-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
            <exclusions>
                <exclusion>
                    <artifactId>mybatis</artifactId>
                    <groupId>org.mybatis</groupId>
                </exclusion>
            </exclusions>
        </dependency>
 
         <!--分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
            <exclusions>
                <exclusion>
                    <artifactId>mybatis-spring-boot-starter</artifactId>
                    <groupId>org.mybatis.spring.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
 
        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!--swagger ui-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
 
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.29</version>
        </dependency>
 
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.10</version>
        </dependency>
 
        <!--rabbitmq 依赖客户端--> <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.8.0</version>
    </dependency>
        <!--操作文件流的一个依赖--> <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
 
 
    </dependencies>
 
    <build>
        <!--读取数据库配置-->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                    <include>**/*.yml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 --> <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.0</version>
            <!-- 插件的依赖 -->
            <dependencies>
                <!-- 逆向工程的核心依赖 -->
                <dependency>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-core</artifactId>
                    <version>1.3.2</version> </dependency>
                <!-- 数据库连接池 -->
                <dependency>
                    <groupId>com.mchange</groupId>
                    <artifactId>c3p0</artifactId>
                    <version>0.9.2</version>
                </dependency>
                <!-- MySQL驱动 -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.8</version> </dependency>
            </dependencies>
        </plugin>
        </plugins>
    </build>
</project>
  • 修改配置文件

将resource文件夹下原有的application.properties文件删除,创建application.yml配置文件(备注:其实SpringBoot底层会把application.yml文件解析为application.properties),本文创建了两个yml文件(application.yml和application-dev.yml)

application.yml

spring:
   profiles:
     active: dev

application-dev.yml

server:
  port: 8080
 
spring:
  datasource:
    username: root
    password: 1234
    url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver
 
    #解决循环依赖的问题
  main:
    allow-circular-references: true
mybatis:
  mapper-locations: classpath:mapping/*.xml
  type-aliases-package: org.aoyi.sn.entity
pagehelper:
    helperDialect: mysql
    reasonable: true
    page-size-zero: true
    supportMethodsArguments: true
    params: count=countSql
#showSql
logging:
  level:
    com.example.demo.mapper: debug

在项目中配置多套环境的配置方法。

 

笔记:在Spring Boot中多环境配置文件名需要满足application-{profile}.yml的格式,其中{profile}对应你的环境标识,比如:

application-dev.yml:开发环境
application-test.yml:测试环境
application-prod.yml:生产环境

至于哪个具体的配置文件会被加载,需要在application.yml文件中通过spring.profiles.active属性来设置,其值对应{profile}值。

  • 配置 mybatis-generator-core
  • resource文件下创建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>
    <!-- targetRuntime: 执行生成的逆向工程的版本 MyBatis3Simple: 生成基本的CRUD(清新简洁版)
    MyBatis3: 生成带条件的CRUD(奢华尊享版) -->
    <context id="DB2Tables" targetRuntime="MyBatis3Simple">
        <!-- 数据库的连接信息 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://rm-bp1vc9osk3mo2o4h3lo.mysql.rds.aliyuncs.com:端口/数据库名称" userId=" " password=" "></jdbcConnection>
        <!-- javaBean的生成策略-->
        <javaModelGenerator targetPackage="org.aoyi.sn.entity" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- SQL映射文件的生成策略 xml生成 -->
        <sqlMapGenerator targetPackage="mapping" targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- Mapper接口的生成策略 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="org.aoyi.sn.mapper" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 逆向分析的表 -->
        <!-- tableName设置为*号,可以对应所有表,此时不写domainObjectName -->
    <!-- domainObjectName属性指定生成出来的实体类的类名 -->
        <table tableName="aoyi_sn_order" domainObjectName="AoyiSnOrder" />
 
 
    </context>
</generatorConfiguration>
  • 右键Run maven build

  • 生成效果

  • 基本方法都已经生成好了

  • 启动类配置扫描mapper
  • resource文件下创建logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds">
 
    <contextName>logback</contextName>
    <property name="log.path" value="D:/project/helen/guli_log/edu" /> //输出路径
 
    <!--控制台日志格式:彩色日志-->
    <!-- magenta:洋红 -->
    <!-- boldMagenta:粗红-->
    <!-- cyan:青色 -->
    <!-- white:白色 -->
    <!-- magenta:洋红 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>
 
    <!--文件日志格式-->
    <property name="FILE_LOG_PATTERN"
              value="%date{yyyy-MM-dd HH:mm:ss} |%-5level |%thread |%file:%line |%logger |%msg%n" />
 
    <!--编码-->
    <property name="ENCODING"
              value="UTF-8" />
 
    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--日志级别-->
            <level>DEBUG</level>
        </filter>
        <encoder>
            <!--日志格式-->
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!--日志字符集-->
            <charset>${ENCODING}</charset>
        </encoder>
    </appender>
 
    <!--输出到文件-->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志过滤器:此日志文件只记录INFO级别的-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_info.log</file>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${ENCODING}</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
    </appender>
 
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志过滤器:此日志文件只记录WARN级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_warn.log</file>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${ENCODING}</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
    </appender>
 
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日志过滤器:此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_error.log</file>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${ENCODING}</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
    </appender>
 
    <!--开发环境-->
    <springProfile name="dev">
        <!--可以灵活设置此处,从而控制日志的输出-->
        <root level="DEBUG">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>
 
    <!--生产环境-->
    <springProfile name="pro">
        <root level="ERROR">
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>
 
</configuration>

创建util包 封装返回值

package aoyi.sn.util;
 
 
/**
 *  
 * @author LEOH
 *
 */
public class BaseResult<T> {
  private String retMsg;
  private String retCode;
  private T data;
  public T getData() {
    return data;
  }
  public void setData(T data) {
    this.data = data;
  }
  public String getRetMsg() {
    return retMsg;
  }
  public void setRetMsg(String retMsg) {
    this.retMsg = retMsg;
  }
  public String getRetCode() {
    return retCode;
  }
  public void setRetCode(String retCode) {
    this.retCode = retCode;
  }
 
  public BaseResult<T> buildOk(T t, String retMsg) {
    BaseResult<T> tBaseResult = new BaseResult<>();
    tBaseResult.data = t;
    tBaseResult.retCode = Constants.SuccessCode;
    tBaseResult.retMsg = retMsg;
    return tBaseResult;
  }
 
  public BaseResult<T> buildFail(String retMsg){
    BaseResult<T> tBaseResult = new BaseResult<>();
    tBaseResult.retCode = Constants.FailCode;
    tBaseResult.retMsg = retMsg;
    return tBaseResult;
  }
 
}
package aoyi.sn.util;
 
public class Constants {
 
 
  public static final String Query = "[查询]";
  public static final String Add = "[新增]";
  public static final String Update = "[更新]";
  public static final String Delete = "[删除]";
  public static final String Duplicate = "[重复]";
  public static String SplitChar = "_";
  /**
   * 24*3600*10 10 days
   */
  public static final long ExpireTime = 864000;
 
  public static final String FailCode = "FAIL";
 
  public static final String SuccessCode = "OKAY";
 
  public static final int PageSize = 10;
 
}

select标签常用属性

parameterType   传入参数  支持map javaBean等值  resultMap 返回参数

Mapper增加

public List<AoyiSnCategory> selectAll(Map<String, Object> paras);

xml增加

 <sql id="Base_Column_List">
   id, create_by, create_time,
      update_by, update_time, sn_category_id,
      sn_category_name, sn_category_level, sn_category_parent_id
  </sql>
 <select id="selectAll" resultMap="BaseResultMap" >
    select     <include refid="Base_Column_List" />
    from aoyi_sn_category
  </select>

创建service

@Service
public interface AoyiSnCategoryService {
 
 
    public BaseResult<PageInfo<AoyiSnCategory>> getSnCategorys(Map<String, Object> paras);
}

创建serviceimpl

 
 
import java.util.*;
 
@Service
@Transactional(rollbackFor = { RuntimeException.class, Exception.class })
public class AoyiSnCategoryServiceImpl implements AoyiSnCategoryService {
    private static final Logger logger = LoggerFactory.getLogger(AoyiSnCategoryService.class);
    @Autowired
    private AoyiSnCategoryMapper aoyiSnCategoryMapper;
   
 
    @Override
    public BaseResult<PageInfo<AoyiSnCategory>> getSnCategorys(Map<String, Object> paras) {
        logger.info("查询类型列表");
        BaseResult<PageInfo<AoyiSnCategory>> baseRet = new BaseResult<PageInfo<AoyiSnCategory>>();
        baseRet.setRetCode(Constants.FailCode);
        baseRet.setRetMsg(Constants.Query);
        int pageNo = Integer.parseInt(String.valueOf(paras.get("pageNo")));
        int pageSize = Integer.parseInt(String.valueOf(paras.get("pageSize")));
        PageHelper.startPage(pageNo, pageSize);
        List<AoyiSnCategory> list = aoyiSnCategoryMapper.selectAll(paras);
        PageInfo<AoyiSnCategory> pageDataList = new PageInfo<AoyiSnCategory>(list);
        baseRet.setData(pageDataList);
        baseRet.setRetCode(Constants.SuccessCode);
        return baseRet;
    }
 
 
}

controller

@RestController
@RequestMapping("/AoyiSnCategory")
public class AoyiSnCategoryController {
 
    @Autowired
    private AoyiSnCategoryService aoyiSnCategoryService;
 
    //查询
    @RequestMapping(value = "getAoyiSnCategorys", method = RequestMethod.POST)
    @ResponseBody
    public BaseResult<PageInfo<AoyiSnCategory>> getDeviceTypeByParas(@RequestBody Map<String, Object> paras){
        return aoyiSnCategoryService.getSnCategorys(paras);
    }
 
 
}

启动

测试查询    封装好了分页  查询2条

配置了日志 打印sql 需下载mybatis Log 插件

增加

 public Integer insertAoyiSnCategory(Map<String, Object>  paras);
@Override
public BaseResult<Integer> insertAoyiSnCategory(Map<String, Object> paras) {
    BaseResult<Integer> baseRet = new BaseResult<Integer>();
    baseRet.setRetCode(Constants.FailCode);
    baseRet.setRetMsg(Constants.Add);
    String createTime = DateUtil.formatYYYYMMDDHHMMSS(new Date());
    paras.put("createTime", createTime);
    paras.put("id", UUID.randomUUID().toString());
    Integer integerBaseResult = aoyiSnCategoryMapper.insertAoyiSnCategory(paras);
   baseRet.setData(integerBaseResult);
    baseRet.setRetCode(Constants.SuccessCode);
    return baseRet;
}
 <insert id="insertAoyiSnCategory"  parameterType="java.util.Map">
 
insert into aoyi_sn_category (id, create_by, create_time,
     update_by, update_time, sn_category_id,
     sn_category_name, sn_category_level, sn_category_parent_id
     )
   values (#{id,jdbcType=VARCHAR}, #{createBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
     #{updateBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}, #{snCategoryId,jdbcType=VARCHAR},
     #{snCategoryName,jdbcType=VARCHAR}, #{snCategoryLevel,jdbcType=VARCHAR}, #{snCategoryParentId,jdbcType=VARCHAR}
     )
   </insert>
 //增加
    @RequestMapping(value = "/insertAoyiSnCategorys", method = RequestMethod.POST)
    @ResponseBody
    public BaseResult<Integer> insertAoyiSnCategorys(@RequestBody Map<String, Object> paras){
        return aoyiSnCategoryService.insertAoyiSnCategory(paras);
    }

测试

修改

public int updateAoyiSnCategory(Map<String, Object> paras);
  <update id="updateAoyiSnCategory"  parameterType="java.util.Map">
  update aoyi_sn_category
    <set>
      <if test="snCategoryName != null and snCategoryName != ''">sn_category_name = #{snCategoryName}</if>
    </set>
    WHERE
    id = #{id}
  </update>
@Override
public BaseResult<Integer> updateAoyiSnCategory(Map<String, Object> paras) {
    BaseResult<Integer> baseRet = new BaseResult<Integer>();
    baseRet.setRetCode(Constants.FailCode);
    baseRet.setRetMsg(Constants.Update);
    int ret = aoyiSnCategoryMapper.updateAoyiSnCategory(paras);
    baseRet.setData(ret);
    baseRet.setRetCode(Constants.SuccessCode);
    return baseRet;
}
  @RequestMapping(value = "/updateAoyiSnCategory", method = RequestMethod.POST)
    @ResponseBody
    public BaseResult<Integer> updateAoyiSnCategory(@RequestBody Map<String, Object> paras){
        return aoyiSnCategoryService.updateAoyiSnCategory(paras);
    }

测试

删除

public BaseResult<Integer> deleteDeviceType(int id);
  @Override
    public BaseResult<Integer> delectAoyiSnCategory(String id) {
        BaseResult<Integer> baseRet = new BaseResult<Integer>();
        baseRet.setRetCode(Constants.FailCode);
        baseRet.setRetMsg(Constants.Delete);
        int ret = aoyiSnCategoryMapper.deleteByPrimaryKey(id);
        baseRet.setData(ret);
        baseRet.setRetCode(Constants.SuccessCode);
        return baseRet;
    }
  @RequestMapping(value = "/delectAoyiSnCategory", method = RequestMethod.POST)
    @ResponseBody
    public BaseResult<Integer> delectAoyiSnCategory(@RequestBody Map<String, Object> paras){
        return aoyiSnCategoryService.delectAoyiSnCategory((String) paras.get("id"));
    }

idea上传项目到gitee(码云)超详细

(3条消息) idea上传项目到gitee(码云)超详细_『愚』的博客-CSDN博客_idea上传项目到gitee

剩下内容以后在加入

package org.aoyi.sn.mqtt;
 
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
 
public class RabbitMqUtils {
//得到一个连接的 channel
public static Channel getChannel() throws Exception{
//创建一个连接工厂
 ConnectionFactory factory = new ConnectionFactory();
 factory.setHost("192.168.1.125");
 factory.setUsername("admin");
 factory.setPassword("123");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
return channel;
} }


相关文章
|
安全 Java 数据库
89.【SpringBoot-02】(四)
89.【SpringBoot-02】
70 0
|
Java 应用服务中间件 容器
|
7月前
|
JSON Java 应用服务中间件
SpringBoot
SpringBoot
30 1
|
Java 数据格式 微服务
springboot系列知识
Spring Boot都很熟悉了,再重新认识学习一遍。
85 0
|
Java 测试技术 容器
87.【SpringBoot-01】(六)
87.【SpringBoot-01】
69 0
|
XML Java 数据格式
87.【SpringBoot-01】(五)
87.【SpringBoot-01】
74 0
|
安全 前端开发 数据安全/隐私保护
89.【SpringBoot-02】(十)
89.【SpringBoot-02】
42 0
|
XML 运维 安全
springboot
springboot
100 0
|
Java
springboot2
springboot2
91 0
|
XML 前端开发 NoSQL