SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過(guò)程(后端)
數(shù)據(jù)庫(kù)準(zhǔn)備
data_test.sql:
/* SQLyog Enterprise v12.08 (64 bit) MySQL - 5.7.31 : Database - data_test ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; CREATE DATABASE /*!32312 IF NOT EXISTS*/`data_test` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `data_test`; /*Table structure for table `user` */ DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(50) CHARACTER SET utf8 NOT NULL COMMENT '賬號(hào)', `password` varchar(50) CHARACTER SET utf8 NOT NULL COMMENT '密碼', `user_state` varchar(10) CHARACTER SET utf8 NOT NULL DEFAULT '1' COMMENT '狀態(tài),邏輯刪除', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; /*Data for the table `user` */ LOCK TABLES `user` WRITE; insert into `user`(`user_id`,`user_name`,`password`,`user_state`) values (1,'keafmd','keafmd','1'),(3,'21312321','123','0'),(11,'213','213','1'),(12,'keafmd','666','0'); UNLOCK TABLES; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
后端搭建
1、快速創(chuàng)建個(gè)SpringBoot項(xiàng)目
第一步:Spring Initializr

第二步:Spring Initializr Project Settings

第三步:添加個(gè)Lombok工具

第四步:Finish

初始化的樣子:

2、引入依賴(lài)
此處貼上整個(gè)pom.xml,部分依賴(lài)可能對(duì)于簡(jiǎn)單需求而言是多余的,可以自行舍棄。
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.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.keafmd</groupId>
<artifactId>springboot-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.yedaxia</groupId>
<artifactId>japidocs</artifactId>
<version>1.4.3</version>
<scope>test</scope>
</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>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<!-- 解密程序 https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
<!--JWT 依賴(lài) -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
3、編寫(xiě)代碼快速生成代碼
因?yàn)榇舜a為輔助代碼,放在test包下即可,相關(guān)的數(shù)據(jù)庫(kù)信息以及包信息需要和你們自己的保持一致,自行修改,如何包命名和我一致,只需要修改數(shù)據(jù)庫(kù)相關(guān)信息即可。
CodeGenerator:
package com.keafmd.mp;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Keafmd
*
* @ClassName: CodeGenerator
* @Description: 代碼生成器
* @author: 牛哄哄的柯南
* @Date: 2021-04-29 17:06
* @Blog: https://keafmd.blog.csdn.net/
*/
public class CodeGenerator {
/**
* <p>
* 讀取控制臺(tái)內(nèi)容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("請(qǐng)輸入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotBlank(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("請(qǐng)輸入正確的" + tip + "!");
}
public static void main(String[] args) {
// 代碼生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
// System.out.println("projectPath = " + projectPath);
gc.setOutputDir(projectPath + "/src/main/java");
// gc.setOutputDir("D:\\test");
gc.setAuthor("關(guān)注公眾號(hào):牛哄哄的柯南");
gc.setOpen(false);
// gc.setSwagger2(true); 實(shí)體屬性 Swagger2 注解
gc.setServiceName("%sService");
mpg.setGlobalConfig(gc);
// 數(shù)據(jù)源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://127.0.0.1:3306/data_test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("18044229");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(null);
pc.setParent("com.keafmd");
mpg.setPackageInfo(pc);
// 自定義配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定義輸出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定義配置會(huì)被優(yōu)先輸出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定義輸出文件名 , 如果你 Entity 設(shè)置了前后綴、此處注意 xml 的名稱(chēng)會(huì)跟著發(fā)生變化!!
return projectPath + "/src/main/resources/com/keafmd/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude(scanner("表名,多個(gè)英文逗號(hào)分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix("m_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
4、運(yùn)行代碼生成器生成代碼
在控制臺(tái)輸入user(表名)

紅框內(nèi)為自動(dòng)生成的代碼:

5、編寫(xiě)application.properties
個(gè)人習(xí)慣把a(bǔ)pplication.properties改為application.yml,修改端口為80
server:
port: 80
spring:
datasource:
url: jdbc:mysql://127.0.0.1/data_test?useSSL=false&&characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 18044229
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
mvc:
throw-exception-if-no-handler-found: true
web:
resources:
add-mappings: false
6、在啟動(dòng)類(lèi)上添加@MapperScan
SpringbootServerApplication:
package com.keafmd;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.keafmd.mapper")
public class SpringbootServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootServerApplication.class, args);
}
}
7、編寫(xiě)測(cè)試代碼測(cè)試數(shù)據(jù)庫(kù)是否連接正確
1、在 UserMapper代碼頁(yè)大括號(hào)內(nèi),按下Alt+Insert,選擇Test

2、Ok

3、自動(dòng)生成了測(cè)試類(lèi)

4、編寫(xiě)測(cè)試代碼
UserMapperTest :
package com.keafmd.mapper;
import com.keafmd.SpringbootServerApplication;
import com.keafmd.entity.User;
import com.keafmd.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest(classes = SpringbootServerApplication.class)
class UserMapperTest {
@Resource
UserService userService;
@Test
public void test1(){
List<User> userList = userService.list();
for (User user : userList) {
System.out.println(user);
}
}
}
5、測(cè)試結(jié)果

至此,后端和數(shù)據(jù)庫(kù)連接沒(méi)問(wèn)題。
8、編寫(xiě)后端的工具類(lèi)代碼(封裝結(jié)果集、日期處理、解決跨域請(qǐng)求)

1、CommonResult
package com.keafmd.common;
import lombok.Getter;
/**
* Keafmd
*
* @ClassName: CommonResult
* @Description: 封裝結(jié)果集
* @author: 牛哄哄的柯南
* @Date: 2021-04-29 18:11
* @Blog: https://keafmd.blog.csdn.net/
*/
@Getter
public class CommonResult {
private Integer code;
private String message;
private Object obj;
private CommonResult(Integer code, String message, Object obj) {
this.code = code;
this.message = message;
this.obj = obj;
}
public static CommonResult nohandler() {
return new CommonResult(ResultCode.NOHANDLER.getCode(), ResultCode.NOHANDLER.getMessage(),null);
}
public static CommonResult success(Object data) {
return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(),data);
}
public static CommonResult failed() {
return new CommonResult(ResultCode.FAILED.getCode(), ResultCode.FAILED.getMessage(),null);
}
public static CommonResult failed(String message) {
return new CommonResult(ResultCode.FAILED.getCode(),message,null);
}
public static CommonResult notoken() {
return new CommonResult(ResultCode.NOTOKEN.getCode(), ResultCode.NOTOKEN.getMessage(),null);
}
public static CommonResult nopremiss() {
return new CommonResult(ResultCode.NOPERMISS.getCode(), ResultCode.NOPERMISS.getMessage(),null);
}
}
2、DateConverter
package com.keafmd.common;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
/**
* Keafmd
*
* @ClassName: DateConverter
* @Description: 日期處理
* @author: 牛哄哄的柯南
* @Date: 2021-04-29 18:11
* @Blog: https://keafmd.blog.csdn.net/
*/
@Configuration
public class DateConverter implements Converter<String, Date> {
public DateConverter() {
// System.out.println("初始化........");
}
static List<SimpleDateFormat> sdfs = new ArrayList();
static {
sdfs.add(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
sdfs.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
sdfs.add(new SimpleDateFormat("yyyy-MM-dd"));
sdfs.add(new SimpleDateFormat("yyyy/MM/dd"));
}
@Override
public Date convert(String s) {
SimpleDateFormat sdf = null;
if (Pattern.matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$", s)) {
sdf = sdfs.get(1);
}
else if (Pattern.matches("^\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}$", s)){
sdf = sdfs.get(0);
}
else if (Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", s)){
sdf = sdfs.get(3);
}
else if (Pattern.matches("^\\d{4}-\\d{2}/-\\d{2}}$", s)){
sdf = sdfs.get(2);
}
Date date = null;
try {
date = sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
3、LocalDateTimeConverter
package com.keafmd.common;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* Keafmd
*
* @ClassName: LocalDateTimeConverter
* @Description: 日期處理
* @author: 牛哄哄的柯南
* @Date: 2021-04-29 18:11
* @Blog: https://keafmd.blog.csdn.net/
*/
@Component
public class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
//2021-04-29%2001:02:03
@Override
public LocalDateTime convert(String s) {
return LocalDateTime.parse(s, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
4、ResultCode
package com.keafmd.common;
import lombok.Getter;
/**
* Keafmd
*
* @ClassName: ResultCode
* @Description: 結(jié)果代碼
* @author: 牛哄哄的柯南
* @Date: 2021-04-29 18:11
* @Blog: https://keafmd.blog.csdn.net/
*/
@Getter
public enum ResultCode {
NOHANDLER(404,"請(qǐng)求地址錯(cuò)誤"),
SUCCESS(200,"操作成功"),
FAILED(500,"操作失敗"),
NOTOKEN(401,"未登錄或登錄已超時(shí)"),
NOPERMISS(403,"無(wú)操作權(quán)限"),
;
private Integer code;
private String message;
ResultCode(Integer code, String message) {
this.code = code;
this.message = message;
}
}
5、AppConfig
package com.keafmd.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.MySqlDialect;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.keafmd.common.DateConverter;
import com.keafmd.common.LocalDateTimeConverter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
* Keafmd
*
* @ClassName: AppConfig
* @Description: 解決跨域請(qǐng)求
* @author: 牛哄哄的柯南
* @Date: 2021-04-29 18:11
* @Blog: https://keafmd.blog.csdn.net/
*/
@Configuration
public class AppConfig extends WebMvcConfigurationSupport {
/**
* 分頁(yè)插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setDialect(new MySqlDialect());
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
@Bean
FilterRegistrationBean<CorsFilter> cors(){
FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<CorsFilter>();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://127.0.0.1:81");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
CorsFilter filter = new CorsFilter(source);
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
/**
* curl http://127.0.0.1/user/getById?id=31
* @param converters
*/
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
// objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //忽略 null 字段
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
// javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
objectMapper.registerModule(javaTimeModule);
converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
}
@Override
protected void addFormatters(FormatterRegistry registry) {
super.addFormatters(registry);
registry.addConverter(new DateConverter());
registry.addConverter(new LocalDateTimeConverter());
}
}
6、DefaultExceptionHandler
package com.keafmd.config;
import com.keafmd.common.CommonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.NoHandlerFoundException;
import javax.servlet.http.HttpServletRequest;
/**
* Keafmd
*
* @ClassName: DefaultExceptionHandler
* @Description:
* @author: 牛哄哄的柯南
* @Date: 2021-04-29 18:11
* @Blog: https://keafmd.blog.csdn.net/
*/
@RestControllerAdvice
public class DefaultExceptionHandler {
@ExceptionHandler
public CommonResult exceptionHandler(HttpServletRequest request, Exception ex) {
ex.printStackTrace();
if(ex instanceof NoHandlerFoundException) {
return CommonResult.nohandler();
}
return CommonResult.failed(ex.getMessage());
}
}
9、編寫(xiě)后端的增刪改查代碼
1、在UserService接口中編寫(xiě)分頁(yè)查詢(xún)代碼
package com.keafmd.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.keafmd.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服務(wù)類(lèi)
* </p>
*
* @author 關(guān)注公眾號(hào):牛哄哄的柯南
* @since 2021-04-29
*/
public interface UserService extends IService<User> {
Page pageList(Page page, User user);
}
2、在UserServiceImpl實(shí)現(xiàn)類(lèi)中實(shí)現(xiàn)分頁(yè)查詢(xún)和模糊查找
package com.keafmd.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.keafmd.entity.User;
import com.keafmd.mapper.UserMapper;
import com.keafmd.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服務(wù)實(shí)現(xiàn)類(lèi)
* </p>
*
* @author 關(guān)注公眾號(hào):牛哄哄的柯南
* @since 2021-04-29
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public Page pageList(Page page, User user) {
if(page == null){
page = new Page();
}
QueryWrapper wrapper = new QueryWrapper();
if(user!=null && StringUtils.isNotEmpty(user.getUserName())){
//根據(jù)user_name字段模糊查找
wrapper.like("user_name",user.getUserName());
}
return super.page(page,wrapper);
}
}
3、在UserController中編寫(xiě)增刪改查代碼
package com.keafmd.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.keafmd.common.CommonResult;
import com.keafmd.entity.User;
import com.keafmd.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
/**
* <p>
* 前端控制器
* </p>
*
* @author 關(guān)注公眾號(hào):牛哄哄的柯南
* @since 2021-04-29
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
/**
* 查找
* @return
*/
@RequestMapping("/list")
CommonResult list(ModelMap modelMap, Page page, @ModelAttribute("user") User user) {
page = userService.pageList(page, user);
modelMap.addAttribute("page", page);
return CommonResult.success(page);
}
@RequestMapping("/save")
CommonResult save(User user){
return CommonResult.success(userService.saveOrUpdate(user));
}
/**
* 根據(jù)id查
* @param id
* @return
*/
@RequestMapping("/getById")
CommonResult getById(Integer id) {
return CommonResult.success(userService.getById(id));
}
/**
* 刪除,邏輯刪除
* @param id
* @return
*/
@RequestMapping("/del")
CommonResult del(Integer id ) {
User user = userService.getById(id);
user.setUserState("0");
return CommonResult.success(userService.updateById(user));
}
/**
* 批量刪除
* @param id
* @return
*/
@RequestMapping("/delByIds")
CommonResult delByIds(Integer[] id) {
/*for (Integer integer : id) {
System.out.println(integer);
}*/
return CommonResult.success(userService.removeByIds(Arrays.asList(id)));
}
}
前端搭建
由于篇幅有限,前端搭建單獨(dú)再寫(xiě)一篇
SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建【前端篇】【快速生成后端代碼、封裝結(jié)果集、增刪改查、模糊查找】【畢設(shè)基礎(chǔ)框架】
以上就是SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建【后端篇】【快速生成后端代碼、封裝結(jié)果集、增刪改查、模糊查找】【畢設(shè)基礎(chǔ)框架】的全部?jī)?nèi)容
到此這篇關(guān)于SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過(guò)程(后端)的文章就介紹到這了,更多相關(guān)SpringBoot+MyBatisPlus+Vue 前后端分離搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用React和springboot做前后端分離項(xiàng)目的步驟方式
- SpringBoot+mybatis+Vue實(shí)現(xiàn)前后端分離項(xiàng)目的示例
- springBoot前后端分離項(xiàng)目中shiro的302跳轉(zhuǎn)問(wèn)題
- IDEA教程創(chuàng)建SpringBoot前后端分離項(xiàng)目示例圖解
- 部署vue+Springboot前后端分離項(xiàng)目的步驟實(shí)現(xiàn)
- 使用Springboot+poi上傳并處理百萬(wàn)級(jí)數(shù)據(jù)EXCEL
- Springboot+Poi導(dǎo)入Excel表格實(shí)現(xiàn)過(guò)程詳解
- Springboot?前后端分離項(xiàng)目使用?POI?生成并導(dǎo)出?Excel的操作方法
相關(guān)文章
Javaweb項(xiàng)目session超時(shí)解決方案
這篇文章主要介紹了Javaweb項(xiàng)目session超時(shí)解決方案,關(guān)于解決方案分類(lèi)比較明確,內(nèi)容詳細(xì),需要的朋友可以參考下。2017-09-09
詳解Java執(zhí)行g(shù)roovy腳本的兩種方式
這篇文章主要介紹了Java執(zhí)行g(shù)roovy腳本的兩種方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
一文講透為什么遍歷LinkedList要用增強(qiáng)型for循環(huán)
這篇文章主要為大家介紹了為什么遍歷LinkedList要用增強(qiáng)型for循環(huán)的透徹詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Spring中存儲(chǔ)Bean的常見(jiàn)注解方式
Spring框架中的控制反轉(zhuǎn)(IoC)和依賴(lài)注入(DI)是核心概念,實(shí)現(xiàn)了對(duì)象的解耦和動(dòng)態(tài)依賴(lài),IoC容器負(fù)責(zé)對(duì)象的生命周期和對(duì)象間的依賴(lài)關(guān)系,通過(guò)DI方式注入依賴(lài),本文介紹Spring中存儲(chǔ)Bean的常見(jiàn)注解方式,感興趣的朋友一起看看吧2024-09-09
Springboot+Shiro+Jwt實(shí)現(xiàn)權(quán)限控制的項(xiàng)目實(shí)踐
如今的互聯(lián)網(wǎng)已經(jīng)成為前后端分離的時(shí)代,所以本文在使用SpringBoot整合Shiro框架的時(shí)候會(huì)聯(lián)合JWT一起搭配使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Spring?Boot項(xiàng)目中使用OpenAI-Java的示例詳解
Spring?Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程,這篇文章主要介紹了Spring?Boot項(xiàng)目中使用OpenAI-Java的示例詳解,需要的朋友可以參考下2023-04-04
詳解Spring Boot的GenericApplicationContext使用教程
這篇教程展示了如何在Spring應(yīng)用程序中使用GenericApplicationContext 。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11

