springboot-mybatisplus笔记

Posted tea_year

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot-mybatisplus笔记相关的知识,希望对你有一定的参考价值。

1,课程回顾

2,本章重点

 mybatisplus   简介  特点

 mybatisplus  入门例子

 springboot整合mybatisplus及使用

 mybatisplus 自动代码生成

 mybatisplus 分页插件

 hutool  工具包

 easycode代码生成springboot+mybatisplus    

3,具体内容

3.1 mybatisplus 简介 特征

3.1.1 简介:

      为简化开发而生,简化mybatis单表CRUD过程,只做增强不做改变,自动代码生成,自动分页。

   MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

3.1.2 特征:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 mysql、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

3.2 框架架构


3.3 mybatisplus 入门例子
3.3.1 创建表插入数据

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

3.3.2 创建工程引入jar
引入parent

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.6.2</version>
  <relativePath/>
</parent>
  引入其他依赖:     
 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <!--mybatisplus核心包-->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.5.0</version>
    </dependency>
    <!-- mysql驱动包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.49</version>
    </dependency>

    <!-- lombok 简化实体类写法  日志功能支持-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
      <scope>provided</scope>
    </dependency>

3.3.3 编写application.yml配置(注意自己的数据库版本和用户名密码)

DataSource Config

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
   # schema: classpath:db/schema-h2.sql
   # data: classpath:db/data-h2.sql
    url: jdbc:mysql://localhost:3306/db_qy141?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
#配置日志输出
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

如果使用druid可以加上jar,更换配置
 <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.2.8</version>
    </dependency>

#配置整合druid
spring:
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/db_qy141?useUnicode=true&characterEncoding=utf-8
      username: root
      password: root
      initial-size: 5
      max-active: 20
      min-idle: 10
      max-wait: 10
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000

3.3.4 编写实体类

@Data
public class User 
    private Long id;
    private String name;
    private Integer age;
    private String email;

3.3.5 编写mapper

public interface UserMapper extends BaseMapper<User> 

3.3.6 编写启动类

@SpringBootApplication
@MapperScan("com.aaa.sbmp.mapper")
@EnableSwagger2
public class Application 
    public static void main(String[] args) 
        SpringApplication.run(Application.class,args);
    

3.3.6 编写测试类(注意测试类和启动类需要包名称一致)

@SpringBootTest
public class SampleTest 
    @Resource
    private UserMapper userMapper;
    @Test
    public void testSelect() 
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        //断言  不空继续  为空不再执行
        Assert.notNull(userList,"userList为空");
        //jdk8新特性   System.out::println      执行类::方法
        userList.forEach(System.out::println);
    

3.4 mybatisplus 自动代码生成
3.4.1 引入jar

 <!--mybatisplus 代码生成器包-->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-generator</artifactId>
      <version>3.5.1</version>
    </dependency>
    <!--默认前端引擎包 不加生成时会报错-->
    <dependency>
      <groupId>org.apache.velocity</groupId>
      <artifactId>velocity-engine-core</artifactId>
      <version>2.3</version>
    </dependency>

3.4.2 生成器代码

public class AutoCodeGenerator 
    public static void main(String[] args) 
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/db_qy141",
                "root", "root")
                .globalConfig(builder -> //全局配置
                    builder.author("baomidou") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("D:\\\\idea_qy141\\\\springboot_mybatisplus_demo_20220114\\\\src\\\\main\\\\java"); // 指定输出目录
                )
                .packageConfig(builder -> //包配置
                    builder.parent("com.aaa") // 设置父包名
                            .moduleName("sbmp") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,
                                    "D:\\\\idea_qy141\\\\springboot_mybatisplus_demo_20220114\\\\src\\\\main\\\\resources\\\\mapper")); // 设置mapperXml生成路径
                )
                .strategyConfig(builder -> 
                    builder.addInclude("tb_dept","sys_menu") // 设置需要生成的表名
                            .addTablePrefix("tb_", "sys_"); // 设置过滤表前缀
                )
                //.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    

3.5 springboot整合mybatisplus及使用
3.5.1 学习mybatisplus提供的service和dao接口

https://baomidou.com/pages/49cc81/
3.5.2 配置mybatisplus 分页插件

@Configuration
public class MybatisPlusConfig 
    /**
     *  最新版 mp分页插件配置
     * @return
     */
    @Bean //<bean id=mybatisPlusInterceptor class='com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor'
    public MybatisPlusInterceptor mybatisPlusInterceptor() 
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    

3.5.3 编写分页带参查询代码,学习QueryWrapper用法
QueryWrapper用法:https://baomidou.com/pages/10c804/

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author baomidou
 * @since 2022-01-14
 */
@Service
public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements IDeptService 

    @Resource
    private DeptMapper deptMapper;
    @Override
    public IPage<Dept> queryPage(Map map) 
        //分页参数设置
        IPage<Dept>  page = new Page<>();
        //设置当前页码  第几页
        page.setCurrent(Long.valueOf(map.get("pageNo")+""));
        //设置每页显示条数
        page.setSize(Long.valueOf(map.get("pageSize")+""));
        //查询封装类
        QueryWrapper queryWrapper =new QueryWrapper();
        //使用加各种参数
       // if(map.get("deptName")!=null&&!map.get("deptName").equals(""))
        if(!StringUtils.isEmpty(map.get("deptName")))
            queryWrapper.like("dname",map.get("deptName"));
        
        if(!StringUtils.isEmpty(map.get("loc")))
            queryWrapper.like("loc",map.get("loc"));
        
        return deptMapper.selectPage(page,queryWrapper);
    

3.5.4 编写controller代码


@RestController
@RequestMapping("/sbmp/dept")
public class DeptController extends BaseController
    @Resource
    private IDeptService iDeptService;
    /**
     * 添加
     * @param dept
     * @return
     */
    @PostMapping("add")
    public Result  add(@RequestBody Dept dept)
        return success(iDeptService.save(dept));
    
    /**
     * 更新
     * @param dept
     * @return
     */
    @PutMapping("update")
    public Result  update(@RequestBody Dept dept)
        return success(iDeptService.saveOrUpdate(dept));
    
    /**
     * 删除
     * @param depNo
     * @return
     */
    @DeleteMapping("removeById")
    public Result  removeById(Integer depNo)
        return success(iDeptService.removeById(depNo));
    

    /**
     * 分页带参查询方法
     * @param map
     * @return
     */
    @PutMapping("page")
    public Result  page(@RequestBody Map  map)
        return success(iDeptService.queryPage(map));
    


3.5.5 整合swagger及测试
引入swagger包
注意:最新版本spring-boot 3.6.2整合swagger任何版本都会报空指针,降低springboot版本为3.5.7

<!-- springfox-swagger2 -->
<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-swagger2</artifactId>
  <version>2.9.2</version>
</dependency>
<!-- springfox-swagger-ui -->
<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-swagger-ui</artifactId>
  <version>2.9.2</version>
</dependency>

swagger配置


@Configuration
public class SwaggerConfig 
    /**
     * 创建一个docket
     * @return
     */
    @Bean
    public Docket docket() 
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //.enable(false)  //swagger不能访问
                .select()
                //配置要扫描接口的方式
                .apis(RequestHandlerSelectors.basePackage("com.aaa.sbmp.controller"))
                //路径过滤
                .paths(PathSelectors.any())
                .build();
    
    /**
     * apiInfo
     * @return
     */
    private ApiInfo apiInfo() 
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2构建springboot+mybatisplus")
                .description("更多请关注http://www.baidu.com")
                .termsOfServiceUrl("http://www.baidu.com")
                .contact(new Contact("AAA","http://www.baidu.com","123@qq.com"))
                .version("1.0")
                .build();
    

启动类加入注解
@EnableSwagger2
version:1.0.0

 */
@SpringBootApplication
@MapperScan("com.aaa.sbmp.mapper")
@EnableSwagger2
public class Application 
    public static void main(String[] args) 
        SpringApplication.run(Application.class,args);
    

3.5.6 启动测试:
http://localhost:8080/swagger-ui.html
3.6 hutool 工具包
简介:
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
引入和使用:

cn.hutool
hutool-all
5.7.19

if(StrUtil.isNotEmpty(map.get(“deptName”)))
queryWrapper.like(“dname”,map.get(“deptName”));

if(StrUtil.isNotEmpty(map.get(“loc”)))
queryWrapper.like(“loc”,map.get(“loc”));

3.7 QueryWrapper的使用

QueryWrapper queryWrapper =new QueryWrapper();
        Map map =new HashMap();
        //allEq的用法
        /*if(dept.getDeptno()!=null) 
            map.put("deptno", dept.getDeptno());
        
        if(StrUtil.isNotEmpty(dept.getDname())) 
            map.put("dname", dept.getDname());
        
        if(StrUtil.isNotEmpty(dept.getLoc())) 
            map.put("loc",dept.getLoc());
        
        queryWrapper.allEq(map);
        */
     /*   map.put("deptno", dept.getDeptno());
        map.put("dname", dept.getDname());
        map.put("loc",dept.getLoc());
        //第2参数:false   为空不拼接
        queryWrapper.allEq(map,false);*/
        //eq用法
        //queryWrapper.eq("deptno",dept.getDeptno());
        //queryWrapper.eq(dept.getDeptno()>0,"deptno",dept.getDeptno());
        //ne用法
        //queryWrapper.ne("deptno",dept.getDeptno());
        //queryWrapper.ne(dept.getDeptno()>0,"deptno",dept.getDeptno());
        //gt
        //queryWrapper.gt("deptno",dept.getDeptno());
        //ge
        //queryWrapper.gt("deptno",dept.getDeptno());
        //between   notBetween用法
       // queryWrapper.between("deptno",dept.getMinValue(),dept.getMaxValue());
       // queryWrapper.between(dept.getMinValue()>0&&dept.getMaxValue()>0,"deptno",dept.getMinValue(),dept.getMaxValue());
        //like notLike 用法  likeLeft likeRight
       // queryWrapper.notLike("dname",dept.getDname());
       // queryWrapper.notLike(dept.getDname()!=null,"dname",dept.getDname());
        // isNull用法   isNotNull
       // queryWrapper.isNull("dname");
        //queryWrapper.isNull("loc");
        //queryWrapper.isNotNull("dname");
        // in  notIn用法
       // queryWrapper.in("deptno",55,60,70);
       /* List list =new ArrayList();
        String[] deptnoArray = dept.getDname().split(",");
        for (int i = 0; i < deptnoArray.length; i++) 
            list.add(deptnoArray[i]);
        
        queryWrapper.in("deptno",list);*/
        //queryWrapper.in("deptno",Arrays.asList(dept.getDname().split(",")));
        //insql 用法  sql嵌套子查询   notInSql
       //queryWrapper.inSql("deptno",dept.getSql());
      // queryWrapper.inSql(dept.getSql()!=null,"deptno",dept.getSql());
       //queryWrapper.notInSql("deptno",dept.getSql());
        //groupBy
        //queryWrapper.groupBy("dname");
        //orderByAsc  orderByDesc
        //queryWrapper.orderByAsc("deptno","dname");
        //queryWrapper.orderByDesc("deptno","dname

以上是关于springboot-mybatisplus笔记的主要内容,如果未能解决你的问题,请参考以下文章

redis 学习笔记三

机器学习算法笔记2. 学习算法与最小均方算法(LMS)

Ext.Net学习笔记06:Ext.Net DirectEvents用方补充

Nacos学习笔记 服务发现基础应用

Nacos学习笔记 服务发现基础应用

angular2 学习笔记 ( 第3方插件 jQuery and ckeditor )