mybatisplus复习(黑马)

Posted 姜小白程序

tags:

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

学习目标


能够基于MyBatisPlus完成标准Dao开发

能够掌握MyBatisPlus的条件查询

能够掌握MyBatisPlus的字段映射与表名映射

能够掌握id生成策略控制

能够理解代码生成器的相关配置

一、MyBatisPlus简介


MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率

开发方式

基于MyBatis使用MyBatisPlus

基于Spring使用MyBatisPlus

基于SpringBoot使用MyBatisPlus

1. 入门案例

①:创建新模块,选择Spring初始化,并配置模块相关基础信息
②:选择当前模块需要使用的技术集(仅保留JDBC)
③:手动添加MyBatisPlus起步依赖
       <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

            <!--添加mybatisplus的依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>

注意事项1:由于mp并未被收录到idea的系统内置配置,无法直接选择加入

注意事项2:如果使用Druid数据源,需要导入对应坐标

④:制作实体类与表结构

(类名与表名对应,属性名与字段名对应)

新建一个数据库mybatisplyus

⑤:设置Jdbc参数(application.yml)
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
    username: root
    password: 123456
⑥:定义数据接口,继承BaseMapper
//使用mp,dao的写法,只需要继承一个父亲接口就可以BaseMapper,还要注意加上泛型
@Mapper
public interface UserDao extends BaseMapper<User> 

⑦:测试类中注入dao接口,测试功能

查询所有

@SpringBootTest
public class TestUserDao 


    @Autowired
    private UserDao userDao;

    //查询所有
    @Test
    void testFindAll() 
        List<User> list = userDao.selectList(null);
        System.out.println("list=" +list);

2. MyBatisPlus概述

问题导入

通过入门案例制作,MyBatisPlus的优点有哪些?

2.1 MyBatis介绍

  • MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率

2.2 MyBatisPlus特性

  • 无侵入:只做增强不做改变,不会对现有工程产生影响

  • 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作

  • 支持 Lambda:编写查询条件无需担心字段写错

  • 支持主键自动生成

  • 内置分页插件

  • ……

二、标准数据层开发


1. MyBatisPlus的CRUD操作

下面用MP进行CURD

1.1添加

//    新增
@Test
    void testAdd() 
    User user = new User();
    user.setName("黑马程序员");
    user.setPassword("itheima");
    user.setAge(12);
    user.setTel("4006184000");
    int row = userDao.insert(user);
     System.out.println("row = " + row);

1.2 删除

这里面因为刚才不小心多增加一个相同内容 所以这里面删除的话id就用雪花

//删除
    @Test
    void testDelete() 
       // int row = userDao.deleteById(3);
        int row = userDao.deleteById(1631599267871215618L);
        System.out.println("row = " + row);
    

我们现在把另一个也删除了

1.3 修改

  //修改
    @Test
    void testUpdate() 
         //1.先查询数据
        User user = userDao.selectById(2);
        user.setPassword("777");
        //2.修改
        int row = userDao.updateById(user);
        System.out.println("row = " + row);
    

1.4 查询单个

     //查询单个
     @Test
     void testFindById() 
         User user = userDao.selectById(2);
         System.out.println("user = " + user);
     

2. Lombok插件介绍

问题导入

有什么简单的办法可以自动生成实体类的GET、SET方法?

  • Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

常用注解:==@Data==,为当前实体类在编译期设置对应的get/set方法,无参/无参构造方法,toString方法,hashCode方法,equals方法等

package com.itheima.domain;

import lombok.*;
/*
    1 生成getter和setter方法:@Getter、@Setter
      生成toString方法:@ToString
      生成equals和hashcode方法:@EqualsAndHashCode

    2 统一成以上所有:@Data

    3 生成空参构造: @NoArgsConstructor
      生成全参构造: @AllArgsConstructor

    4 lombok还给我们提供了builder的方式创建对象,好处就是可以链式编程。 @Builder【扩展】
 */
@Data
public class User 
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;

3. MyBatisPlus分页功能

问题导入

思考一下Mybatis分页插件是如何用的?

3.1 分页功能接口

3.2 MyBatisPlus分页使用

①:执行分页查询

Ipage 接口

用MP后 是有一个selectPage() 方法 然后这个方法传进去一个对象page 这里面就已经包装了查第几页 每页查第多少条

    //分面查询
    @Test
    void testFindPage() 

           /** @param current 当前页
            * @param size    每页显示条数*/
        //1 创建IPage分页对象,设置分页参数   当前页为第一页  每页显示条数为2条
        //IPage<User> page =new Page<>(1,2);
        //1 创建IPage分页对象,设置分页参数   当前页为第二页  每页显示条数为2条
        IPage<User> page =new Page<>(2,2);
        
        //2 执行分页查询
        IPage<User> iPage = userDao.selectPage(page, null);
        //3 获取分页结果
        System.out.println("当前页码值:"+page.getCurrent());
        System.out.println("每页显示数:"+page.getSize());
        System.out.println("总页数:"+page.getPages());
        System.out.println("总条数:"+page.getTotal());
        System.out.println("当前页数据:"+page.getRecords());

    

    

②:设置分页拦截器作为Spring管理的bean

@Configuration
public class MybatisPlusConfig 

    /*配置分页拦截器,需要打上@Bean的注解,暴露给spring使用*/

    @Bean
    public MybatisPlusInterceptor mpi()
        //1 创建MybatisPlus拦截器对象
        MybatisPlusInterceptor mpi  =new MybatisPlusInterceptor();
        //2 添加分页拦截器
        mpi.addInnerInterceptor(new PaginationInnerInterceptor());
        //返回MyBatisplus的拦截器对象
        return mpi;
    

重新运行发现 这回正常了

3.3 开启MyBatisPlus日志

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
    username: root
    password: 123456
# 开启mp的日志(输出到控制台)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.4 解决日志打印过多问题

3.4.1 取消初始化spring日志打印

做法:在resources下新建一个logback.xml文件,名称固定,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

</configuration>

关于logback参考播客:https://www.jianshu.com/p/75f9d11ae011

3.4.2 取消SpringBoot启动banner图标
spring:
  main:
    banner-mode: off # 关闭SpringBoot启动图标(banner)
3.4.3 取消MybatisPlus启动banner图标
# mybatis-plus日志控制台输出
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    banner: off # 关闭mybatisplus启动图标

三、DQL编程控制


环境准备

依赖

  <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

            <!--添加mybatisplus的依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>

从demo1复制依赖 yml dao bean

测试类test.TestUserDao

1. 条件查询方式

  • MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合

1.1 条件查询

无条件全查

@SpringBootTest
public class TestUserDao 
    
      @Autowired
    private UserDao userDao;

    @Test
    public  void  findByCondition()
        //查询年龄大于等于18岁 小于65岁的用户
        //1.构建条件对象
        QueryWrapper<User> qw =new QueryWrapper<>();

        //1.1 添加条件
        //2.执行查询
        List<User> list = userDao.selectList(qw);

        System.out.println("list = " + list);
    
1.1.1 方式一:按条件查询

@SpringBootTest
public class TestUserDao 
    
      @Autowired
    private UserDao userDao;

    @Test
    public  void  findByCondition()
        //查询年龄大于等于18岁 小于65岁的用户
        //1.构建条件对象
        QueryWrapper<User> qw =new QueryWrapper<>();

        //1.1 添加条件
         qw.ge("age",18);
         qw.lt("age",65);



        //2.执行查询
        List<User> list = userDao.selectList(qw);

        System.out.println("list = " + list);
    

链式写法

`@SpringBootTest
public class TestUserDao 
    
      @Autowired
    private UserDao userDao;

    @Test
    public  void  findByCondition()
        //查询年龄大于等于18岁 小于65岁的用户
        //1.构建条件对象
        QueryWrapper<User> qw =new QueryWrapper<>();

        //1.1 添加条件
        //常规
        // qw.ge("age",18);
       //  qw.lt("age",65);
      //链式写法
        qw.ge("age",18).lt("age",65);


        //2.执行查询
        List<User> list = userDao.selectList(qw);

        System.out.println("list = " + list);
    
1.1.2 方式二:lambda格式按条件查询
    //使用条件查询[使得lambda格式按条件查询]
    @Test
    public  void  findByCondition02()
        //查询年龄大于等于18岁 小于65岁的用户
        //1.构建条件对象
        QueryWrapper<User> qw =new QueryWrapper<>();

        //1.1 添加条件
        //常规
          qw.lambda().ge(User::getAge,18).lt(User::getAge,65);


        //2.执行查询
        List<User> list = userDao.selectList(qw);

        System.out.println("list = " + list);
    
1.1.3 方式三:lambda格式按条件查询(推荐)
  //使用条件查询[使得lambda格式按条件查询(推荐)]
    @Test
    public  void  findByCondition03()
        //查询年龄大于等于18岁 小于65岁的用户
        //1.构建条件对象
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();

        //1.1 添加条件
        //使用方法引用定位列的名字,可以很好的防止手动写列名,引发的一些问题。
        //常规
        lqw.ge(User::getAge,18);
        lqw.lt(User::getAge,65);

        //2.执行查询
        List<User> list = userDao.selectList(lqw);

        System.out.println("list = " + list);
    

1.2 组合条件

1.2.1 并且关系(and)

以上是关于mybatisplus复习(黑马)的主要内容,如果未能解决你的问题,请参考以下文章

黑马程序员SSM框架教程_Spring+SpringMVC+MyBatisPlus笔记(自学用,持续更新)

黑马Java笔记+踩坑汇总JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城

springboot复习(黑马)(持续更新)

了解MyBatisPlus的代码生成器

MyBatisPlus代码生成器原理分析

《黑马程序猿》 cocos2d游戏引擎复习笔记一