小白也会搭建spring Boot+MyBatis-Plus +mysql框架

  • 一、新建一个微服务模块cloud-user
    • 1、 搭建步骤
  • 二、编码
    • 1、新建UserController类
    • 2、新建UserService类
    • 3、新建UserServiceImpl类
    • 4、编写UserMapper类
    • 5、application.yml文件配置如下
  • 3、测试接口
    • 1、测试逻辑删除
  • 四、注解解释
    • 1、@Slf4j:
    • 2、@RequestMapping
    • 3、@RestController
    • 4、@GetMapping
    • 5、@PostMapping
    • 6、@PutMapping
    • 7、@DeleteMapping
今天小白将从零亲手搭建spring Boot+MyBatis-Plus +mysql框架的微服务。

一、新建一个微服务模块cloud-user

1、 搭建步骤

  • 具体步骤请看前面章节(微服务的搭建):https://blog.csdn.net/qq_38066812/article/details/109426982
  • 搭建目录如下
  • controller层一般有多个端,根据不同的端的意义来命名即可。
  • 本地安装mysql5.1以上版本。
  • 在父目录的pom文件中引入mybatis依赖如下。
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>${velocity.version}</version><scope>provided</scope>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version>
</dependency>
<!-- mybatis-plus end --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><mybatis-plus-boot-starter.version>3.3.0</mybatis-plus-boot-starter.version><mysql.version>5.1.47</mysql.version><druid.version>1.1.20</druid.version>
</properties>
  • 注意事项:如果希望操作数据库删除数据使用逻辑删除,mybatis-plus版本一定要使用3.3.0以上,低版本的不支持
  • 逻辑删除指导请查看链接:https://baomidou.com/guide/logic-delete.html

二、编码

1、新建UserController类

  • 接口定义遵循RestFull风格。
package yooo.yun.com.user.controller.saas;import com.alibaba.fastjson.JSON;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import yooo.yun.com.common.api.ApiCode;
import yooo.yun.com.common.api.ApiResult;
import yooo.yun.com.common.entity.enums.LoginTypeEnum;
import yooo.yun.com.common.entity.pojo.UserPoJo;
import yooo.yun.com.common.entity.request.UserLoginReq;
import yooo.yun.com.common.entity.request.UserReq;
import yooo.yun.com.user.service.UserService;import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Objects;/*** @author WangJiao* @since 2020/10/14*/
@Slf4j
@RequestMapping(value = "/saas/user")
@RestController("sUserC")
public class UserController {@Resource private UserService service;/*** 用户注册** @param req 注册信息* @return obj*/@PostMapping("/register")@ApiOperation("注册")public ApiResult register(@Valid @RequestBody UserReq req) {log.info("register:[req:{}]", JSON.toJSONString(req));if (!Objects.equals(req.getPassword(), req.getRePassword())) {return ApiResult.fail(ApiCode.USER_TWO_PASSWORDS_INCONSISTENT);}UserPoJo findUser = service.getByTel(req.getTel());if (Objects.nonNull(findUser)) {return ApiResult.fail(ApiCode.USER_ACCOUNT_REGISTERED);}// md5加密req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));boolean res = service.save(UserPoJo.of(req));log.info("register:[res:{}]", res);return ApiResult.ok(res);}/*** 用户登录** @param req req* @return res*/@PostMapping("/login")@ApiOperation("登录")public ApiResult login(@Valid @RequestBody UserLoginReq req) {log.info("login:[req:{}]", req);String tel = req.getTel();UserPoJo findUser = service.getByTel(tel);if (Objects.isNull(findUser)) {return ApiResult.fail(ApiCode.USER_ACCOUNT_NOT_EXIST);}if (!Objects.equals(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()), findUser.getPassword())) {return ApiResult.fail(ApiCode.USER_PASSWORDS_ERROR);}return ApiResult.ok(service.login(findUser, LoginTypeEnum.SAAS.getValue()));}/*** 获取用户详情** @param id id* @return res*/@GetMapping("/{id}")@ApiOperation("获取用户详情")public ApiResult detail(@PathVariable(value = "id") long id) {log.info("detail:[id:{}]", id);return ApiResult.ok(service.getById(id));}/*** 删除用户信息** @param id id* @return res*/@DeleteMapping("/delete/{id}")@ApiOperation("删除用户信息")public ApiResult delete(@PathVariable(value = "id") long id) {log.info("delete:[id:{}]", id);return ApiResult.ok(service.removeById(id));}
}

2、新建UserService类

package yooo.yun.com.user.service;import yooo.yun.com.common.entity.pojo.UserPoJo;
import yooo.yun.com.common.service.BaseService;/*** @author WangJiao* @since 2020/11/12*/
public interface UserService extends BaseService<UserPoJo> {/*** query user info by tel** @param tel the tel* @return user*/UserPoJo getByTel(String tel);int testE(int status);/*** 登录** @param findUser findUser* @param loginType loginType* @return token*/String login(UserPoJo findUser, String loginType);
}
  • UserService继承BaseService,可以直接使用mybatis提供的原生操作数据库的方法,简单的业务处理不需要我们动手去写sql语句。

3、新建UserServiceImpl类

package yooo.yun.com.user.service.impl;import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import yooo.yun.com.common.entity.enums.UserRoleEnum;
import yooo.yun.com.common.entity.pojo.UserPoJo;
import yooo.yun.com.common.service.Impl.BaseServiceImpl;
import yooo.yun.com.common.utils.JWTUtil;
import yooo.yun.com.user.mapper.UserMapper;
import yooo.yun.com.user.service.UserService;import javax.annotation.Resource;/*** @author WangJiao* @since 2020/11/12*/
@Slf4j
@Service
public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserPoJo> implements UserService {@Resource private UserMapper mapper;@Overridepublic UserPoJo getByTel(String tel) {log.info("getByTel:[tel:{}]", tel);return mapper.selectOne(Wrappers.<UserPoJo>lambdaQuery().eq(UserPoJo::getTel, tel));}@Overridepublic int testE(int status) {int num = 0;return status / num;}@Overridepublic String login(UserPoJo findUser, String loginType) {// TODO: 2020/11/25/025 其他业务逻辑处理String token =JWTUtil.generateSaasToken(findUser.getId(), UserRoleEnum.ADMIN.getValue(), null, loginType);log.info("login:[token:{}]", token);return token;}
}

4、编写UserMapper类

package yooo.yun.com.user.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
import yooo.yun.com.common.entity.pojo.UserPoJo;/*** @author WangJiao* @since 2020/11/12*/
@Repository
public interface UserMapper extends BaseMapper<UserPoJo> {}
  • UserMapper继承BaseMapper;
  • 我们就可以使用框架提供的原生方法,不需要再写一遍,提高开发速度;
  • mybatis中的BaseMapper源码如下,我们可以直接调用。

5、application.yml文件配置如下

server:port: 5050servlet:context-path: /usereureka:client:serviceUrl:defaultZone: http://localhost:8080/eurekainstance:prefer-ip-address: trueinstance-id: ${spring.cloud.client.ip-address}:${server.port}
############################### mysql start #################################
spring:application:name: cloud-userfreemarker:enabled: falsethymeleaf:cache: falsedatasource:url: jdbc:mysql://localhost:3306/cloud_user?characterEncoding=utf8&generateSimpleParameterMetadata=true&connectTimeout=5000&useSSL=falseusername: ****password: ****
############################### mysql end #################################
# logback.xml中有详细的日志配置
logging:config: classpath:logback.xml############################### mybatis-plus start #################################
mybatis-plus:# 启动时是否检查MyBatis XML文件是否存在check-config-location: true# MyBatis原生配置configuration:# 字段名称下划线转驼峰命名map-underscore-to-camel-case: true# 打印SQL日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 全局默认主键类型id-type: id_workerlogic-delete-field: isDelete# 逻辑已删除值(默认为 1)logic-delete-value: true # 逻辑已删除值(默认为 1)# 逻辑未删除值(默认为 0)logic-not-delete-value: false # 逻辑未删除值(默认为 0)# mapper xml映射路径mapper-locations: classpath*:mapper/**/*Mapper.xml
################################ mybatis-plus end ###################################################################### Swagger start #################################
# swagger配置
swagger:base:package: yooo.yun.comcontact:email: jiao.wang@cloud.yunname: wangjiaourl: ''description: ''title: spring-demourl: ''version: 1.0
#################################### Swagger end ###################################

3、测试接口

1、测试逻辑删除

  • 表中目前有一条数据
  • 调用查询接口
  • 查询详情接口编写
/*** 获取用户详情** @param id id* @return res*/
@GetMapping("/{id}")
@ApiOperation("获取用户详情")
public ApiResult detail(@PathVariable(value = "id") long id) {log.info("detail:[id:{}]", id);return ApiResult.ok(service.getById(id));
}
  • 控制台日志
  • 调用删除接口
  • 删除接口控制台打印信息
  • 因为是逻辑删除,所以调用的是修改sql的语句,而不是直接删除的sql语句
  • 查看表中数据,is_delete的状态已经改变了
  • 如果需要在控制台显示sql语句,需要如下配置
    - user的yml文件配置如下

四、注解解释

1、@Slf4j:

  • @Slf4j注解在类上;为类提供一个 属性名为log 的 log4j 日志对像
  • 导入类import lombok.extern.slf4j.Slf4j;
  • Slf4j属于lombok注解,
  • 导入的pom依赖如下
<!-- lombok使实体类简写get与set方法-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version><scope>provided</scope>
</dependency>
  • 例子:log.info(“register:user register info[req:{}]”, JSON.toJSONString(req));

2、@RequestMapping

  • RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

3、@RestController

  • 项目url父路径
@RequestMapping(value = "/saas/user")

@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
例子:@RestController(value = “miniUserC”)中的value区分项目中的bean,比如项目中有两个相同的UserController。

提供了对Restful风格的支持

4、@GetMapping

  • 处理get请求,查询数据请求
@GetMapping("/{id}")

等价于

@RequestMapping(value = "/{id}",method = RequestMethod.GET)
  /*** 获取用户详情** @param id id* @return res*/@GetMapping("/{id}")@ApiOperation("获取用户详情")public ApiResult detail(@PathVariable(value = "id") long id) {log.info("detail:[id:{}]", id);return ApiResult.ok(service.getById(id));}

5、@PostMapping

  • 处理post请求,写入数据
@PostMapping("/register")

等价于

@RequestMapping(value = "/register",method = RequestMethod.POST)
/*** 用户注册** @param req 注册信息* @return obj*/@PostMapping("/register")@ApiOperation("注册")public ApiResult register(@Valid @RequestBody UserReq req) {log.info("register:user register info[req:{}]", JSON.toJSONString(req));if (!Objects.equals(req.getPassword(), req.getRePassword())) {return ApiResult.fail(ApiCode.USER_TWO_PASSWORDS_INCONSISTENT);}UserPoJo findUser = service.getByTel(req.getTel());if (Objects.nonNull(findUser)) {return ApiResult.fail(ApiCode.USER_ACCOUNT_REGISTERED);}// md5加密req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));boolean res = service.save(UserPoJo.of(req));log.info("register:[res:{}]", res);return ApiResult.ok(res);}

6、@PutMapping

  • 处理put请求,修改数据请求
@PutMapping("/update/{id}")

等价于

@RequestMapping(value = "/register",method = RequestMethod.POST)

7、@DeleteMapping

  • 处理delete请求,删除数据
@DeleteMapping("/delete/{id}")

等价于

@RequestMapping(value = "/update/{id}",method = RequestMethod.DELETE)
  /*** 删除用户信息** @param id id* @return res*/@DeleteMapping("/delete/{id}")@ApiOperation("删除用户信息")public ApiResult delete(@PathVariable(value = "id") long id) {log.info("delete:[id:{}]", id);UserPoJo find = service.getById(id);if (Objects.isNull(find)) {return ApiResult.fail(ApiCode.DATA_NOT_EXIST_FAILED_DELETE);}return ApiResult.ok(service.removeById(id));}

:- 学到这里,你就get到了喔

微服务之spring Boot+MyBatis-Plus +mysql框架相关推荐

  1. java小马哥百度网盘_思否编程(小马哥):Java 微服务实践 - Spring Boot / Spring Cloud全套,完整版下载 - VIPC6资源网...

    小马哥 Java 微服务实践 – Spring Boot 系列 pptx segmentfault-lessons-master 03Java 微服务实践 – Spring Boot 系列(三)Web ...

  2. java小马哥mercyblitz,小马哥 Java 微服务实践 - Spring Boot 系列

    资源介绍 教程名称:小马哥 Java 微服务实践 - Spring Boot 系列 教程目录: 03Java 微服务实践 - Spring Boot 系列(三)Web篇(中) 04Java 微服务实践 ...

  3. 《深入理解 Spring Cloud 与微服务构建》第十五章 微服务监控 Spring Boot Admin

    <深入理解 Spring Cloud 与微服务构建>第十五章 微服务监控 Spring Boot Admin 文章目录 <深入理解 Spring Cloud 与微服务构建>第十 ...

  4. JAVAspringboot微服务b2b Spring MVC+mybatis+spring cloud+spring boot+spring security

    鸿鹄云商大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台. 分布式.微服务.云架构电子商务平台 java ...

  5. (转)构建微服务:Spring boot 入门篇

    转自: Spring Boot(一):入门篇 - 纯洁的微笑 - 博客园 : 什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 S ...

  6. Java微服务之Spring Boot on Docker,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  7. SpringCloud(8)微服务监控Spring Boot Admin

    1.简介 Spring Boot Admin 是一个管理和监控Spring Boot 应用程序的开源软件.Spring Boot Admin 分为 Server 端和 Client 端,Spring ...

  8. 构建微服务:Spring boot 入门篇

    Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的发布,Spring IO团队逐渐开 ...

  9. 全球数据一致性,事务,微服务和Spring Boot / Tomcat / Jetty

    我们通常会构建需要一起执行以下几项操作的应用程序:调用后端(微)服务,写入数据库,发送JMS消息等.但是,如果在调用其中之一时出错,会发生什么情况?远程资源,例如,在调用Web服务后,如果数据库插入失 ...

最新文章

  1. 重磅!Science 上海交大发布最新“全世界最前沿的125个科学问题”!
  2. MPLS基本结构是怎样的?—Vecloud微云
  3. 为什么要加上拉电阻和下拉电阻
  4. zabbix icmp ping 监控主机_Zabbix监控 MySQL 性能
  5. windows文件读取 xxe_java xxe漏洞
  6. android sdk版本升级,个推 Android SDK 老版本升级2.9.+
  7. 计算机逻辑运算进位,二进位数进行逻辑运算1010AND1001的运算结果
  8. 梯度消失与梯度爆炸---解决方案(二)--杀手锏
  9. LTE 调制与解调——QPSK,16QAM,64QAM误码率比较
  10. greasyfork脚本怎么取消_greasy fork脚本大全电脑游戏安装使用
  11. crmeb 一号通使用方法
  12. 若依 后台框架配置丛数据源使用
  13. tms570ls1224用ecap模式测het产生的pwm
  14. 远程工具之一---rsync用法介绍
  15. php开源会员信息系统,poscms会员详情
  16. 移动通信:1G到5G发展过程简析 -- 什么是5G?
  17. python mac程序结束发出声音,Python程序运行结束如何加入提示音
  18. 探秘Google美国总部
  19. 802.11无线权威指南读书笔记(12)直接序列物理层DSSS与HR/DSSS(802.11b)
  20. 【数据异常校验】肖维勒准则(Chauvenet Criterion)处理异常数据

热门文章

  1. Gopher China 2019 讲师专访-Grab/地图团队资深架构师胡泊
  2. 2022年全球市场艰难梭菌的分子诊断总体规模、主要生产商、主要地区、产品和应用细分研究报告
  3. 百度地图API的基础使用
  4. 手持gps坐标设置_70迈行车记录仪A500:2.7K高清录制,内置GPS电子狗
  5. Matlab读取excel并使用拉依达准则筛选数据
  6. 微信群管理工具哪个好?最安全的微信群管理工具推荐!
  7. 安装office未能启动服务器,关于 office 2013 无法安装的解决方法
  8. 自学前端设计——【开源骚客】FPGA超详细入门视频教程
  9. 数学建模最小二乘法拟合_MATLAB最小二乘法拟合曲线公式
  10. 国学入门书要目及其读法----梁启超