1分钟学会SpringBoot2知识点,让你35岁不再失业(二)

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;
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值