微服务之spring Boot+MyBatis-Plus +mysql框架
小白也会搭建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框架相关推荐
- java小马哥百度网盘_思否编程(小马哥):Java 微服务实践 - Spring Boot / Spring Cloud全套,完整版下载 - VIPC6资源网...
小马哥 Java 微服务实践 – Spring Boot 系列 pptx segmentfault-lessons-master 03Java 微服务实践 – Spring Boot 系列(三)Web ...
- java小马哥mercyblitz,小马哥 Java 微服务实践 - Spring Boot 系列
资源介绍 教程名称:小马哥 Java 微服务实践 - Spring Boot 系列 教程目录: 03Java 微服务实践 - Spring Boot 系列(三)Web篇(中) 04Java 微服务实践 ...
- 《深入理解 Spring Cloud 与微服务构建》第十五章 微服务监控 Spring Boot Admin
<深入理解 Spring Cloud 与微服务构建>第十五章 微服务监控 Spring Boot Admin 文章目录 <深入理解 Spring Cloud 与微服务构建>第十 ...
- JAVAspringboot微服务b2b Spring MVC+mybatis+spring cloud+spring boot+spring security
鸿鹄云商大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台. 分布式.微服务.云架构电子商务平台 java ...
- (转)构建微服务:Spring boot 入门篇
转自: Spring Boot(一):入门篇 - 纯洁的微笑 - 博客园 : 什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 S ...
- Java微服务之Spring Boot on Docker,java开发面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- SpringCloud(8)微服务监控Spring Boot Admin
1.简介 Spring Boot Admin 是一个管理和监控Spring Boot 应用程序的开源软件.Spring Boot Admin 分为 Server 端和 Client 端,Spring ...
- 构建微服务:Spring boot 入门篇
Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的发布,Spring IO团队逐渐开 ...
- 全球数据一致性,事务,微服务和Spring Boot / Tomcat / Jetty
我们通常会构建需要一起执行以下几项操作的应用程序:调用后端(微)服务,写入数据库,发送JMS消息等.但是,如果在调用其中之一时出错,会发生什么情况?远程资源,例如,在调用Web服务后,如果数据库插入失 ...
最新文章
- 重磅!Science 上海交大发布最新“全世界最前沿的125个科学问题”!
- MPLS基本结构是怎样的?—Vecloud微云
- 为什么要加上拉电阻和下拉电阻
- zabbix icmp ping 监控主机_Zabbix监控 MySQL 性能
- windows文件读取 xxe_java xxe漏洞
- android sdk版本升级,个推 Android SDK 老版本升级2.9.+
- 计算机逻辑运算进位,二进位数进行逻辑运算1010AND1001的运算结果
- 梯度消失与梯度爆炸---解决方案(二)--杀手锏
- LTE 调制与解调——QPSK,16QAM,64QAM误码率比较
- greasyfork脚本怎么取消_greasy fork脚本大全电脑游戏安装使用
- crmeb 一号通使用方法
- 若依 后台框架配置丛数据源使用
- tms570ls1224用ecap模式测het产生的pwm
- 远程工具之一---rsync用法介绍
- php开源会员信息系统,poscms会员详情
- 移动通信:1G到5G发展过程简析 -- 什么是5G?
- python mac程序结束发出声音,Python程序运行结束如何加入提示音
- 探秘Google美国总部
- 802.11无线权威指南读书笔记(12)直接序列物理层DSSS与HR/DSSS(802.11b)
- 【数据异常校验】肖维勒准则(Chauvenet Criterion)处理异常数据
热门文章
- Gopher China 2019 讲师专访-Grab/地图团队资深架构师胡泊
- 2022年全球市场艰难梭菌的分子诊断总体规模、主要生产商、主要地区、产品和应用细分研究报告
- 百度地图API的基础使用
- 手持gps坐标设置_70迈行车记录仪A500:2.7K高清录制,内置GPS电子狗
- Matlab读取excel并使用拉依达准则筛选数据
- 微信群管理工具哪个好?最安全的微信群管理工具推荐!
- 安装office未能启动服务器,关于 office 2013 无法安装的解决方法
- 自学前端设计——【开源骚客】FPGA超详细入门视频教程
- 数学建模最小二乘法拟合_MATLAB最小二乘法拟合曲线公式
- 国学入门书要目及其读法----梁启超