1分钟学会SpringBoot2知识点,让你35岁不再失业(二)
第十三节、springboot2集成mybatis和swagger2
1、 项目目录
mybatis-vo:接收前端&响应端数据封装
mybatis-web:控制层
mybatis-service:服务层
mybatis-dao:数据持久层
2、 根据之前的方法创建父类工程 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>
<packaging>pom</packaging>
<modules>
<module>mybatis-web</module>
<module>mybatis-service</module>
<module>mybatis-dao</module>
<module>mybatis-vo</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yyliu</groupId>
<artifactId>mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.21</druid.version>
<mybatis.version>1.3.2</mybatis.version>
<swagger2.version>2.9.2</swagger2.version>
<junit.version>4.12</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mybatis-web</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mybatis-service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mybatis-vo</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mybatis-dao</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--阿里巴巴连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--接口文档生成-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
3、结构图如下
4、建表语句
CREATE TABLE `sys_user` (
`id` varchar(64) NOT NULL COMMENT '用户id',
`username` varchar(64) NOT NULL COMMENT '账户名称',
`salt` varchar(20) DEFAULT NULL COMMENT '加密盐值',
`password` varchar(200) NOT NULL COMMENT '用户密码密文',
`phone` varchar(11) DEFAULT NULL COMMENT '手机号码',
`dept_id` varchar(64) DEFAULT NULL COMMENT '部门id',
`real_name` varchar(64) DEFAULT NULL COMMENT '真实姓名',
`nick_name` varchar(64) DEFAULT NULL COMMENT '昵称',
`email` varchar(64) DEFAULT NULL COMMENT '邮箱',
`status` tinyint(4) DEFAULT '1' COMMENT '账户状态1正常2锁定',
`sex` tinyint(4) DEFAULT NULL COMMENT '性别1男2女',
`deleted` tinyint(4) DEFAULT '0' COMMENT '0未删除 1已删除',
`create_id` varchar(64) DEFAULT NULL COMMENT '创建人',
`update_id` varchar(64) DEFAULT NULL COMMENT '更新人',
`create_where` varchar(64) DEFAULT NULL COMMENT '创建来源1web 2android 3ios ',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT '1970-01-01 08:00:01',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
5、postman插入语句
{
"username": "dev",
"password": "666666",
"phone": "18916719927",
"sex": 1,
"createWhere": 1,
"email": "595499737@qq.com"
}
{
"id": "78c1558e-e127-4e5b-8330-7872ae4a6ac8",
"sex": 1,
"createWhere": 1
}
{
"id": "3a93c7b3-1706-463e-8531-1ed0466e193b",
"createWhere": 2
}
6、 mybatis-vo模块 中的 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mybatis</artifactId>
<groupId>com.yyliu</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mybatis-vo</artifactId>
<dependencies>
<!--swagger2 依赖-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
</dependencies>
</project>
新建RegisterRequestVO.java
package com.unionpay.ysf.vo.request;
/**
* @author 刘阳洋
* @date 2020/4/27 12:55
*/
//注册接收前端表单的数据VO
public class RegisterRequestVO {
private String username;
private String password;
private String sex;
private String phone;
private String createWhere;
private String email;
private String nickName;
@Override
public String toString() {
return "RegisterRequestVO{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", phone='" + phone + '\'' +
", createWhere='" + createWhere + '\'' +
", email='" + email + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCreateWhere() {
return createWhere;
}
public void setCreateWhere(String createWhere) {
this.createWhere = createWhere;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
}
新建UpdateRequestVO .java类
package com.unionpay.ysf.vo.request;
/**
* @author 刘阳洋
* @date 2020/4/27 16:16
*/
//接收前端表单的数据VO
public class UpdateRequestVO {
private String id;
private String username;
private String password;
private String phone;
private String deptId;
private String realName;
private String nickName;
private String email;
private Integer status;
private Integer sex;
private Integer createWhere;
@Override
public String toString() {
return "UpdateRequestVO{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
", phone='" + phone + '\'' +
", deptId='" + deptId + '\'' +
", realName='" + realName + '\'' +
", nickName='" + nickName + '\'' +
", email='" + email + '\'' +
", status=" + status +
", sex=" + sex +
", createWhere=" + createWhere +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getDeptId() {
return deptId;
}
public void setDeptId(String deptId) {
this.deptId = deptId;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Integer getCreateWhere() {
return createWhere;
}
public void setCreateWhere(Integer createWhere) {
this.createWhere = createWhere;
}
}
7、mybatis-dao 模块 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mybatis</artifactId>
<groupId>com.yyliu</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mybatis-dao</artifactId>
<dependencies>
<!--引入vo模块-->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mybatis-vo</artifactId>
</dependency>
<!--dao层需要数据库的连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--阿里巴巴druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
8、mybatis-service 中 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mybatis</artifactId>
<groupId>com.yyliu</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mybatis-service</artifactId>
<dependencies>
<!--引入dao层模块-->
<dependency>
<groupId>com.yyliu</groupId>
<artifactId>mybatis-dao</artifactId>
</dependency>
<!--引入web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
UserService接口
package com.unionpay.ysf.service.interfaces;
import com.unionpay.ysf.entity.SysUser;
import com.unionpay.ysf.vo.request.RegisterRequestVO;
import com.unionpay.ysf.vo.request.UpdateRequestVO;
/**
* @author 刘阳洋
* @date 2020/4/26 20:24
*/
public interface UserService {
SysUser getUserInfoById(String id);
String register (RegisterRequestVO vo);
String updateUserInfo(UpdateRequestVO vo);
String deleted(String id);
}
UserServiceImpl实现类
package com.unionpay.ysf.service.impl;
import com.unionpay.ysf.entity.SysUser;
import com.unionpay.ysf.mapper.SysUserMapper;
import com.unionpay.ysf.service.interfaces.UserService;
import com.unionpay.ysf.service.utils.PasswordUtils;
import com.unionpay.ysf.vo.request.RegisterRequestVO;
import com.unionpay.ysf.vo.request.UpdateRequestVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.UUID;
/**
* @author 刘阳洋
* @date 2020/4/26 20:26
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private SysUserMapper sysUserMapper;
@Override
public SysUser getUserInfoById(String id) {
return sysUserMapper.selectByPrimaryKey(id);
}
@Override
public String register(RegisterRequestVO vo) {
SysUser sysUser =new SysUser();
//把接受过来的vo的值赋予这个对象
BeanUtils.copyProperties(vo,sysUser);
sysUser.setCreateTime(new Date());
sysUser.setId(UUID.randomUUID().toString());
sysUser.setSalt(PasswordUtils.getSalt());
String encode = PasswordUtils.encode(vo.getPassword(), sysUser.getSalt());
sysUser.setPassword(encode);
int i=sysUserMapper.insertSelective(sysUser);
if(i!=1){
return "注册失败";
}
return "注册成功";
}
@Override
@Transactional(rollbackFor=Exception.class)
public String updateUserInfo(UpdateRequestVO vo) {
SysUser sysUser =sysUserMapper.selectByPrimaryKey(vo.getId());
if(null==sysUser){
return "操作失败";
}
SysUser update =new SysUser();
BeanUtils.copyProperties(vo,update);
update.setUpdateTime(new Date());
int count =sysUserMapper.updateByPrimaryKeySelective(update);
if(count!=1){
return "操作失败";
}
int i=1/0;
return "操作成功";
}
@Override
public String deleted(String id) {
int count= sysUserMapper.deleteByPrimaryKey(id);
if(count==0){
return "删除失败";
}
return "删除成功";
}
}
utils工具类
PasswordEncoder 类
package com.unionpay.ysf.service.utils;
import java.security.MessageDigest;
/**
* @author 刘阳洋
* @date 2020/4/26 20:26
*/
public class PasswordEncoder {
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
"e", "f" };
private final static String MD5 = "MD5";
private final static String SHA = "SHA";
private Object salt;
private String algorithm;
public PasswordEncoder(Object salt) {
this(salt, MD5);
}
public PasswordEncoder(Object salt, String algorithm) {
this.salt = salt;
this.algorithm = algorithm;
}
/**
* 密码加密
* @param rawPass
* @return
*/
public String encode(String rawPass) {
String result = null;
try {
MessageDigest md = MessageDigest.getInstance(algorithm);
// 加密后的字符串
result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes("utf-8")));
} catch (Exception ex) {
}
return result;
}
/**
* 密码匹配验证
* @param encPass 密文
* @param rawPass 明文
* @return
*/
public boolean matches(String encPass, String rawPass) {
String pass1 = "" + encPass;
String pass2 = encode(rawPass);
return pass1.equals(pass2);
}
private String mergePasswordAndSalt(String password) {
if (password == null) {
password = "";
}
if ((salt == null) || "".equals(salt)) {
return password;
} else {
return password + "{" + salt.toString() + "}";
}
}
/**
* 转换字节数组为16进制字串
*
* @param b
* 字节数组
* @return 16进制字串
*/
private String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
/**
* 将字节转换为16进制
* @param b
* @return
*/
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n = 256 + n;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
}
PasswordUtils类
package com.unionpay.ysf.service.utils;
import java.util.UUID;
/**
* @author 刘阳洋
* @date 2020/4/26 20:26
*/
public class PasswordUtils {
/**
* 匹配密码
* @param salt 盐
* @param rawPass 明文
* @param encPass 密文
* @return
*/
public static boolean matches(String salt, String rawPass, String encPass) {
return new PasswordEncoder(salt).matches(encPass, rawPass);
}
/**
* 明文密码加密
* @param rawPass 明文
* @param salt
* @return
*/
public static String encode(String rawPass, String salt) {
return new PasswordEncoder(salt).encode(rawPass);
}
/**
* 获取加密盐
* @return
*/
public static String getSalt() {
return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 20);
}
}
9、mybatis-web中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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mybatis</artifactId>
<groupId>com.yyliu</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mybatis-web</artifactId>
<dependencies>
<!--引入service模块-->
<dependency>
<groupId>com.yyliu</groupId>
<artifactId>mybatis-service</artifactId>
</dependency>
<!-- 添加junit-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--添加mybatis插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<phase>deploy</phase>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
resources文件
application.yaml
server:
port: 8888
#常规数据库配置
#spring:
# datasource:
# url: jdbc:mysql://localhost:3306/device?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=true
# driver-class-name: com.mysql.jdbc.Driver
# username: root
# password: 6415772
#
#Druid数据库连接池配置
#1、监控数据库访问性能 2、详细统计线上的访问性能 3、SQL执行日志 4、扩展JDBC
#连接池待补充
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss #如果使用字符串表示,用这行设置格式
timezone: GMT+8
serialization:
write-dates-as-timestamps: false #使用时间戳,使用数值timestamp表示日期 serverTimezone=GMT%2B8
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/device?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: 6415772
############### 连接池配置 ################
#连接池建立时创建的初始化连接数
initial-size: 5
#最大活跃连接数
max-active: 20
#最小活跃连接数
min-idle: 5
#配置获取连接等待超时时间
max-wait: 60000
#打开PSCache,并且指定每个连接上PSCache的大小
max-pool-prepared-statement-per-connection-size: 20
validation-query: SELECT 1 FROM DUAL
query-timeout: 30000
#是否获得连接放回连接池后检测其可用性
test-on-borrow: false
#是否在连接放回连接池后检测其可用性
test-on-return: false
#是否在连接空闲一段时间后检测其可用性
test-while-idle: true
#配置间隔多久进行一次检测,检测需要关闭空闲连接单位是毫秒
time-between-eviction-runs-millis: 60000
#配置一个连接在池中最小生存时间单位是毫秒
min-evictable-idle-time-millis: 300000
#监控后台账号和密码
stat-view-servlet:
login-username: admin
login-password: 6415772
#监控页面 http://localhost:8888/druid
#mybatis配置
mybatis:
mapper-locations: classpath:mapper/*.xml
generatorConfig.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- <properties resource="mybatis.properties" />
-->
<!--mysql6版本以上driverClass="com.mysql.cj.jdbc.Driver
serverTimezone=GMT%2B8-->
<classPathEntry location="D:\Maven\JARworkspace\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar" />
<context id="msqlTables" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<jdbcConnection connectionURL="jdbc:mysql://localhost:3306/device?serverTimezone=GMT%2B8"
driverClass="com.mysql.jdbc.Driver" userId="root" password="6415772">
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<javaTypeResolver>
<!--false可自动转换为long integer short等-->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--逆向生成代码实体类地址-->
<javaModelGenerator targetPackage="com.unionpay.ysf.entity" targetProject="E:\device系统\mybatis\mybatis-dao\src\main\java">
<property name="enableSubPackages" value="true"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="mapper" targetProject="E:\device系统\mybatis\mybatis-dao\src\main\resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.unionpay.ysf.mapper" targetProject="E:\device系统\mybatis\mybatis-dao\src\main\java">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!--数据库表-->
<table tableName="sys_user" domainObjectName="SysUser"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="true" >
<columnOverride column="sex" javaType="java.lang.Integer"/>
<columnOverride column="status" javaType="java.lang.Integer"/>
<columnOverride column="create_where" javaType="java.lang.Integer"/>
<columnOverride column="deleted" javaType="java.lang.Integer"/>
</table>
</context>
</generatorConfiguration>
UserController.java类
package com.unionpay.ysf.controller;
import com.unionpay.ysf.entity.SysUser;
import com.unionpay.ysf.service.interfaces.UserService;
import com.unionpay.ysf.vo.request.RegisterRequestVO;
import com.unionpay.ysf.vo.request.UpdateRequestVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @author 刘阳洋
* @date 2020/4/26 20:57
*/
//http://localhost:8888/api/getUser?id=1
//get 查看 post 新增 put编辑 dleete 删除
@RestController
@RequestMapping("/api")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/getUser")
public SysUser getUserDetail(@RequestParam(required = false) String id){
return userService.getUserInfoById(id);
}
// http://localhost:8888/api/user/3a93c7b3-1706-463e-8531-1ed0466e193b
@GetMapping("/user/{id}")
public SysUser getUserInfo(@PathVariable("id") String id){
System.out.println(id);
return userService.getUserInfoById(id);
}
// http://localhost:8888/api/user
@PostMapping("/user")
public String insertUser(@RequestBody RegisterRequestVO vo){
return userService.register(vo);
}
// http://localhost:8888/api/user
//78c1558e-e127-4e5b-8330-7872ae4a6ac8
@PutMapping("/user")
public String updateUserInfo(@RequestBody UpdateRequestVO vo){
return userService.updateUserInfo(vo);
}
@DeleteMapping("/user/{id}")
public String deleteUserInfo(@PathVariable("id") String id){
System.out.println(id);
return userService.deleted(id);
}
}
swagger2类
package com.unionpay.ysf.swagger;
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.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author 刘阳洋
* @date 2020/4/28 17:15
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())//创建该Api的基本信息(这些基本信息会展现在文档页面中)
.select()//函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger ui来展现
.apis(RequestHandlerSelectors.basePackage("com.unionpay.ysf.controller"))//指定需要扫描的包路路径
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("springboot2")
.description("设备指纹upsql")
.termsOfServiceUrl("")
.version("1.0")
.build();
}
}
MybatisApplication 启动类
package com.unionpay.ysf;
/*
@auther 刘阳洋
@date 2020/4/24 14:50
*/
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//在web启动器里面配置扫描
//@SpringBootApplication(scanBasePackages = "com.unionpay.ysf")
@SpringBootApplication
@MapperScan("com.unionpay.ysf.mapper")
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
System.out.println("web服务启动成功");
}
}
10、mybatis两种生成方法
1、上面代码已经引入了mybatis包 如下图
IDEA有右边框点击maven会出现左边看到的图,找到web模块点击plugins,找到mybatis-generator双击,就会在dao层模块中看到生成的三个文件
会自动生成如上图的文件,进入SysUserMapper在上面加入@Repository注解以免注入bean的时候报错
2、IDEA–file—settings—plugins—安装 free mybatis插件
重启IDEA
然后如上图找到databases连接你的mysql
如上图连接好以后,找到需要逆向生成的表,然后表名上面点击右键
选择生成的路径然后点击ok就会自动生成那三个文件.
11、swagger使用方法
在mybatis-vo层添加依赖 <swagger2.version>2.9.2</swagger2.version>
<!--swagger2 依赖-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
创建swagger类
package com.unionpay.ysf.swagger;
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.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author 刘阳洋
* @date 2020/4/28 17:15
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())//创建该Api的基本信息(这些基本信息会展现在文档页面中)
.select()//函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger ui来展现
.apis(RequestHandlerSelectors.basePackage("com.unionpay.ysf.controller"))//指定需要扫描的包路路径
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("springboot2")
.description("设备指纹upsql")
.termsOfServiceUrl("")
.version("1.0")
.build();
}
}
新建swagger controller
package com.unionpay.ysf.controller;
import com.unionpay.ysf.vo.request.SwaggerVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 刘阳洋
* @date 2020/4/28 18:57
*/
// http://localhost:8888/swagger-ui.html
@RestController
@RequestMapping("/test")
@Api(tags = "测试swagger模块")
public class SwaggerController {
@ApiOperation(value = "第一个swagger接口")
@PostMapping("/swagger")
public SwaggerVO testswagger(@RequestBody SwaggerVO vo){
return vo;
}
}
创建一个vo
package com.unionpay.ysf.vo.request;
import io.swagger.annotations.ApiModelProperty;
/**
* @author 刘阳洋
* @date 2020/4/28 18:54
*/
public class SwaggerVO {
@ApiModelProperty(value = "名字")
private String name;
@ApiModelProperty(value = "年龄")
private Integer age;
@ApiModelProperty(value = "电话")
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "SwaggerVO{" +
"name='" + name + '\'' +
", age=" + age +
", phone='" + phone + '\'' +
'}';
}
}
测试
启动项目 输入浏览器就可以看到
http://localhost:8888/swagger-ui.html
表示启动成功测试成功
常用 注解:
@ApiModel
用在类上,表示对类进行说明,用于实体类中的参数接收说明。使用方式代码如下所示
@ApiModel(value = "com.yingxue.lesson.vo.req.UpdateUserReqVO",description = "更新用户")
public class UpdateUserReqVO {
}
@Api
用在类上,说明该类的作用。可以标记一个 Controller 类作为 Swagger 文档资源,使用方式代码如下所示。
@RestController
@RequestMapping("/sys")
@Api(tags = "用户模块",description = "用户模块相关接口")
public class UserController {
}
@ApiModelProperty()
用于字段,表示对 model 属性的说明。使用方式代码如下所示
@ApiModel(value = "com.yingxue.lesson.vo.req.UpdateUserReqVO",description = "更新用户参数")
public class UpdateUserReqVO {
@ApiModelProperty(value = "用户id")
private String id;
@ApiModelProperty(value = "账号")
private String username;
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "手机号")
private String phone;
@ApiModelProperty(value = "机构id")
private String deptId;
@ApiModelProperty(value = "真实名称")
private String realName;
@ApiModelProperty(value = "昵称")
private String nickName;
@ApiModelProperty(value = "邮箱")
private String email;
@ApiModelProperty(value = "状态")
private Integer status;
@ApiModelProperty(value = "性别")
private Integer sex;
@ApiModelProperty(value = "涞源")
private Integer createWhere;
}
@ApiParam
用于 Controller 中方法的参数说明。使用方式代码如下所示
@GetMapping("/getUser")
public SysUser getUserInfo(@ApiParam(value = "用户id",required = true) @RequestParam String id){
return userService.getUserInfo(id);
}
value:参数说明
required:是否必填
@ApiOperation
用在 Controller 里的方法上,说明方法的作用,每一个接口的定义。使用方式代码如下所示。
value:接口名称
@GetMapping("/getUser")
@ApiOperation(value = "获取用户信息接口")
public SysUser getUserInfo(@ApiParam(value = "用户id",required = true) @RequestParam String id){
return userService.getUserInfo(id);
}
@ApiResponse
用于方法上,说明接口响应的一些信息;@ApiResponses 组装了多个 @ApiResponse。使用方式代码如下所示。
@GetMapping("/getUser")
@ApiOperation(value = "获取用户信息接口")
@ApiResponses({ @ApiResponse(code = 0, message = "相应成功", response = SysUser.class) })
public SysUser getUserInfo(@ApiParam(value = "用户id",required = true) @RequestParam String id){
return userService.getUserInfo(id);
}
ApiImplicitParam 和 ApiImplicitParams
用于方法上,为单独的请求参数进行说明。使用方式代码如下
@GetMapping("/getUser")
@ApiOperation(value = "获取用户信息接口")
@ApiResponses({ @ApiResponse(code = 0, message = "相应成功", response = SysUser.class) })
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用户id", dataType = "string", paramType = "query",
required = true, defaultValue = "0f09e661-7e80-4e1b-b66a-2e266bb593bf")
})
public SysUser getUserInfo(@ApiParam(value = "用户id",required = true) @RequestParam String id){
return userService.getUserInfo(id);
}
swagger2 多环境安全配置
领导要求生产环境关闭 swagger我们该怎么做?
在配置文件新增开关
#swagger 开关
swagger2.enable=true
修改 SwaggerConfig 动态设置开关
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Value("${swagger2.enable}")
private boolean enable;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())//创建该Api的基本信息(这些基本信息会展现在文档页面中)
.select()//函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger ui来展现
.apis(RequestHandlerSelectors.basePackage("com.yingxue.lesson.controller"))//
指定需要扫描的包路路径
.paths(PathSelectors.any())
.build()
.enable(enable)//设置开关
;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("spring boot2.x实战")
.description("spring boot2.x 零基础到高级实战系列")
.termsOfServiceUrl("")
.version("1.0")
.build();
}
}
假如入某个接口需从header拿一些数据检验怎么办?
swagger 可全局设置 header 入口
修改 SwaggerConfig 配置类
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Value("${swagger2.enable}")
private boolean enable;
@Bean
public Docket createRestApi() {
/**
* 这是为了我们在用 swagger 测试接口的时候添加头部信息
*/
List<Parameter> pars = new ArrayList<Parameter>();
ParameterBuilder tokenPar = new ParameterBuilder();
tokenPar.name("token").description("swagger测试用(模拟token传入)非必填 header").modelRef(new
ModelRef("string")).parameterType("header").required(false);
/**
* 多个的时候 就直接添加到 pars 就可以了
*/
pars.add(tokenPar.build());
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())//创建该Api的基本信息(这些基本信息会展现在文档页面中)
.select()//函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger ui来展现
.apis(RequestHandlerSelectors.basePackage("com.yingxue.lesson.controller"))//指定需
要扫描的包路路径
.paths(PathSelectors.any())
.build()
.globalOperationParameters(pars)
.enable(enable)
;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("spring boot2.x实战")
.description("spring boot2.x 零基础到高级实战系列")
.termsOfServiceUrl("")
.version("1.0")
.build();
}
}
修改 testSwagger方法
@ApiOperation(value = "第一个swagger接口")
@PostMapping("/swagger")
public SwaggerReqVO testSwagger(@RequestBody SwaggerReqVO vo, HttpServletRequest request){
System.out.println(request.getHeader("token"));
return vo;
}