03---后端框架搭建

news2024/11/22 16:31:08

1、创建项目

  1. 打开Ider,创建springboot项目。创建页面勾选需要的依赖,自定义包名、存储位置等,然后创建项目
  2. pom依赖如下
<dependencies>
        <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.2.2</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>
  1. 编写配置文件

application.yml

server:
  port: 8081
spring:
  mvc:
    path match:
      matching-strategy: ant_path_matcher
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/demo01?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8
  1. 启动SpringBootApplication ,看是否能够成功跑起来

2、创建数据库

创建数据库demo01,创建user表 ,建表语言如下

CREATE DATABASE /*!32312 IF NOT EXISTS*/`demo01` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `demo01`;

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(50) DEFAULT NULL COMMENT '用户名',
  `password` varchar(50) DEFAULT NULL COMMENT '密码',
  `address` varchar(255) DEFAULT NULL COMMENT '地址',
  `creat_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `user` */

insert  into `user`(`id`,`name`,`password`,`address`,`creat_time`) values 

(1,'张三','123456','江西省南昌市','2022-11-16 18:04:48'),

(2,'李四','123456','江西省南昌市','2022-11-16 19:49:31');

3、整合mybatis-plus

  1. 导入依赖
<!--整合mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--页面模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>
  1. 添加配置文件
server:
  port: 8081
spring:
  mvc:
    path match:
      matching-strategy: ant_path_matcher
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/demo01?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8

mybatis-plus:
  mapper-locations:classpath*:/mapper/**Mapper.xml
  1. 写mybatis-plus配置 (直接cv就好,都是不变的,除了包名等)

MyBatisPlusConfig.java

package com.xqh.demo.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration   //组件,添加到容器
@EnableTransactionManagement  //开启事务管理
@MapperScan("com.xqh.demo.mapper")  //开启mapper接口扫描
public class MybatisPlusConfig {
    //添加分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }

}

  1. 代码自动生成器

CodeGenerator.java

package com.xqh.demo;

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;

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.isNotEmpty(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");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("xqh");
        gc.setOpen(false);
        // gc.setSwagger2(true); 实体属性 Swagger2 注解
        gc.setServiceName("%sService");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/demo01?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(null);
        pc.setParent("com.xqh.demo");
        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<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/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();
    }
}

ps:记得修改包名和文件名,和自己项目所匹配

  1. 运行CodeGenerator.java

输入表名,一键生成代码

  1. 写一个测试接口,来看能不能从数据库中读取数据

UserController.java

@RestController
@RequestMapping("/user")  //给接口加前缀
public class UserController {
    @Autowired
    UserService userService;

    @GetMapping("/{id}")
    public Object test1(@PathVariable("id")Long id){
        return userService.getById(id);
    }
}

运行程序,输入id,看能不能拿到数据库中的数据

4、整合swagger

  1. 为了方便测试接口,可以整合swagger,可视化界面里调试和测试接口(也可以用外置软件Postman)。但是我感觉用swagger更方便,添加好依赖就行
  2. 导入依赖
  <!--        配置swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
  • 用的2.9.2的版本,亲测用3.0.0会进不去swagegr-ui.html的页面,可能是因为springboot和swagger版本不兼容的原因
  • 有启动器的那个整合依赖,但是有时候会出现版本不兼容的问题导致进不去swagger页面,这里用的是两个依赖,测试后可以成功进入swagger页面
  • 如果springboot启动报错,在application.yml中加上这一串配置
spring:
  mvc:
    path match:
      matching-strategy: ant_path_matcher
  1. 写swagegr配置

SwaggerConfig.java

package com.xqh.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket restApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("标准接口")
                .apiInfo(apiInfo("Spring Boot中使用Swagger2构建RESTFUL APIs", "1.0"))
                .useDefaultResponseMessages(true)
                .forCodeGeneration(false)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.xqh.demo.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo(String title, String version) {
        return new ApiInfoBuilder()
                .title(title)
                .description("更多请关注: https://blog.csdn.net/m0_56116754?spm=1000.2115.3001.5343")
                .termsOfServiceUrl("https://blog.csdn.net/m0_56116754?spm=1000.2115.3001.5343")
                .contact(new Contact("xqh", "https://blog.csdn.net/m0_56116754?spm=1000.2115.3001.5343", "791172229@qq.com"))
                .version(version)
                .build();
    }
}

  1. 启动项目,进入 localhost:8081/swagger-ui.html 可以进入到swagger页面,可以直接测试我们写的所有接口

在这里插入图片描述

  1. 到这里,后端框架就已经搭建好了,测试接口的swagger也整合进去了。下面是项目目录图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jenkins开发相关

1、jenkins 处理系统配置中publish over ssh中的密码 主机信息数据存储在&#xff5e;/.jenkins/jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml文件中。 java后端如果要加密可以通过以下方法实现。 String Password "xxxx" String passwd "pr…

中科方德服务器操作系统虚拟机安装过程记录

没啥技术含量&#xff0c;就是过程中踩了一些坑&#xff0c;我做个记录&#xff0c;方便后续查阅以及其他人参考什么的。 1、新建虚拟机向导---选择典型配置 2、选择&#xff1a;稍后安装客户机操作系统 3、选择客户机操作 系统以及版本&#xff0c;中科方德服务器系统为在安装…

【LeetCode每日一题】——338.比特位计数

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目进阶】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 动态规划 二【题目难度】 简单 三【题目编号】 338.比特位计数 四【题目描述…

IPv4 ACL访问列表简介、ACL的3种主要分类介绍与配置、以大白话介绍ACL通配符、ACL动作、定义方向、Rule序号。

3.0.0 IPv4 ACL列表&#xff08;简介、ACL分类、ACL配置、通配符&#xff09; ACL访问控制列表简介ACL的分类(华为设备)1、基本/标准ACL基本ACL编号&#xff1a;2000~2999基本ACL的作用&#xff1a;基于数据流的源地址进行匹配2、高级ACL高级ACL编号&#xff1a;3000~3999高级A…

代码随想录刷题记录day46 最长递增子序列+最长连续递增序列+最长重复子数组

代码随想录刷题记录day46 最长递增子序列最长连续递增序列最长重复子数组 300. 最长递增子序列 思想 1.dp数组的定义 dp[i]表示[0,i]区间的最长递增子序列 2.递推公式 如果num[i]>num[j];dp[i]dp[j]1 其中j从0到i-1遍历 3.初始化 所有的都初始化为1 4.遍历顺序 从…

一文读懂于Zebec生态中的潜在收益方式

随着加密市场逐渐陷入低谷&#xff0c;曾经火热的NFT、GameFi等赛道都陷入了沉寂。投资者目前很难在加密市场中获得可观的收益&#xff0c;而在整体加密市场发展局势不明朗的情况下&#xff0c;行业目前缺乏发展动力。 目前&#xff0c;以流支付为主要定位的Zebec生态&#xff…

docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_前后端分离的项目怎么运行 上面在搭建起来前后端分离版的项目后。 如果想通过Dockerfile的方式部署项目可以参考如下。…

沃尔玛账号被冻结后如何进行申诉?

目前申请一个沃尔玛店铺并不容易&#xff0c;但仍有不少卖家因为操作不当导致账号被冻结封禁&#xff0c;这对于国内的卖家来说是巨大的损失。那么要如何避免账号被冻结&#xff0c;冻结后又该如何申诉呢&#xff1f;如何避免账号被冻结&#xff1f; 一、保证店铺表现符合平台标…

纵向分栏

【问题】 I would like to create a table that should be vertical orientation, that means each resultset row should filled from left to right.. Can i achieve this without using crosstab? 【回答】 横向分栏的功能可以先用集算器把数据准备好作为普通报表实现&…

【Python机器学习】多项式回归、K近邻KNN回归的讲解及实战(图文解释 附源码)

需要源码请点赞关注收藏后评论区留言私信~~~ 多项式回归 非线性回归是用一条曲线或者曲面去逼近原始样本在空间中的分布&#xff0c;它“贴近”原始分布的能力一般较线性回归更强。 多项式是由称为不定元的变量和称为系数的常数通过有限次加减法、乘法以及自然数幂次的乘方运…

手把收教你Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流

我们在上面学习了&#xff1a; 手把手教你Spring Cloud Alibaba教程:nacos安装 手把手教你Spring Cloud Alibaba教程:使用nacos实现服务注册与发现 手把手教你Spring Cloud Alibaba教程:使用Nacos作为配置中心 手把手教你Spring Cloud Alibaba教程:使用Nacos作为配置中心 …

最小二乘法拟合直线、曲线

参考文章&#xff1a;马同学马同学提供线性代数,微积分,概率论与数理统计,机器学习等知识讲解https://www.matongxue.com/madocs/818/ C最小二乘法拟合-&#xff08;线性拟合和多项式拟合&#xff09;_尘中远的博客-CSDN博客_namespace gsl 最小二乘法—多项式拟合非线性函数…

LeetCode_BFS_DFS_简单_1971.寻找图中是否存在路径

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 u…

MR案例(2):学生排序(单字段排序、多字段排序)

文章目录一、任务目标1. 准备数据二、实行任务1. 创建Maven项目2. 添加相关依赖3. 创建日志属性文件4. 创建学生实体类5. 创建学生映射器类6. 创建学生归并器类7. 创建学生驱动类8. 启动学生驱动器类&#xff0c;查看结果一、任务目标 MR案例&#xff1a;学生排序&#xff08;…

【C++】继承与面向对象设计

目录 一、确保public继承塑模出is-a关系 二、避免隐藏继承而来的名称 三、区分接口继承和实现继承 四、考虑virtual函数以外的其他选择 五、不要重新定义继承而来的non-virtual函数 六、不要重新定义继承而来的缺省参数 七、尽量使用复合塑模出has-a 总结 一、确保publ…

【MySQL】Innodb存储引擎之物理存储结构(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

云服务器安装jdk

第一步使用工具连接自己的服务器 连接成功后 在左侧选择需要上传的文件到opt目录 在云服务器的命令行操作界面输入指令 解压&#xff0c;输入jdk按table键自动补全 tar -zxvf 配置环境变量 vim /etc/profile 修改环境变量&#xff08;具体视安装 java 地址修改&#xff09; …

计算机毕设Python+Vue学生实验报告管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

jQuery 介绍

文章目录jQuery 介绍介绍下载安装jQuery 介绍 介绍 jQuery本身就是用JavaScript来写的&#xff0c;它只是把JavaScript中最常用的功能封装起来&#xff0c;以方便开发者快速开发。遥想当年&#xff0c;jQuery的创始人John Resig就是受够了JavaScript的各种缺点&#xff0c;所…

微服务框架 SpringCloud微服务架构 服务异步通讯 51 死信交换机 51.1 初识死信交换机

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯51 死信交换机51.1 初识死信交换机51.1.1 初识死信交换机51.1.2 总结51 死信交换机 51.1 初识…