SpringBoot超详细笔记

1. spring boot 简介

Gitee地址
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化老的Spring 应用开发。该框架
使用了自动方式来进行配置,减少开发人员定义配置复杂度。
SpringBoot 支持如下的嵌入式Servlet容器,Spring Boot应用程序最低支持到Servlet 3.1的容器。
在这里插入图片描述

2. spring boot 入门案例

这里使用多模块工程来进行演示

使用maven构建一个父工程spring-boot
添加springboot依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

使用maven构建一个子模块工程 spring-boot-helloworld 继承父模块工程 spring-boot,工程结构如下:
在这里插入图片描述
在父包com.iweb下创建启动类 HelloWorldApplication

/**
 * 南京艾瑞
 * 作者: jack
 * 时间: 2020-06-29 21:07
 * 描述: WebApplication
 */
@SpringBootApplication
public class HelloWorldApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class);
    }
}

在resources下创建springboot核心配置文件application.yml,可以不需要配置任何参数,基本参数都有默认值

server:
  port: 8080

编写控制器

/**
 * 南京艾瑞
 * 作者: jack
 * 时间: 2020-06-29 21:07
 * 描述: UserController
 */
@RestController
public class UserController {

    @RequestMapping("hello")
    public String hello(String name) {
        System.out.println(name);
        return "hello:" + name;
    }

}

启动工程:执行启动类HelloWorldApplication的main方法即可
在这里插入图片描述
测试访问
在这里插入图片描述

3. starters的原理

starters是依赖关系的整理和封装。是一套依赖坐标的整合,可以让导入应用开发的依赖坐标更方便。

有了这些Starters,你获得Spring和其整合的所有技术的一站式服务。无需配置、无需复制粘贴依赖坐
标,一个坐标即可完成所有入门级别操作。举例:JPA or Web开发,只需要导入 spring-bootstarter-data-jpa 或 spring-boot-starter-web 。
spring boot starts常用参考地址

4. application.yml配置文件

我们知道SpringBoot是基于约定的,所以很多配置都有默认值。如果想修改默认配置,可以使用
application.properties或application.yml(application.yaml)自定义配置。SpringBoot默认从Resource
目录加载自定义配置文件。application.properties是键值对类型(一直在用)。application.yml是
SpringBoot中一种新的配置文件方式。

YML文件格式是YAML(YAML Aint Markup Language)编写的文件格式。可以直观被电脑识别的格式。
容易阅读,容易与脚本语言交互。可以支持各种编程语言(C/C++、Ruby、Python、Java、Perl、C#、
PHP)。以数据为核心,比XML更简洁。扩展名为.yml或.yaml
spring boot 配置信息参考地址

5. 日志管理

spring boot内部使用Commons Logging来记录日志,但也保留外部接口可以让一些日志框架来进行实现,例如Java Util Logging,Log4J2还有Logback。如果你想用某一种日志框架来进行实现的话,就必须先配置,默认情况下,spring boot使用Logback作为日志实现的框架。
我们还可以在classpath路径下,通过定义具体的日志文件来配置——logback.xml。

参考工程:spring-boot-log
添加依赖

<dependencies>
     <!--logback日志-->
     <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-classic</artifactId>
     </dependency>
     <!--Lombok-->
     <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
     </dependency>
 </dependencies>

lombok是为了方便打印日志

在这里插入图片描述
logback.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="D:\\log"/>
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/access.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
    <!--    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>-->
    <!--    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG"/>-->
    <!--    <logger name="org.hibernate.SQL" level="DEBUG"/>-->
    <!--    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG"/>-->
    <!--    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG"/>-->

    <!--myibatis log configure-->
    <!--    <logger name="com.apache.ibatis" level="TRACE"/>-->
    <!--    <logger name="java.sql.Connection" level="DEBUG"/>-->
    <!--    <logger name="java.sql.Statement" level="DEBUG"/>-->
    <!--    <logger name="java.sql.PreparedStatement" level="DEBUG"/>-->

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>
    <!--日志异步到数据库 -->
    <!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">-->
    <!--&lt;!&ndash;日志异步到数据库 &ndash;&gt;-->
    <!--<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">-->
    <!--&lt;!&ndash;连接池 &ndash;&gt;-->
    <!--<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">-->
    <!--<driverClass>com.mysql.jdbc.Driver</driverClass>-->
    <!--<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>-->
    <!--<user>root</user>-->
    <!--<password>root</password>-->
    <!--</dataSource>-->
    <!--</connectionSource>-->
    <!--</appender>-->
</configuration>

控制器代码

/**
 * 南京艾瑞
 * 作者: jack
 * 时间: 2020-06-29 11:27
 * 描述: UserController
 */
@Slf4j
@RestController
public class UserController {


    @GetMapping("hello")
    public String hello(String name) {
        log.info(name);
        return "hello:" + name;
    }

}

测试:
在这里插入图片描述

6. springboot整合jsp

Spring boot默认是支持thymeleaf模板,如果需要使用jsp需要手动添加
参考工程:spring-boot-jsp
在这里插入图片描述
基本配置就不说了,添加jsp的依赖

<dependencies>
    <!--logback日志-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>
    <!--Lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!--jsp-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
</dependencies>

success.jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>success</h1>
</body>
</html>

控制器代码

@Controller
public class UserController {

    @GetMapping("hello")
    public String hello() {
        System.out.println("hello");
        return "success";
    }

}

application.properties配置

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

GlobalConfig这个文件如果是单个工程就不需要了,只有子模块工程需要

@Configuration
public class GlobalConfig {
    // 整合JSP子模块工程
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> customizer() {
        return (factory) -> {
            factory.addContextCustomizers((context) -> { //模块中webapp相对路径
                //你子项目的module名称,而不是你修改的application name这点需要注意;
                String relativePath = "spring-boot-jsp/src/main/webapp";
                File docBaseFile = new File(relativePath); // 如果路径不存在,则把这个路径加入进去
                if (docBaseFile.exists()) {
                    context.setDocBase(docBaseFile.getAbsolutePath());
                }
            });
        };
    }
}

测试
在这里插入图片描述

7. springboot整合thymeleaf

简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP
参考工程: spring-boot-thymeleaf
在这里插入图片描述
添加依赖

<dependencies>
    <!--logback日志-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>
    <!--Lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!--thymeleaf-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
        <version>1.9.22</version>
    </dependency>
</dependencies>

application.yml配置

spring:
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    # 默认值是HTML,其实是一个很严格的检查,改为LEGACYHTML5可以得到一个可能更友好亲切的格式要求
    # LEGACYHTML5需要搭配一个额外的库NekoHTML才可用
    mode: LEGACYHTML5
    cache: false
    encoding: UTF-8

控制器代码

@Controller
public class UserController {
    @GetMapping("hello")
    public ModelAndView hello(String name, Model model) {
        System.out.println(name);
        // 模拟一个list返回页面
        List<String> list = new ArrayList<>();
        list.add("AA");
        list.add("BB");
        list.add("CC");
        model.addAttribute("list", list);
        return new ModelAndView("success", "model", model);
    }
}

在templates下创建success.html

<!DOCTYPE html>
<!--引用 thymeleaf-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>success</h1>
<!--thymeleaf语法-->
<div th:each="its,iterStat:${model.list}">
    <p th:text="${its}"></p>
</div>
</body>
</html>

测试
在这里插入图片描述
thymeleaf语法参考

<!--##基本语法-->
<!--通过${}获取变量值类似于OGNL,去上下文中的变量-->
<p th:text="${index}"></p>
<!--通过*{}来获取变量值等同于上面的写法-->
<p th:text="*{index}"></p>

<!--$和*的区别,$获取的是上下文的变量,*可以获取父级标签和上下文的变量-->
<div th:object="${user}">
    <p th:text="${user.username}"></p>
    <p th:text="*{username}"></p>
</div>

<!--常用标签-->
<!--th:inline="text"属性的用法(文本内联),必须在<p>标签中增加th:inline属性-->
<p th:inline="text">[[${index}]] 88888</p>
<p th:inline="text">[[${index}]] 88888</p>

<!--th:inline="javascript" 属性的用法(脚本内联)-->
<script th:inline="javascript">
    console.log([[${index}]])
</script>

<!--链接表达式: @{…} 用来配合link src href使用的语法,类似的标签有:th:href和th:src-->
<a th:href="@{order(id=${id})}">index</a>

<!--遍历-->
<div th:each="its,iterStat:${list}">
    <p th:text="${its}"></p>
    <!--<span th:text="${iterStat.size}"></span>-->
</div>
<!--th布局 th:include 和 th:replace-->
<div th:include="copy::copy"></div>
<div th:replace="copy::copy"></div>

8. springboot整合mybatis-plus

参考工程:spring-boot-ssm

在这里插入图片描述
添加依赖

<properties>
    <swagger.version>2.9.2</swagger.version>
</properties>

<dependencies>
    <!--logback日志-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>
    <!--Lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <!--druid数据源-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.1.0</version>
    </dependency>
    <!--swagger-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger.version}</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger.version}</version>
    </dependency>

    <!--mybatis plus 逆向生成-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.1.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity-engine-core</artifactId>
        <version>2.0</version>
        <scope>test</scope>
    </dependency>
    <!--单元测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>

</dependencies>

编写启动类

@SpringBootApplication
public class WebApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class);
    }
}

application.yml配置

server:
  port: 8080
#  servlet:
#    context-path: /

spring:
  application:
    name: ssm
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://192.168.100.101:3306/dbcp?useUnicode=true&characterEncoding=UTF-8
      username: root
      password: 123456
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.iweb.model
  global-config:
    db-config:
      id-type: id_worker_str # 分布式全局唯一id
  configuration:
    map-underscore-to-camel-case: false # 驼峰是否转下划线
    cache-enabled: true # 全局缓存开关
    lazy-loading-enabled: true # 延迟加载
    multiple-result-sets-enabled: true # 开启延时加载,否则按需加载 属性
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印sql语句

使用mybatis plus生成 mapper.xml、model、mapper接口,这里取消了 controller和service的生成,自己来完成代码的编写
MyBatisGenerate类代码(根据自己的实际情况修改)

package com.iweb;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class MyBatisGenerate {

    @Test
    public void generate() {
        String url = "jdbc:mysql://192.168.100.101:3306/dbcp?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull";
        // 基本包
        String parentPackage = "com.iweb";
        String baseDir = System.getProperty("user.dir");
        String driverClassName = "com.mysql.cj.jdbc.Driver";
        String username = "root";
        String password = "123456";

        // 表 前缀
        String[] tablePrefix = new String[]{"tb_"};
        String[] tableNames = new String[]{"tb_user"};

        /*数据源*/
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setUrl(url);
        dsc.setDriverName(driverClassName);
        dsc.setUsername(username);
        dsc.setPassword(password);

        /*全局配置*/
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(baseDir + "/src/main/java");
        gc.setFileOverride(true);
        gc.setActiveRecord(true);
        gc.setEnableCache(false);// XML 二级缓存
        gc.setBaseResultMap(true);// XML ResultMap
        gc.setBaseColumnList(true);// XML columList
        gc.setAuthor("jack");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setControllerName("%sController");

        /*生成策略*/
        StrategyConfig strategy = new StrategyConfig();
        strategy.setTablePrefix(tablePrefix);// 此处可以修改为您的表前缀
        strategy.setNaming(NamingStrategy.underline_to_camel);// 字段名生成策略
        strategy.setInclude(tableNames); // 需要生成的表
        strategy.setEntityLombokModel(true);
        strategy.setEntityTableFieldAnnotationEnable(true);

        /*生成文件包配置*/
        PackageConfig pc = new PackageConfig();
        pc.setParent(parentPackage);
        pc.setController("controller");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        pc.setEntity("model");
        pc.setMapper("mapper");

        AutoGenerator mpg = new AutoGenerator();

        /*xml文件配置*/
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // nothing
            }
        };
        //xml生成路径
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return baseDir + "/src/main/resources/" + "/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 关闭默认 xml 生成,调整生成 至 根目录
        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null);
        tc.setController(""); // 禁止生成controller
        tc.setService("");
        tc.setServiceImpl("");

        mpg.setDataSource(dsc);         //数据源配置
        mpg.setGlobalConfig(gc);        //全局配置
        mpg.setStrategy(strategy);      //生成策略配置
        mpg.setPackageInfo(pc);         //包配置
        mpg.setCfg(cfg);                //xml配置
        mpg.setTemplate(tc);            //
        // 执行生成
        mpg.execute();
    }

}

配置配置类
MyBatisConfig

@Configuration
@MapperScan("com.iweb.mapper")
public class MyBatisConfig {

    // 配置分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

}

AppConfig

@EnableTransactionManagement
@Configuration
public class AppConfig {
}

SwaggerConfig

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket docket() {

        return new Docket(DocumentationType.SWAGGER_2)
                .pathMapping("/")// 请求的路径
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.iweb"))
                .paths(PathSelectors.any())
                .build().apiInfo(new ApiInfoBuilder()
                        .title("项目统一接口")
                        .description("微服务restful接口")
                        .version("1.0")
                        .contact(new Contact("jack", "https://www.baidu.com", "36956271@qq.com"))
                        .license("南京艾瑞职业培训学校")
                        .licenseUrl("http://www.baidu.com")
                        .build());
    }
}

控制器代码

@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    // 查询所有的用户
    @GetMapping
    public List<User> findAll() {
        List<User> users = userService.findAll();
        return users;
    }

    // 更具id查询
    @GetMapping("{id}")
    public User findById(@PathVariable String id) {
        User user = userService.findById(id);
        return user;
    }

    // 更具id修改
    @ApiOperation("根据id修改用户")
    @PutMapping("{id}")
    public User updateById(@PathVariable String id, @RequestBody User user) {
        user.setId(id);
        User dataUser = userService.updateById(user);
        return dataUser;
    }

    // 根据id删除
    @DeleteMapping("{id}")
    public Object deleteById(@PathVariable String id) {
        userService.deleteById(id);
        return null;
    }

    // 新增用户
    @PostMapping
    public User addUser(@RequestBody User user) {
        user = userService.addUser(user);
        return user;
    }

    // 分页
    @GetMapping("{current}/{size}")
    public List<User> findUsersByPage(@PathVariable Integer current, @PathVariable Integer size) {
        List<User> users = userService.findUsersByPage(current, size);
        return users;
    }

    // 条件查询
    @PostMapping("findByUser")
    public List<User> findByUser(@RequestBody User user) {
        List<User> users = userService.findByUser(user);
        return users;
    }

}

服务层代码

@Service
public class UserService {

    @Resource
    private UserMapper userMapper;

    public List<User> findAll() {
        return userMapper.selectList(null);
    }

    public User findById(String id) {
        return userMapper.selectById(id);
    }

    public User updateById(User user) {
        userMapper.updateById(user);
        return userMapper.selectById(user.getId());
    }

    public void deleteById(String id) {
        userMapper.deleteById(id);
    }

    @Transactional(rollbackFor = RuntimeException.class)
    public User addUser(User user) {
        // id使用分布式唯一id
        userMapper.insert(user);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", user.getUsername());
        Integer count = userMapper.selectCount(queryWrapper);
        if (count > 1) {
            throw new RuntimeException("用户重复");
        }
        return user;
    }

    public List<User> findUsersByPage(Integer current, Integer size) {
        IPage<User> page = new Page<>(current, size);
        IPage<User> userIPage = userMapper.selectPage(page, null);
        System.out.println("总条数:" + userIPage.getTotal());
        return userIPage.getRecords();
    }

    public List<User> findByUser(User user) {
        Wrapper<User> queryWrapper = new QueryWrapper<>(user);
        // 非 == 比较
        // QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // queryWrapper.like("数据库的列名", user.getPassword());
        List<User> users = userMapper.selectList(queryWrapper);
        return users;
    }
}

测试统一使用postman测试,这里不截图了。这里除了简单的增删改查测试还有一个事务的回滚测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值