讀取數據庫內容,並在頁面渲染


一、准備過程

  • 安裝MySQL並且配置環境。
  • 准備SpringBoot的編譯環境(由於之前一直使用的社區版IDEA,但是社區版暫未找到支持SpringBoot的相關插件,所以重新安裝的旗艦版)。

二、計划安排

  • 由於大二學習的知識儲備有限,本次作業目標需要使用Spring Boot,axios以及vue的相關知識,所以通過b站上的教學視頻進行入門學習。
  • 由於時間比較緊張,沒辦法把視頻全部看完, 所以只好先通過關鍵的章節學習最基礎的知識,之后邊學邊做,在實現目標的過程中再通過視頻,百度,CSDN等網站進行補充。

三、實現過程

1.通過mySQL創建表。

DROP TABLE IF EXISTS `edu_paper`;
CREATE TABLE `edu_paper`  (
  `id` char(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '本段ID',
  `parent_id` varchar(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '父段落ID',
  `sort` varchar(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '排序',
  `title` varchar(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '標題',
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '內容',
  `is_deleted` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '邏輯刪除 1(true)已刪除, 0(false)未刪除',
  `gmt_create` datetime NOT NULL COMMENT '創建時間',
  `gmt_modified` datetime NOT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '論文' ROW_FORMAT = Dynamic;

INSERT INTO `edu_paper` VALUES ('4587', '0', '0', '第1章 緒論', '/', 0, '2021-07-19 23:07:45', '2021-07-19 23:07:47');
INSERT INTO `edu_paper` VALUES ('4588', '0', '0', '第2章 技術背景介紹', '/', 0, '2021-07-19 23:11:34', '2021-07-19 23:11:36');
INSERT INTO `edu_paper` VALUES ('8888', '4587', '1', '1.1 研究背景', '“大數據”已經成為互聯網信息技術行業的流行詞匯,信息技術廣泛應用。大數據帶來的信息風暴正在變革我們的生活、工作和思維[1]。大數據的數據來源眾多,數據類型豐富,包括結構化和非結構化數據。但面對如此眾多的數據,如何通過一系列的分析與挖掘,解決各種各樣的難題,從數據中得到對我們有幫助的信息,需要通過長時間的研究才能得到答案。', 0, '2021-07-19 23:08:43', '2021-07-19 23:08:46');
INSERT INTO `edu_paper` VALUES ('8889', '4587', '2', '1.2 研究意義', '自然語言理解(在此指書面語言的計算機理解)也稱自然語言處理,它是計算語言學的分支,是人工智能研究中一個十分活躍的領域,自然語言理解從簡單的語言信息處理到理解篇章,會話,走向認知科學,經歷了二十年的發展歷程[2]。隨着高科技的迅速發展,其應用深入人們生活的各個方面[3]。對於本課題來說,使用自然處理技術對招聘文本進行分析的價值在於,一是對於大學生學習來說,這個模型可以幫助他們加強技術的學習;二是對於大學生就業,當面對海量招聘信息無法確定最合適自己的崗位時,這個模型可以根據自身所學的技術推薦合適的崗位;三是對於學院的學科建設,由於計算機技術每年變動較大,這個模型可以幫助老師調整教學計划,跟上社會的技術變動。', 0, '2021-07-19 23:09:24', '2021-07-19 23:09:26');
INSERT INTO `edu_paper` VALUES ('8890', '4587', '3', '1.3 研究內容', '本課題是基於NLP的招聘文本分析與挖掘,使用數據預處理、文本向量化、自然語言處理(NLP)、關聯分析等技術對招聘文本進行分析與挖掘。主要內容為:提取所需數據,去除“臟數據”,對數據進行分句分詞操作。進行文本向量化操作。利用K-Means聚類算法獲取技術名詞列表。', 0, '2021-07-19 23:10:39', '2021-07-19 23:10:42');
INSERT INTO `edu_paper` VALUES ('8891', '4588', '1', '2.1 Word2vec', 'Word2vec是Google在2013年提出的用於快速有效地訓練詞向量的模型[4]。通過將文本數據輸入到一個學習模型中,Word2vec輸出的詞向量可以表示為一大段文本,甚至整篇文章[5]。word2vec有連續詞袋模型(Continuous bag-of-words,CBOW)和Skip - Gram兩種模型。word2vec能夠將文本詞語轉化為向量空間中的向量,而向量的相似度可以表示文本語義的相似度[6]。Xxxxxxx', 0, '2021-07-19 23:12:22', '2021-07-19 23:12:25');
INSERT INTO `edu_paper` VALUES ('8892', '4588', '2', '2.2 K-Means聚類', 'K-Means算法是聚類算法中主要算法之一,它是一種基於划分的聚類算法[7]。K-Means算法因其在大型數據集聚類方面的效率而聞名[8]。', 0, '2021-07-19 23:13:26', '2021-07-19 23:13:29');
INSERT INTO `edu_paper` VALUES ('8893', '4588', '3', '2.3 關聯分析', '關聯規則是數據挖掘中一種重要的挖掘方法,可發現被研究對象與對研究對象有影響的各因素之間的關聯關系[9]。', 0, '2021-07-19 23:14:17', '2021-07-19 23:14:19');

SET FOREIGN_KEY_CHECKS = 1;

image

2.使用SpringBoot框架搭建后端接口

本接口的目標是接收從前端傳入的id,返回該章節的標題及其子章節的詳細內容。

首先是配置配置文件。

# springboot 核心配置文件

# 更改項目端口號
server.port=3000

#數據庫相關配置
spring.datasource.url=jdbc:mysql://localhost:3306/paper?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=0000
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true

由於是跳過Spring的學習直接觀看SpringBoot的教學視頻,很多知識點不知道調用原理,暫時只能模仿視頻中的做法來。關於Spring中的@RestController,@RequestMapping等標簽,都還停留在“能跑起來就算成功”的水平。

本接口的主要目的是返回查詢的id內容,因此主要是通過調用SQL查詢語句實現。雖然以前學過JDBC,但是由於上網查找資料時找到為SpringBoot封裝的jdbcTemplate類,還是嘗試使用了新知識實現。

遇到的問題:

在調用jdbcTemplate下的方法時,直接通過String傳入SQL指令可能會導致注入等問題。雖然可以直接查找全表然后用循環對表內所有數據進行查找,但明顯效率會降低。
image

最后的解決方案是在調用jdbcTemplate中的queryForList方法時,直接通過重載的方法導入占位符。這樣不僅可以防止SQL注入,同時也解決了傳入參數不符合條件時的SQLSyntaxErrorException異常問題。
image

image

由於最終要返回篩選出來的內容,因此最終返回的應該是一個包含所需數據的對象。由於對象的內部還包含有樹狀層次的集合對象,所以封裝了兩個POJO類,分別存儲不同級別的數據。

image

本題其實返回一個對象數據即可,不過考慮到未來可能會需要篩選出多個結果,我還是將篩選的對象封裝到集合中傳出。

@RestController
public class TestController {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @CrossOrigin
    @GetMapping("/submit")
    public List<OneSubject> test(@RequestParam("id") String id) {
        String sql1 = "SELECT * FROM edu_paper where id= ? ";
        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql1,id);
        ArrayList<OneSubject> finalList = new ArrayList<>();
        for (Map<String, Object> map : maps) {
            OneSubject oneSubject = new OneSubject();
            oneSubject.setId(map.get("id").toString());
            oneSubject.setText(map.get("title").toString());
            String sql2 = "SELECT * FROM edu_paper where parent_id= ? ";
            List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sql2,oneSubject.getId());
            for (Map<String, Object> map2 : maps2) {
                TwoSubject twoSubject = new TwoSubject();
                twoSubject.setId(map2.get("id").toString());
                twoSubject.setTitle(map2.get("title").toString());
                twoSubject.setText(map2.get("content").toString());
                List<TwoSubject> children = oneSubject.getChildren();
                children.add(twoSubject);
            }
            finalList.add(oneSubject);
        }
        return finalList;
    }
}

3.搭建界面以及使用Axios實現前后端交互

界面的搭建需要導入vue和axios兩個js文件。通過axios實現前后端數據的交互,然后通過vue將結果渲染到界面上。

首先在方法里通過get方法將數據傳入url指向的后端接口,再利用then接收返回的結果。

image

對界面上的主要難點是在axios的交互與渲染網頁時的問題。這里出現的問題是在標簽上。一開始我嘗試使用li標簽,將結果在界面上顯示。但是由於我返回的是一個多層嵌套的集合,子對象下還有一層集合需要顯示。由於li元素之間的獨立性(這塊原理我其實不清楚),導致兩層循環之間的數據無法交互。

image
image

解決方案是將容器換成div,就可以正常執行了。

image

四 、參考資料

【狂神說Java】SpringBoot最新教程IDEA版通俗易懂

尚硅谷_谷粒學院-微服務+全棧在線教育實戰項目

CSDN


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM