浅尝辄止的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的学习


系统学习:
B站springboot

二、结论

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:User

package com.sand.alphon.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import jdk.nashorn.internal.objects.annotations.Getter;

import javax.persistence.*;

@Entity
public class User {
    @Id
    @Column(name = "userid")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int userId;

    private String password;

    private String name;

    private int sex;

    private int age;

    private String email;

    @Column(name = "phonenum")
    private String phoneNum;

    private String type;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

(2)Dao:UserDAO

package com.sand.alphon.dao;

import com.sand.alphon.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;


public interface UserDAO extends JpaRepository<User,Integer> {
    // 根据userName查找
    List<User> findAllByName(String name);
}

(3)Service:BookService

package com.sand.alphon.service;

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

@Service
public class UserService {
    @Autowired
    UserDAO userDAO;

    /*
     * 增
     * 因为是不指定userId,而是自增,所以不检查存在与否
     * 使用save()不能获得新增的主键userId,因为没真正提交,要使用saveAndFlush
     */
    public User add(User user){
        return userDAO.saveAndFlush(user);
    }

    /*
     * 删
     * 先返回存在与否(不存在就是删除失败),然后删除
     */
    public boolean delete(int userId){
        // 表示没有,你删错了
        if(!userDAO.existsById(userId)){
            return false;
        }
        userDAO.deleteById(userId);
        return true;
    }


    /*
     * 查
     * 返回User类
     */
    public User findByUserId(User user){
        return userDAO.findById(user.getUserId()).orElse(null);
    }

    /*
     * 改
     * saveAndFlush()本来就能做到不存在插入新的,存在更新旧的。
     * 我们只想更新一个旧值,而不是整一个新的输错的值。
     */
    public boolean edit(User user){
        if(userDAO.existsById(user.getUserId())){
            userDAO.saveAndFlush(user);
            return true;
        }else {
            return false;
        }
    }
}

(4)Controller:UserController

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.ResultList;
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 ResultList 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
        ResultList<Book> resultList = new ResultList<>();
        List<Book> bookList = bookService.findAllByBookName(bookName);
        // 不能用"!=null",是true
        if(bookList.size()!=0){
            resultList.setStatus("200");
            resultList.setErrorMessage(null);
            resultList.setList(bookList);
        }else {
            resultList.setStatus("0");
            resultList.setErrorMessage("none");
            resultList.setList(null);
        }
        return resultList;

    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值