溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

發(fā)布時(shí)間:2021-12-21 15:10:13 來(lái)源:億速云 閱讀:138 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要為大家展示了“Spring Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Spring Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目”這篇文章吧。

    1 創(chuàng)建項(xiàng)目

    1.1 填寫(xiě)項(xiàng)目基本信息

    打開(kāi)Idea創(chuàng)建項(xiàng)目,如下圖:

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    1.2 選擇項(xiàng)目集成功能

    完成基本信息配置,在Web,SQL,NoSQL,Ops選項(xiàng)中,選擇對(duì)應(yīng)的模塊依賴(lài),最終選擇如圖以下幾項(xiàng):

    • Spring Web 用于提供web相關(guān)功能

    • Spring Data JPA用于提供數(shù)據(jù)庫(kù)相關(guān)操作

    • MyBatis Framework用于通過(guò)MyBatis操作數(shù)據(jù)庫(kù)

    • Spring Data Redis 用于提供Redis相關(guān)功能

    • Spring Boot Actuator 用于提供應(yīng)用的健康監(jiān)測(cè)功能

    設(shè)置完成后,點(diǎn)擊下一步,Idea開(kāi)始初始化項(xiàng)目文件。

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    2 項(xiàng)目基礎(chǔ)配置

    通過(guò)上面步驟,已生成項(xiàng)目結(jié)構(gòu)文件,等待開(kāi)發(fā)環(huán)境自動(dòng)構(gòu)建好依賴(lài)庫(kù)后可繼續(xù)后續(xù)的工作。

    2.1 gradle文件配置

    當(dāng)前項(xiàng)目使用gradle管理項(xiàng)目依賴(lài),默認(rèn)情況下,使用官方的依賴(lài)庫(kù),國(guó)內(nèi)訪(fǎng)問(wèn)較慢,可替換為阿里云倉(cāng)庫(kù)。在build.gradle文件的repositories節(jié)點(diǎn)下添加阿里云倉(cāng)庫(kù)訪(fǎng)問(wèn)地址,設(shè)置完成后如下

    repositories {
        //使用阿里云倉(cāng)庫(kù),提高國(guó)內(nèi)依賴(lài)庫(kù)下載速度
        maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
        mavenCentral()
    }

    另外,添加其它常用依賴(lài)庫(kù),最終依賴(lài)包如下

    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'
        //數(shù)據(jù)庫(kù)配置的日志類(lèi)com.mysql.cj.log.Slf4JLogger在這個(gè)包中
        runtime('mysql:mysql-connector-java')
        testImplementation('org.springframework.boot:spring-boot-starter-test') {
            exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        }
    }

    2.2 環(huán)境文件配置

    官方初始化器默認(rèn)會(huì)在resources資源文件夾下生成一個(gè)application.properties文件,這里調(diào)整一下配置文件結(jié)構(gòu)。在resources資源文件夾下創(chuàng)建config文件夾,移動(dòng)application.properties文件到config文件夾下,同時(shí)在config文件夾下創(chuàng)建application-dev.properties文件和application-prod.properties文件,分別對(duì)應(yīng)開(kāi)發(fā)環(huán)境和線(xiàn)上環(huán)境的配置,可根據(jù)需要增加其它環(huán)境配置文件,文件格式為application-環(huán)境名稱(chēng).properties。

    最終application.properties文件內(nèi)容如下

    #默認(rèn)啟動(dòng)dev環(huán)境
    spring.profiles.active=dev
    #調(diào)整web后臺(tái)服務(wù)端口為9080,不設(shè)置默認(rèn)為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文件內(nèi)容如下

    #mysql數(shù)據(jù)庫(kù)連接
    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
    #數(shù)據(jù)庫(kù)登錄名,docker鏡像中的數(shù)據(jù)庫(kù)
    spring.datasource.username=root
    #數(shù)據(jù)庫(kù)密碼
    spring.datasource.password=crane
    #本機(jī)docker鏡像中的redis
    spring.redis.host=127.0.0.1
    #當(dāng)前環(huán)境下日志配置 輸出到控制臺(tái)
    logging.config=classpath:logback-dev.xml
    #啟用所有類(lèi)型的健康監(jiān)控
    management.endpoints.web.exposure.include=*

    application-prod.properties文件內(nèi)容如下(目前和dev環(huán)境只對(duì)日志文件做了區(qū)分,可根據(jù)實(shí)際需要調(diào)整)

    #mysql數(shù)據(jù)庫(kù)連接
    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
    #數(shù)據(jù)庫(kù)登錄名,docker鏡像中的數(shù)據(jù)庫(kù)
    spring.datasource.username=root
    #數(shù)據(jù)庫(kù)密碼
    spring.datasource.password=crane
    #本機(jī)docker鏡像中的redis
    spring.redis.host=127.0.0.1
    #當(dāng)前環(huán)境下日志配置 輸出到控制臺(tái)
    logging.config=classpath:logback-prod.xml
    #啟用所有類(lèi)型的健康監(jiān)控
    management.endpoints.web.exposure.include=*

    注意:配置數(shù)據(jù)庫(kù)鏈接spring.datasource.url時(shí)需要注意,當(dāng)前項(xiàng)目引用的mysql:mysql-connector-java為8.0.19版本,MySQL日志打印類(lèi)Slf4JLogger類(lèi)的路徑為com.mysql.cj.log.Slf4JLogger,較老版本在com.mysql.jdbc.log.Slf4JLogger路徑下。

    2.2.1 Logback配置文件

    dev環(huán)境對(duì)應(yīng)logback配置文件logback-dev.xml內(nèi)容如下,將日志輸出到控制臺(tái)。

    <?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環(huán)境對(duì)應(yīng)logback配置文件logback-prod.xml內(nèi)容如下,將日志輸出到文件。

    <?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文件內(nèi)容如下,目前沒(méi)有任何配置,全部使用默認(rèn)配置。

    <?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 簡(jiǎn)單案例

    當(dāng)前案例實(shí)現(xiàn)基礎(chǔ)的Redis和MySQL操作,因?yàn)榘咐悄M后端項(xiàng)目搭建過(guò)程,不涉及前端UI展示,所以一些接口使用Postman來(lái)測(cè)試可用性。項(xiàng)目源文件根文件夾下創(chuàng)建控制器類(lèi)CommonController,用于為web請(qǐng)求提供數(shù)據(jù)響應(yīng),并設(shè)置控制器訪(fǎng)問(wèn)地址,如下

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

    創(chuàng)建HResponse類(lèi),用于構(gòu)造請(qǐng)求的響應(yīng)結(jié)果,內(nèi)容如下

    public class HResponse {
        /**
         * 請(qǐng)求結(jié)果的狀態(tài)
         */
        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對(duì)Redis進(jìn)行基本操作,這里簡(jiǎn)單提供查詢(xún)Redis的key值和設(shè)置Redis的key值兩個(gè)操作,在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("請(qǐng)求獲取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("請(qǐng)求設(shè)置redis key為:{} 的值為 {}", key, value);
            this.redisTemplate.opsForValue().set(key.trim(), value.trim());
            return HResponse.success();
        }

    啟動(dòng)redis的docker容器并運(yùn)行當(dāng)前案例,使用Postman發(fā)送請(qǐng)求設(shè)置和查詢(xún)r(jià)edis中對(duì)應(yīng)的key值,請(qǐng)求響應(yīng)如下圖

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    3.2 MySQL案例

    簡(jiǎn)單介紹兩種從MySQL查詢(xún)數(shù)據(jù)的案例,JPA方式和MyBatis方式。先啟動(dòng)好MySQL的docker容器,然后創(chuàng)建表h_company并插入一條數(shù)據(jù),最終數(shù)據(jù)表結(jié)果如下圖:

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    3.2.1 JPA方式

    構(gòu)造HCompany數(shù)據(jù)庫(kù)映射類(lèi)和對(duì)應(yīng)的數(shù)據(jù)庫(kù)表訪(fǎng)問(wèn)接口CompanyRepository,內(nèi)容如下:

    @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查詢(xún)數(shù)據(jù)庫(kù)的方法:

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

    使用Postman調(diào)用查詢(xún),響應(yīng)如下

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    3.2.2 MyBatis方式

    使用SqlSession接口訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),創(chuàng)建company.xmlmapper文件,內(nèi)容如下

    <?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中添加通過(guò)MyBatis獲取數(shù)據(jù)的方法,如下

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

    重新啟動(dòng)項(xiàng)目,然后通過(guò)Postman訪(fǎng)問(wèn),響應(yīng)如下:

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    3.3 控制器完整代碼

    完成以上步驟后,控制器CommonController完整內(nèi)容如下:

    @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("請(qǐng)求獲取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("請(qǐng)求設(shè)置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 健康監(jiān)測(cè)

    案例啟用了完整的項(xiàng)目監(jiān)測(cè),可通過(guò)http://localhost:9080/actuator查看,每個(gè)監(jiān)測(cè)項(xiàng)都對(duì)應(yīng)相應(yīng)的查看鏈接,如下圖。

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    5 項(xiàng)目結(jié)構(gòu)

    完成以上配置及案例后,項(xiàng)目結(jié)構(gòu)如下圖:

    Spring?Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目

    以上是“Spring Boot中Idea如何從零開(kāi)始初始化后臺(tái)項(xiàng)目”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI