程(后端)
⽬录
数据库准备后端搭建
1、快速创建个SpringBoot项⽬2、引⼊依赖3、编写代码快速⽣成代码4、运⾏代码⽣成器⽣成代码5、编写application.properties6、在启动类上添加@MapperScan7、编写测试代码测试数据库是否连接正确9、编写后端的增删改查代码前端搭建
数据库准备
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 '账号', `password` varchar(50) CHARACTER SET utf8 NOT NULL COMMENT '密码',
`user_state` varchar(10) CHARACTER SET utf8 NOT NULL DEFAULT '1' COMMENT '状态,逻辑删除', 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、快速创建个SpringBoot项⽬
第⼀步:Spring Initializr
第⼆步:Spring Initializr Project Settings
第三步:添加个Lombok⼯具
第四步:Finish
初始化的样⼦:
2、引⼊依赖
此处贴上整个pom.xml,部分依赖可能对于简单需求⽽⾔是多余的,可以⾃⾏舍弃。pom.xml代码:
3、编写代码快速⽣成代码
因为此代码为辅助代码,放在test包下即可,相关的数据库信息以及包信息需要和你们⾃⼰的保持⼀致,⾃⾏修改,如何包命名和我⼀致,只需要修改数据库相关信息即可。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 {
/** *
* 读取控制台内容 *
*/public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append(\"请输⼊\" + tip + \":\"); System.out.println(help.toString()); if (scanner.hasNext()) {
String ipt = scanner.next(); if (StringUtils.isNotBlank(ipt)) { return ipt; } }
throw new MybatisPlusException(\"请输⼊正确的\" + 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:\\\est\");
gc.setAuthor(\"关注公众号:⽜哄哄的柯南\"); gc.setOpen(false);
// gc.setSwagger2(true); 实体属性 Swagger2 注解 gc.setServiceName(\"%sService\"); mpg.setGlobalConfig(gc);
// 数据源配置
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 focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // ⾃定义输出⽂件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发⽣变化!! 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(\"表名,多个英⽂逗号分割\").split(\ strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(\"m_\"); mpg.setStrategy(strategy); mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.execute(); }} 4、运⾏代码⽣成器⽣成代码 在控制台输⼊user(表名) 红框内为⾃动⽣成的代码: 5、编写application.properties 个⼈习惯把application.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、在启动类上添加@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、编写测试代码测试数据库是否连接正确 1、在 UserMapper代码页⼤括号内,按下Alt+Insert,选择Test 2、Ok 3、⾃动⽣成了测试类 4、编写测试代码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 } 5、测试结果 ⾄此,后端和数据库连接没问题。 8、编写后端的⼯具类代码(封装结果集、⽇期处理、解决跨域请求) 1、CommonResult package com.keafmd.common;import lombok.Getter; /** * Keafmd * * @ClassName: CommonResult * @Description: 封装结果集 * @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 // System.out.println(\"初始化........\"); } static List 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}$\ sdf = sdfs.get(1); } else if (Pattern.matches(\"^\\\\d{4}/\\\\d{2}/\\\\d{2} \\\\d{2}:\\\\d{2}:\\\\d{2}$\ sdf = sdfs.get(0); } else if (Pattern.matches(\"^\\\\d{4}/\\\\d{2}/\\\\d{2}$\ sdf = sdfs.get(3); } else if (Pattern.matches(\"^\\\\d{4}-\\\\d{2}/-\\\\d{2}}$\ 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 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: 结果代码 * @author: ⽜哄哄的柯南 * @Date: 2021-04-29 18:11 * @Blog: https://keafmd.blog.csdn.net/ */ @Getter public enum ResultCode { NOHANDLER(404,\"请求地址错误\"), SUCCESS(200,\"操作成功\"), FAILED(500,\"操作失败\"), NOTOKEN(401,\"未登录或登录已超时\"), NOPERMISS(403,\"⽆操作权限\"), ; 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: 解决跨域请求 * @author: ⽜哄哄的柯南 * @Date: 2021-04-29 18:11 * @Blog: https://keafmd.blog.csdn.net/ */ @Configuration public class AppConfig extends WebMvcConfigurationSupport { /** * 分页插件 * @return */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); paginationInterceptor.setDialect(new MySqlDialect()); paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; } @Bean FilterRegistrationBean FilterRegistrationBean config.addAllowedOrigin(\"http://127.0.0.1:81\"); config.addAllowedHeader(\"*\"); config.addAllowedMethod(\"*\"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration(\"/**\ 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 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、编写后端的增删改查代码 1、在UserService接⼝中编写分页查询代码 package com.keafmd.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.keafmd.entity.User; import com.baomidou.mybatisplus.extension.service.IService;/** * * 服务类 * * @author 关注公众号:⽜哄哄的柯南 * @since 2021-04-29 */ public interface UserService extends IService 2、在UserServiceImpl实现类中实现分页查询和模糊查找 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; /** * * 服务实现类 * * @author 关注公众号:⽜哄哄的柯南 * @since 2021-04-29 */ @Service public class UserServiceImpl extends ServiceImpl public Page pageList(Page page, User user) { if(page == null){ page = new Page(); } QueryWrapper wrapper = new QueryWrapper(); if(user!=null && StringUtils.isNotEmpty(user.getUserName())){ //根据user_name字段模糊查找 wrapper.like(\"user_name\ } return super.page(page,wrapper); }} 3、在UserController中编写增删改查代码 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; /** * * 前端控制器 * * @author 关注公众号:⽜哄哄的柯南 * @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\ return CommonResult.success(page); } @RequestMapping(\"/save\") CommonResult save(User user){ return CommonResult.success(userService.saveOrUpdate(user)); } /** * 根据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))); }} 前端搭建 由于篇幅有限,前端搭建单独再写⼀篇 以上就是SpringBoot+MyBatisPlus+Vue 前后端分离项⽬快速搭建【后端篇】【快速⽣成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】的全部内容 到此这篇关于SpringBoot+MyBatisPlus+Vue 前后端分离项⽬快速搭建过程(后端)的⽂章就介绍到这了,更多相关 SpringBoot+MyBatisPlus+Vue 前后端分离搭建内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持! 因篇幅问题不能全部显示,请点此查看更多更全内容