这几天学了一下springboot, 直接讲一下怎么迅速搭建一个项目

创建项目

在https://start.spring.io/中创建好一个项目, 选好依赖, (如果没有你想要的spring版本, 随便选一个即可, 之后在pom.xml中更改), 生成一个压缩包, 解压, 用IDEA打开. 我的spring boot版本是2.5.4

导入依赖

有的依赖在https://start.spring.io/中找不到, 可以在https://mvnrepository.com/中搜索, 然后在pom.xml增加依赖, 以下是常用的需要增加的依赖


		<dependency>
			<groupId>com.baomidougroupId>
			<artifactId>mybatis-plus-boot-starterartifactId>
			<version>3.4.3version>
		dependency>
		
		<dependency>
			<groupId>com.alibabagroupId>
			<artifactId>druidartifactId>
			<version>1.2.6version>
		dependency>
		
		<dependency>
			<groupId>org.projectlombokgroupId>
			<artifactId>lombokartifactId>


		dependency>

配置项目

然后写配置文件application.yml, 以下是一个常用配置

server:
  port: 80
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/ssm_db?servierTimezone=UTC
      username: root
      password: root
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_
      id-type: auto
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

实体类

根据你的数据库的表来创建, 有多少表就有多少个类; 表中有几个字段, 就有几个类变量

一般在domain目录下

package com.itheima.domain;
// lombok简化开发, 无需手写setter, getter, tostring...方法
// 实体类
import lombok.Data;
@Data
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
}

数据层

对数据库CRUD的函数

一般在dao目录下, 继承BaseMapper, 就自动有CRUD功能!

package com.itheima.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.domain.Book;
import org.apache.ibatis.annotations.Mapper;
// 用MP就可以自动增删改查, 不用写其他代码!!!
// 数据层
@Mapper
public interface BookDao extends BaseMapper {
}

分页

这里有一个特殊操作, 建立configMpConfig类

package com.itheima.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// 必须有, 不然分页不行, 不用细究
@Configuration
public class MPConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor() {
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mpInterceptor;}}

条件查询

LambdaQueryWrapper对象了解一下

业务层

要实现的功能(登录, 注册...)

在service目录下写接口IBookService, 直接继承IService即可

package com.itheima.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.domain.Book;

// 就像数据层一样, 业务层也可以用mybatisplus提供的接口, 这样基本的增删改查...就不用自己写
public interface IBookService extends IService {
    IPage getPage(int currentPage, int pageSize);
}

然后在service.impl目录下创建BookServiceImpl类实现接口, 直接继承ServiceImpl即可

package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.dao.BookDao;
import com.itheima.domain.Book;
import com.itheima.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

// 实现业务层的接口
@Service
public class BookServiceImpl extends ServiceImpl implements IBookService {
    @Autowired
    private BookDao bookDao;
    @Override
    public IPage getPage(int currentPage, int pageSize) {
        Page page = new Page(currentPage,pageSize);
        bookDao.selectPage(page,null);
        return page;
    }
}

当然自己在接口里定义方法, 然后在类里实现也是完全可以的

表现层

表现层就是进行路由, postman测试接口的时候, 就是直接和表现层的方法交互

表现层在controller目录下

package com.itheima.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.controller.utils.R;
import com.itheima.domain.Book;
import com.itheima.service.BookService;
import com.itheima.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

// 表现层
@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private IBookService bookService;
    @GetMapping
    public R getAll() {
        return new R(true, bookService.list());
    }
    @PostMapping
    public R save(@RequestBody Book book) { //请求体参数@RequestBody
        return new R(bookService.save(book));
    }
    @PutMapping
    public R update(@RequestBody Book book) {
        return new R(bookService.updateById(book));
    }
    @GetMapping("{id}")
    public R delete(@PathVariable Integer id) {// 表示从路径中获取的变量
        return new R(bookService.removeById(id));
    }
    @GetMapping("{id}")
    public R getById(@PathVariable Integer id) {
        return new R(true,bookService.getById(id));
    }
    @GetMapping("{currentPage}/{pageSize}")
    public R getPage(@PathVariable int currentPage,@PathVariable int pageSize) {
        return new R(true, bookService.getPage(currentPage,pageSize));
    }
}

注意这里的url名, 是restful风格

还有注意这里的R类, 实现在controller.utils里, 是为了统一返回给前端的格式

package com.itheima.controller.utils;

import lombok.Data;
// 用一个R对象, 统一向前端的返回值
// {"flag":"true","data":...}
@Data
public class R {
    private Boolean flag;
    private Object data;

    public R(){}
    public R(Boolean flag) {
        this.flag=flag;
    }
    public R(Boolean flag, Object data) {
        this.flag=flag;
        this.data=data;
    }
}

测试

不表