浅尝辄止的springboot项目


上一步IDEA配置:
配置IDEA开发浅尝辄止的springboot项目


一、看资料

和Vue交互的,超nice:Vue + Spring Boot 项目实战(一):项目简介

使用IDEA搭建一个简单的SpringBoot项目——详细过程

application.properties与application.yml之间的区别

@RequestBody的使用

IDEA提示Loading class `com.mysql.jdbc.Driver’. This is deprecated.

后端URL解码

JPA:java.sql.SQLSyntaxErrorException: Unknown column ‘book0_.book_id’ in ‘field list’

后端调试的工具:浏览器开发者工具和Postman

npm报错Module build failed: Error: Cannot find module ‘node-sass’
Java (十三)Java web:GSON的学习

二、结论

1.配置文件

(1)pom.xml

<?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.2.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.sand</groupId>
	<artifactId>alphon</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>mandarin</name>
	<description>Library project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.2</version>
		</dependency>
		<!-- 热部署 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional>
		</dependency>
		<!-- redis -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

		<!-- 连数据库 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<!-- jpa-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<!-- elastic search -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>
		<dependency>
			<groupId>net.sourceforge.nekohtml</groupId>
			<artifactId>nekohtml</artifactId>
			<version>1.9.22</version>
		</dependency>
		<!-- tomcat的支持.-->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<version>8.5.23</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.8.6</version>
		</dependency>


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

(2)applicaton.yaml

# 后端端口
server:
  port: 8443

# spring配置
spring:
  # 数据库
  datasource:
    url: jdbc:mysql://localhost:3306/mandarin?useSSL=false&serverTimezone=UTC&&allowPublicKeyRetrieval=true #url
    username: root
    password: 1234
    # 注意是cj
    driver-class-name: com.mysql.cj.jdbc.Driver
  # jpa自动数据库
  jpa:
    hibernate:
      ddl-auto: none
    # 可不写,在控制台显示sql语句好调试
    show-sql: true

2.四层结构

金字塔嵌套↓:

  • Model:同数据库表
  • Dao:增删查改的sql操作封装
  • Service:业务操作。组合调用相关的sql
  • Controller:解析请求中的数据,进行业务操作,返回特定格式的响应结果。

(1)Model:Book

package com.sand.alphon.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import javax.persistence.*;

@Entity
@Table(name = "book")
@JsonIgnoreProperties({"handler","hibernateLazyInitializer"})
public class Book {
    // 图书馆登记书籍唯一id
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "bookid")
    private int bookId;

    // 书名,不唯一
    @Column(name = "bookname")
    private String bookName;

    // 作者名
    private String author;

    // 出版时间,yyyy-mm-dd
    @Column(name = "publictime")
    private String publicTime;

    // 出版社
    private String press;

    // 书籍所在图书馆地址(楼层-书架-书架上的书号)
    private String location;

    // 借阅状态: 0 :在馆可借   1:在馆预约   2:借出
    private int status;

    // 为了简单改成只有单个所属类别
    private String category;

    // 价格
    private double price;

    public Book() {
    }

    public int getBookId() {
        return bookId;
    }

    public void setBookId(int bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPublicTime() {
        return publicTime;
    }

    public void setPublicTime(String publicTime) {
        this.publicTime = publicTime;
    }

    public String getPress() {
        return press;
    }

    public void setPress(String press) {
        this.press = press;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

(2)Dao:BookDAO

package com.sand.alphon.dao;

import com.sand.alphon.model.Book;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

// 继承JPA,自动数据库操作
public interface BookDAO extends JpaRepository<Book,Integer> {
    Book findByBookId(int bookId);

    List<Book> findAllByBookName(String bookName);
}

(3)Service:BookService

package com.sand.alphon.service;

import com.sand.alphon.dao.BookDAO;
import com.sand.alphon.model.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

// 表明是Service服务
@Service
public class BookService {
    // 自动注入
    @Autowired
    BookDAO bookDAO;

    // 检测存在与否
    public boolean isExist(int bookId){
        Book book = bookDAO.findByBookId(bookId);
        return book!=null;
    }

    // 查询
    public Book findByBookId(int bookId){
        return bookDAO.findByBookId(bookId);
    }

    // 查询
    public List<Book> findAllByBookName(String bookName){
        return bookDAO.findAllByBookName(bookName);
    }

    // 添加
    public void add(Book book){ bookDAO.save(book);
    }
}

(4)Controller:BookController

package com.sand.alphon.controller;


import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.sand.alphon.model.Book;
import com.sand.alphon.jsonModel.BookResult;
import com.sand.alphon.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// RestController = ResponseBody + Controller
@RestController
public class BookController {
    // 自动注入
    @Autowired
    BookService bookService;

    /*
     * 跨域,交互前端
     * 对应前端的method + url
     * 返回结果是json格式
     */
    @CrossOrigin
    @PostMapping("/api/searchBook")
    @ResponseBody
    public BookResult searchBook(@RequestBody String jsonString){
        // 莫名奇妙地传来的数据多个"="
        jsonString = jsonString.substring(0,jsonString.length()-1);


        try {
            jsonString = java.net.URLDecoder.decode(jsonString,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        System.out.println(jsonString);

        // 解析Json中传来的书名
        Gson gson = new Gson();
        Map<String,String> map = gson.fromJson(jsonString, new TypeToken<HashMap<String,String>>(){}.getType());
        String bookName = map.get("keyWord");

        // 返回的json结构:BookResult
        BookResult bookResult = new BookResult();
        List<Book> bookList = bookService.findAllByBookName(bookName);
        // 不能用"!=null",是true
        if(bookList.size()!=0){
            bookResult.setStatus("200");
            bookResult.setErrorMessage(null);
            bookResult.setBooks(bookList);
        }else {
            bookResult.setStatus("0");
            bookResult.setErrorMessage("none");
            bookResult.setBooks(null);
        }
        return bookResult;

    }
}

(5)jsonModel(放Model太乱了)

package com.sand.alphon.jsonModel;

import com.sand.alphon.model.Book;

import java.util.List;

public class BookResult {
    // 0:查询失败;200:查询成功
    private String status;

    // 查询失败错误信息
    private String errorMessage;

    // 书籍列表
    private List<Book> books;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(List<Book> books) {
        this.books = books;
    }
}
发布了486 篇原创文章 · 获赞 204 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/sandalphon4869/article/details/105492176
今日推荐