ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HM2022ssm-mp2【MyBatisPlus标准数据层开发】

2022-05-15 15:02:58  阅读:168  来源: 互联网

标签:MyBatisPlus Wrapper mp2 Param HM2022ssm import com public user


1. 标准CRUD使用

image-20220515134555603

2. 新增

image-20220515134956972

@Test
public void testSave() {
    User user = new User();
    user.setName("黑马程序员");
    user.setPassword("itheima");
    user.setAge(12);
    user.setTel("4006184000");
    int count = userDao.insert(user);
    System.out.println(count);
}

image-20220515135054607

image-20220515135109774

但是数据中的主键ID,有点长,那这个主键ID是如何来的?

我们更想要的是主键自增,应该是5才对,这个是我们后面要学习的主键ID生成策略,暂时先放放。

3. 删除

在进行删除之前,我们可以分析下删除的方法:

int deleteById (Serializable id)
  • Serializable:参数类型

    • 思考:参数类型为什么是一个序列化类?

      从这张图可以看出,

      • String和Number是Serializable的子类,
      • Number又是Float,Double,Integer等类的父类,
      • 能作为主键的数据类型都已经是Serializable的子类,
      • MP使用Serializable作为参数类型,就好比我们可以用Object接收任何数据类型一样。
  • int:返回值类型,数据删除成功返回1,未删除数据返回0。

@Test
public void testDel() {
    int count = userDao.deleteById(1525715226160058369L);
    System.out.println(count);
}

image-20220515135349985

image-20220515135402648

4. 修改

    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(1L);
        user.setName("tom999");
        int count = userDao.updateById(user);
        System.out.println(count);
    }

image-20220515135552274

image-20220515135622601

说明:修改的时候,只修改实体对象中有值的字段。

5. 根据ID查询

T selectById (Serializable id)
@Test
public void testGetById() {
    User user = userDao.selectById(2L);
    System.out.println(user);
}

image-20220515140024660

6. 查询所有

在进行查询所有之前,我们可以分析下查询所有的方法:

List<T> selectList(Wrapper<T> queryWrapper)
  • Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null
  • List:因为查询的是所有,所以返回的数据是一个集合
@Test
public void testGetAll() {
    List<User> userList = userDao.selectList(null);
    for (User user : userList) {
        System.out.println(user);
    }
}

image-20220515140242299

我们所调用的方法都是来自于DAO接口继承的BaseMapper类中。里面的方法有很多,我们后面会慢慢去学习里面的内容。

BaseMapper:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.baomidou.mybatisplus.core.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;

public interface BaseMapper<T> extends Mapper<T> {
    int insert(T entity);

    int deleteById(Serializable id);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> queryWrapper);

    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    int updateById(@Param("et") T entity);

    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    T selectById(Serializable id);

    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

    T selectOne(@Param("ew") Wrapper<T> queryWrapper);

    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}

7. Lombok

7.1 概念

代码写到这,我们会发现DAO接口类的编写现在变成最简单的了,里面什么都不用写。反过来看看模型类的编写都需要哪些内容:

  • 私有属性
  • setter...getter...方法
  • toString方法
  • 构造函数

虽然这些内容不难,同时也都是通过IDEA工具生成的,但是过程还是必须得走一遍,那么对于模型类的编写有没有什么优化方法?就是我们接下来要学习的Lombok。

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

7.2 使用步骤

7.2.1 步骤1:添加lombok依赖

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

注意:版本可以不用写,因为SpringBoot中已经管理了lombok的版本。

7.2.2 步骤2:安装Lombok的插件

新版本IDEA已经内置了该插件,如果删除setter和getter方法程序有报红,则需要安装插件

image-20220515140518021

7.2.3 步骤3:模型类上添加注解

Lombok常见的注解有:

  • @Setter:为模型类的属性提供setter方法
  • @Getter:为模型类的属性提供getter方法
  • @ToString:为模型类的属性提供toString方法
  • @EqualsAndHashCode:为模型类的属性提供equals和hashcode方法
  • @Data:是个组合注解,包含上面的注解的功能
  • @NoArgsConstructor:提供一个无参构造函数
  • @AllArgsConstructor:提供一个包含所有参数的构造函数

Lombok的注解还有很多,上面标注的三个是比较常用的,其他的大家后期用到了,再去补充学习。

package com.yppah.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data //= @Setter + @Getter + @ToString + @EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
}

说明:

Lombok只是简化模型类的编写,我们之前的方法也能用,比如有人会问:我如果只想要有name和password的构造函数,该如何编写?

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
}

这种方式是被允许的。

8. 分页功能

8.1 接口介绍

基础的增删改查就已经学习完了,刚才我们在分析基础开发的时候,有一个分页功能还没有实现,在MP中如何实现分页功能,就是咱们接下来要学习的内容。

分页查询使用的方法是:

IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)
  • IPage:用来构建分页查询条件
  • Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null
  • IPage:返回值,你会发现构建分页条件和方法的返回值都是IPage

IPage是一个接口,我们需要找到它的实现类来构建它,具体的实现类,可以进入到IPage类中按ctrl+h,会找到其有一个实现类为Page

8.2 使用步骤

8.2.1 步骤1:调用方法传入参数获取返回值

package com.yppah;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yppah.dao.UserDao;
import com.yppah.domain.User;
import org.junit.Test;
//import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Mp01QuickstartApplication.class)
public class Mp01QuickstartApplicationTests {

    @Autowired
    private UserDao userDao;

    @Test
    public void testSelectPage() {
        //1 创建IPage分页对象,设置分页参数,1为当前页码,3为每页显示的记录数
        IPage<User> page=new Page<>(1,3);
        //2 执行分页查询
        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());
    }
    
}

此时直接运行该测试方法,还不能实现分页功能,效果如下,可以看到仍然是查询全部

image-20220515141842583

还需要设置拦截器才能实现分页功能

8.2.2 步骤2:设置分页拦截器

这个拦截器MP已经为我们提供好了,我们只需要将其配置成Spring管理的bean对象即可。

image-20220515143906273

package com.yppah.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MpConfig {

    @Bean
    public MybatisPlusInterceptor mpInterceptor() {
        //1 创建MybatisPlusInterceptor拦截器对象
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2 添加具体的拦截器,如此处的分页拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //3 返回拦截器对象
        return mpInterceptor;
    }

}

说明:上面的代码记不住咋办呢?

这些内容在MP的官方文档中有详细的说明,我们可以查看官方文档类配置

image-20220515143934499

8.2.3 步骤3:运行测试程序

配置好拦截器后,现在再来运行一下分页测试方法,可以看到分页功能生效了

image-20220515144122265

说明:

如果想查看MP执行的SQL语句,可以修改application.yml配置文件

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印SQL日志到控制台

打开日志后,就可以在控制台打印出对应的SQL语句,开启日志功能性能就会受到影响,调试完后记得关闭。

image-20220515144329586

image-20220515144419445

image-20220515144628895

标签:MyBatisPlus,Wrapper,mp2,Param,HM2022ssm,import,com,public,user
来源: https://www.cnblogs.com/yppah/p/16273202.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有