Spring Boot:Idea从零开始初始化后台项目的教程

目录
  • 1 创建项目
    • 1.1 填写项目基本信息
    • 1.2 选择项目集成功能
  • 2 项目基础配置
    • 2.1 gradle文件配置
    • 2.2 环境文件配置
      • 2.2.1 Logback配置文件
      • 2.2.2 MyBatis配置文件
  • 3 简单案例
    • 3.1 Redis案例
    • 3.2 MySQL案例
      • 3.2.1 JPA方式
      • 3.2.2 MyBatis方式
    • 3.3 控制器完整代码
  • 4 健康监测
  • 5 项目结构

官方提供了Springboot初始化工具可直接在线生成项目文件,然后下载并导入开发工具中 。这里记录通过Mac版 IntelliJ IDEA 2019.3.3 (Ultimate Edition)创建Springboot后台项目的过程,当前Springboot稳定版本为2.2.6。

下面的步骤可看做是创建Springboot后台项目模板,也可以当做个是个Helloworld,主要实现以下功能:

  • 集成MySQL,通过SpringData JPA和MyBatis两种方式操作数据库
  • 集成Redis内存数据库
  • 配置Logback
  • 开启项目健康监测

如需集成其他功能,可在此基础上添加。上诉MySQL和Redis使用的是《Docker案例:搭建MySQL数据库服务》和《Docker案例:搭建Redis服务》创建的docker容器。

1 创建项目

1.1 填写项目基本信息

打开Idea创建项目,如下图:

1.2 选择项目集成功能

完成基本信息配置,在Web,SQL,NoSQL,Ops选项中,选择对应的模块依赖,最终选择如图以下几项:

  • Spring Web 用于提供web相关功能
  • Spring Data JPA用于提供数据库相关操作
  • MyBatis Framework用于通过MyBatis操作数据库
  • Spring Data Redis 用于提供Redis相关功能
  • Spring Boot Actuator 用于提供应用的健康监测功能

设置完成后,点击下一步,Idea开始初始化项目文件。

2 项目基础配置

通过上面步骤,已生成项目结构文件,等待开发环境自动构建好依赖库后可继续后续的工作。

2.1 gradle文件配置

当前项目使用gradle管理项目依赖,默认情况下,使用官方的依赖库,国内访问较慢,可替换为阿里云仓库。在build.gradle文件的repositories节点下添加阿里云仓库访问地址,设置完成后如下

repositories {
    //使用阿里云仓库,提高国内依赖库下载速度
    maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
    mavenCentral()
}

另外,添加其它常用依赖库,最终依赖包如下

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2'
    implementation 'com.alibaba:fastjson:1.2.68'
    implementation 'org.apache.commons:commons-lang3:3.10'
    //数据库配置的日志类com.mysql.cj.log.Slf4JLogger在这个包中
    runtime('mysql:mysql-connector-java')
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

2.2 环境文件配置

官方初始化器默认会在resources资源文件夹下生成一个application.properties文件,这里调整一下配置文件结构。在resources资源文件夹下创建config文件夹,移动application.properties文件到config文件夹下,同时在config文件夹下创建application-dev.properties文件和application-prod.properties文件,分别对应开发环境和线上环境的配置,可根据需要增加其它环境配置文件,文件格式为application-环境名称.properties。

最终application.properties文件内容如下

#默认启动dev环境
spring.profiles.active=dev
#调整web后台服务端口为9080,不设置默认为8080
server.port=9080
#mybatis配置文件地址
mybatis.config-location=classpath:mybatis/mybatis-config.xml
#mybatis mapper文件地址
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

application-dev.properties文件内容如下

#mysql数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/crane?autoReconnect=true&characterEncoding=UTF-8&useSSL=false&logger=com.mysql.cj.log.Slf4JLogger&profileSQL=true&maxQuerySizeToLog=8192
#数据库登录名,docker镜像中的数据库
spring.datasource.username=root
#数据库密码
spring.datasource.password=crane
#本机docker镜像中的redis
spring.redis.host=127.0.0.1
#当前环境下日志配置 输出到控制台
logging.config=classpath:logback-dev.xml
#启用所有类型的健康监控
management.endpoints.web.exposure.include=*

application-prod.properties文件内容如下(目前和dev环境只对日志文件做了区分,可根据实际需要调整)

#mysql数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/crane?autoReconnect=true&characterEncoding=UTF-8&useSSL=false&logger=com.mysql.cj.log.Slf4JLogger&profileSQL=true&maxQuerySizeToLog=8192
#数据库登录名,docker镜像中的数据库
spring.datasource.username=root
#数据库密码
spring.datasource.password=crane
#本机docker镜像中的redis
spring.redis.host=127.0.0.1
#当前环境下日志配置 输出到控制台
logging.config=classpath:logback-prod.xml
#启用所有类型的健康监控
management.endpoints.web.exposure.include=*

注意:配置数据库链接spring.datasource.url时需要注意,当前项目引用的mysql:mysql-connector-java为8.0.19版本,MySQL日志打印类Slf4JLogger类的路径为com.mysql.cj.log.Slf4JLogger,较老版本在com.mysql.jdbc.log.Slf4JLogger路径下。

2.2.1 Logback配置文件

dev环境对应logback配置文件logback-dev.xml内容如下,将日志输出到控制台。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%yellow([%date{yyyy-MM-dd HH:mm:ss.SSS}]) %highlight([%-5level]) %cyan([%thread])
                 - %msg [%logger{1}] \(%file:%line\) %n
            </pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

prod环境对应logback配置文件logback-prod.xml内容如下,将日志输出到文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>log/hbackend.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>
                log/hbackend-%d{yyyy-MM-dd}.log
            </FileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] - %msg [%logger{1}]
                \(%file:%line\) %n
            </pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="FILE"/>
    </root>
</configuration>

2.2.2 MyBatis配置文件

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>
    <typeAliases>
    </typeAliases>
</configuration>

3 简单案例

当前案例实现基础的Redis和MySQL操作,因为案例是模拟后端项目搭建过程,不涉及前端UI展示,所以一些接口使用Postman来测试可用性。项目源文件根文件夹下创建控制器类CommonController,用于为web请求提供数据响应,并设置控制器访问地址,如下

@RestController
@RequestMapping("/common")
public class CommonController {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
}

创建HResponse类,用于构造请求的响应结果,内容如下

public class HResponse {
    /**
     * 请求结果的状态
     */
    private int status;
    private String description;
    private Object data;
    public HResponse() {
    }
    public HResponse(int status, String description, Object data) {
        this.status = status;
        this.description = description;
        this.data = data;
    }
    public static HResponse success() {
        return new HResponse(200, "操作成功", null);
    }
    public static HResponse success(String description) {
        return new HResponse(200, description, null);
    }
    public static HResponse success(Object data) {
        return new HResponse(200, "success", data);
    }
    public static HResponse success(String description, Object data) {
        return new HResponse(200, description, data);
    }
    public static HResponse error(String description) {
        return new HResponse(400, description, null);
    }
    public static HResponse error(String description, Object data) {
        return new HResponse(400, description, data);
    }
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}

3.1 Redis案例

使用StringRedisTemplate对Redis进行基本操作,这里简单提供查询Redis的key值和设置Redis的key值两个操作,在CommonController中添加代码如下

	private final StringRedisTemplate redisTemplate;
    private final SqlSession sqlSession;
    public CommonController(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    @PostMapping("/getRedisValue")
    public HResponse getRedisValue(String key) {
        this.logger.info("请求获取redis key为:{} 的值", key);
        return HResponse.success(new JSONObject().fluentPut("key", key).fluentPut("value", this.redisTemplate.opsForValue().get(key)));
    }
    @PostMapping("/setRedisValue")
    public HResponse getRedisValue(String key, String value) {
        if (StringUtils.isBlank(key)) {
            return HResponse.error("键 不能为空");
        }
        if (StringUtils.isBlank(value)) {
            return HResponse.error("值 不能为空");
        }
        this.logger.info("请求设置redis key为:{} 的值为 {}", key, value);
        this.redisTemplate.opsForValue().set(key.trim(), value.trim());
        return HResponse.success();
    }

启动redis的docker容器并运行当前案例,使用Postman发送请求设置和查询redis中对应的key值,请求响应如下图

3.2 MySQL案例

简单介绍两种从MySQL查询数据的案例,JPA方式和MyBatis方式。先启动好MySQL的docker容器,然后创建表h_company并插入一条数据,最终数据表结果如下图:

3.2.1 JPA方式

构造HCompany数据库映射类和对应的数据库表访问接口CompanyRepository,内容如下:

@Entity
@Table(name = "h_company")
@Where(clause = "id > 0")
public class HCompany {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String shortName;
    private String address;
    private String tel;
    private String remark;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getShortName() {
        return shortName;
    }
    public void setShortName(String shortName) {
        this.shortName = shortName;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
}
@Repository
@Where(clause = "id > 0")
public interface CompanyRepository extends PagingAndSortingRepository<HCompany, Integer>, JpaRepository<HCompany, Integer> {
}

在控制器CommonController中添加使用CompanyRepository查询数据库的方法:

    @PostMapping("/getAllCompany")
    public HResponse getAllCompany() {
        return HResponse.success(this.companyRepository.findAll());
    }

使用Postman调用查询,响应如下

3.2.2 MyBatis方式

使用SqlSession接口访问数据库,创建company.xmlmapper文件,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="company">
    <select id="getAll" resultType="java.util.Map">
        select * from h_company
    </select>
</mapper>

控制器CommonController中添加通过MyBatis获取数据的方法,如下

    @PostMapping("/getAllCompanyByMybatis")
    public HResponse getAllCompanyByMybatis() {
        return HResponse.success(this.sqlSession.selectList("company.getAll"));
    }

重新启动项目,然后通过Postman访问,响应如下:

3.3 控制器完整代码

完成以上步骤后,控制器CommonController完整内容如下:

@RestController
@RequestMapping("/common")
public class CommonController {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    private final StringRedisTemplate redisTemplate;
    private final CompanyRepository companyRepository;
    private final SqlSession sqlSession;
    public CommonController(StringRedisTemplate redisTemplate, CompanyRepository companyRepository, SqlSession sqlSession) {
        this.redisTemplate = redisTemplate;
        this.companyRepository = companyRepository;
        this.sqlSession = sqlSession;
    }
    @PostMapping("/getRedisValue")
    public HResponse getRedisValue(String key) {
        this.logger.info("请求获取redis key为:{} 的值", key);
        return HResponse.success(new JSONObject().fluentPut("key", key).fluentPut("value", this.redisTemplate.opsForValue().get(key)));
    }
    @PostMapping("/setRedisValue")
    public HResponse getRedisValue(String key, String value) {
        if (StringUtils.isBlank(key)) {
            return HResponse.error("键 不能为空");
        }
        if (StringUtils.isBlank(value)) {
            return HResponse.error("值 不能为空");
        }
        this.logger.info("请求设置redis key为:{} 的值为 {}", key, value);
        this.redisTemplate.opsForValue().set(key.trim(), value.trim());
        return HResponse.success();
    }
    @PostMapping("/getAllCompany")
    public HResponse getAllCompany() {
        return HResponse.success(this.companyRepository.findAll());
    }
    @PostMapping("/getAllCompanyByMybatis")
    public HResponse getAllCompanyByMybatis() {
        return HResponse.success(this.sqlSession.selectList("company.getAll"));
    }
}

4 健康监测

案例启用了完整的项目监测,可通过http://localhost:9080/actuator查看,每个监测项都对应相应的查看链接,如下图。

5 项目结构

完成以上配置及案例后,项目结构如下图:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • IDEA下从零开始搭建SpringBoot工程的方法步骤

    SpringBoot的具体介绍可以参看其他网上介绍,这里就不多说了,就这几天的学习,个人理解,简而言之: (1)它是Spring的升级版,Spring容器能做到的事情,它都能做到,而且更简便,从配置形式上来说,SpringBoot完全抛弃了繁琐的XML文件配置方式,而是替代性地用注解方式来实现,虽然本质来说,是差不多的(类似包扫描,注解扫描,类加载之类). (2)SpringBoot集成的插件更多,从而使用很多服务,都只是引入一个依赖,几个注解和Java类就可以用了,具体的参考相关手册. (3)

  • 从零开始使用IDEA创建SpringBoot项目(图文)

    *注:此文章谨以记录学习过程,分享学习心得! 刚刚开始了解SpringBoot框架,觉得很好用,觉得很有必要深入学习一下该框架,现在就来创建一个SpringBoot项目: 1.在IDEA上新建一个Project,选择Spring Initializr, Project SDK 选择安装的JDK: Choose Initializr Service URL 选择默认(Default:https://start.spring.io) 选择项目模板 点击Next 2.进行项目配置 设置项目数组(gro

  • IDEA教程创建SpringBoot前后端分离项目示例图解

    目录 创建springboot项目 测试项目 按照MVC格式创建数据库项目 总结 springboot就是简化Spring应用中的初始化配置,快速创建项目而生的. 创建springboot项目 代开idea,点击File->New->Project,弹出如下对话框 输入组织.工程名,选择maven工程,注意:java版本号选择8 可以根据自己项目的需求选择依赖包,系统会自动将这些依赖包写入maven的pom文件,如下选择Spring Web.myBtias.mySQL驱动等.无需担心漏掉依赖包

  • Spring Boot:Idea从零开始初始化后台项目的教程

    目录 1 创建项目 1.1 填写项目基本信息 1.2 选择项目集成功能 2 项目基础配置 2.1 gradle文件配置 2.2 环境文件配置 2.2.1 Logback配置文件 2.2.2 MyBatis配置文件 3 简单案例 3.1 Redis案例 3.2 MySQL案例 3.2.1 JPA方式 3.2.2 MyBatis方式 3.3 控制器完整代码 4 健康监测 5 项目结构 官方提供了Springboot初始化工具可直接在线生成项目文件,然后下载并导入开发工具中 .这里记录通过Mac版 I

  • Spring Boot 直接用jar运行项目的方法

    概述 在 Spring Boot 开篇-创建和运行 一文中,介绍了如何创建一个Sprint Boot项目并且运行起来.但是运行的方式是在IDEA中直接Run起来的.还有另一中方式可以可以把Spring Boot程序运行起来,就是直接在命令行中执行jar包. 打成jar包 以往的WEB程序需要打成WAR包,部署到Tomcat上,而Spring Boot支持打包成JAR的形式,就算是JAR里面包含图片.页面等,也是支持的.另外使用JAR包的方式也方便部署到Docker上. 要想把Spring Boo

  • spring boot+thymeleaf+bootstrap实现后台管理系统界面

    最近在学spring boot ,学习一个框架无非也就是使用它来做以前做的事情,两者比较才有不同,说一下自己使用的体会. 先来说下spring boot ,微框架.快速开发,相当于零配置,从一个大神那看来的说:spring boot 相当于框架的框架 ,就是集成了很多,用哪个添加哪个的依赖就行,这样的话自己看不到配置,对于习惯了使用配置刚使用spring boot的开发者来说可能还有点不习惯,什么都不用配,看不到配置感觉对项目整体架构有点陌生,再说在spring boot 中使用 thymele

  • Spring Boot + Vue 前后端分离项目如何踢掉已登录用户

    上篇文章中,我们讲了在 Spring Security 中如何踢掉前一个登录用户,或者禁止用户二次登录,通过一个简单的案例,实现了我们想要的效果. 但是有一个不太完美的地方,就是我们的用户是配置在内存中的用户,我们没有将用户放到数据库中去.正常情况下,松哥在 Spring Security 系列中讲的其他配置,大家只需要参考Spring Security+Spring Data Jpa 强强联手,安全管理只有更简单!一文,将数据切换为数据库中的数据即可. 本文是本系列的第十三篇,阅读前面文章有助

  • Spring Boot利用Thymeleaf发送Email的方法教程

    前言 众所周知,现在在后台服务器中发送邮件已经是一个非常常用的功能了.通常来说虽然HTML并非是一个非常标准的信息格式,但是至少许多邮件客户端都至少支持一部分标记语言. 在这边教程中主要是关于教你如何在Spring Boot 应用中发送邮件以及使用非常简单强大的Thymeleaf模板引擎来制作邮件内容. 文章末尾附上源码,已经开源到Github上,是我公司做项目的时候处理邮件这一块用到的. 基本上覆盖了大部分邮件发送需求.稍微修改了一下,奉献给有需要的人.当你看完文章在看一下这封源码,你会对这一

  • Spring Boot 快速搭建微服务框架详细教程

    前言: SpringBoot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置. 简单来说,它提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题---习惯大于约定. Spring Boot默认使用tomcat作为服务器,使用logback提供日志记录. Spring Boot的主要优点: 为所有Spring开发者更快的入门 开箱即用,提供各种默认配置来简化项目配置 内嵌式容器简化Web项目 没有冗余代码生成和XM

  • Spring Boot中使用JDBC Templet的方法教程

    前言 Spring 的 JDBC Templet 是 Spring 对 JDBC 使用的一个基本的封装.他主要是帮助程序员实现了数据库连接的管理,其余的使用方式和直接使用 JDBC 没有什么大的区别. 业务需求 JDBC 的使用大家都比较熟悉了.这里主要为了演示在 SpringBoot 中使用 Spring JDBC Templet 的步骤,所以我们就设计一个简单的需求.一个用户对象的 CURD 的操作.对象有两个属性,一个属性是id,一个属性是名称.存储在 MySQL 的 auth_user

  • Spring Boot整合Mybatis Plus和Swagger2的教程详解

    前言:如果你是初学者,请完全按照我的教程以及代码来搭建(文末会附上完整的项目代码包,你可以直接下载我提供的完整项目代码包然后自行体验!),为了照顾初学者所以贴图比较多,请耐心跟着教程来,希望这个项目Demo能给你一些帮助,如果觉得写的还可以请给个关注和点赞,谢谢! 题外话:这是我第一篇用markdown来写的博文,格式不好的地方请见谅 一.pom.xml和application.yml 1.pom.xml中添加相关依赖,这里我把我的pom.xml代码贴出来 <?xml version="1

  • Spring Boot统一处理全局异常的实战教程

    目录 注解的介绍 @ControllerAdvice @ExceptionHandler拦截异常并统一处理 代码实现 自定义异常 统一异常处理 前端返回值类 测试用例 附:Spring Boot默认的异常处理机制 总结 注解的介绍 @ControllerAdvice @ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理. 这里ControllerAdvice也可以这么理解,其抽象级别应该是

  • Spring Boot请求处理之常用参数注解使用教程

    目录 请求处理-SpringBoot常用参数注解使用 1.@PathVariable注解 2.@RequestHeader注解 3.@RequestParam注解 4.@CookieValue注解 5.@RequestAttribute注解 6.@RequestBody注解 7.@MatrixVariable与UrlPathHelper 7.1.基本简介 7.2.MatrixVariable注解 7.3.使用细节 7.3.1.WebMvcAutoConfiguration自动装配 7.3.2.U

随机推荐