MybatisPlus

一、基础入门(springboot整合MybatisPlus入门程序)

  • 1.创建springboot模块,配置基础信息,模块使用的技术及仅选择MySql
  • 2.pom文件手动添加起步依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>
  • 3.制作实体类与表结构,类名与表名要对应,属性名与字段名要对应
  • 4.设置jdbc参数
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
    username: root
    password: root
  • 5.dao层定义数据接口,继承BaseMapper
@Mapper
public interface UserDao extends BaseMapper<User> {
}
  • 6.测试类中注入dao接口,测试功能
@SpringBootTest
public class Mybatisplus01QuickstartApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void testGetAll() {
        List<User> userList = userDao.selectList(null);
        System.out.println(userList);
    }
}

二、标准数据层开发(CRUD操作)

图片.png
package com.itheima;

import com.itheima.dao.UserDao;
import com.itheima.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {

    @Autowired
    private UserDao userDao;

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

    @Test
    void testDelete() {
        userDao.deleteById(1401856123725713409L);
    }

    @Test
    void testUpdate() {
        User user = new User();
        user.setId(1L);
        user.setName("Tom888");
        user.setPassword("tom888");
        userDao.updateById(user);
    }

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


    @Test
    void testGetAll() {
        List<User> userList = userDao.selectList(null);
        System.out.println(userList);
    }
}

三、Lombok插件介绍

  • 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;
}

四、分页功能

  • 设置分页拦截器作为Spring管理的bean
package com.example.config;

import com.baomidou.mybatisplus.annotation.DbType;
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 MybatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
  • 执行分页查询
//分页查询
@Test
void testSelectPage(){
    //1 创建IPage分页对象,设置分页参数
    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());
}

五、条件查询

条件查询方式

  • 方式一:按条件查询
//方式一:按条件查询
QueryWrapper<User> qw=new QueryWrapper<>();
qw.lt("age", 18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
  • 方式二:lambda格式按条件查询
//方式二:lambda格式按条件查询
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lambda().lt(User::getAge, 10);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
  • 方式三:lambda格式按条件查询(推荐)
//方式三:lambda格式按条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

其他条件控制

//组合条件
    @Test
    void find4(){
        //10-30岁
        LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,"30").gt(User::getAge,"10");
        List<User> users = userDao.selectList(lqw);
        System.out.println(users);
    }
    @Test
    void find5(){
        //小于10 大于30
        LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,"10").or().gt(User::getAge,"30");
        List<User> users = userDao.selectList(lqw);
        System.out.println(users);
    }

    //null值处理
    @Test
    void find6(){
        Integer maxAge=null;
        Integer minAge=10;

        LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
        /*lqw.gt(minAge!=null,User::getAge,minAge);
        lqw.lt(maxAge!=null,User::getAge,maxAge);*/


        lqw.lt(maxAge!=null,User::getAge,maxAge).gt(minAge!=null,User::getAge,minAge);


        List<User> users = userDao.selectList(lqw);
        System.out.println(users);

    }

    //查询字段  未定义的属性  分组  分页
    @Test
    void find7(){
        //按id 姓名字段查询数据
        QueryWrapper<User> qw=new QueryWrapper<>();
        qw.select("id","user_name");
        List<User> users = userDao.selectList(qw);
        System.out.println(users);
    }
    @Test
    void find8(){
        //以姓名分组 并统计个数
        QueryWrapper<User> qw=new QueryWrapper<>();
        qw.select("count(*) as count,name ").groupBy("name");
//        qw.groupBy("tel");
        List<Map<String, Object>> maps = userDao.selectMaps(qw);
        System.out.println(maps);
    }

    //查询条件
    @Test
    void find9(){
        LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
        //模拟登录功能  查询name为snake password为123456的用户
        lqw.eq(User::getUserName,"snake").eq(User::getPassword,"123456");
        User user = userDao.selectOne(lqw);
        System.out.println(user);
    }
    @Test
    void find10(){
        //按年龄区间查询
        LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
        lqw.between(User::getAge,10,20);
        List<User> users = userDao.selectList(lqw);
        System.out.println(users);
    }
    @Test
    void find11(){
        //模糊查询  查询姓名以j开头的数据
        LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
        lqw.likeRight(User::getUserName,"j");
        List<User> users = userDao.selectList(lqw);
        System.out.println(users);
    }
    @Test
    void find12(){
        //分组查询聚合函数
        QueryWrapper<User> qw=new QueryWrapper<>();
        qw.select("count(*) as 个数,tel").groupBy("tel");
        List<Map<String, Object>> maps = userDao.selectMaps(qw);
        System.out.println(maps);
    }

    //课后作业
    @Test
    void work(){
        //查询用户年龄大于50岁的或者用户名以“j”为开头的,按照年龄降序排列,查询第2页,每页3条。 的用户列表信息
        IPage<User> page=new Page<>(1,3);
        LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
        lqw.likeRight(User::getUserName,"j").orderByDesc(User::getAge).gt(User::getAge,"10");
        IPage<User> selectPage = userDao.selectPage(page, lqw);
        System.out.println(selectPage.getRecords());
    }

六、字段映射与表名映射

  • 表字段与编码属性设计不同步
    在模型类属性上方,使用@TableField属性注解,通过value属性,设置当前属性对应的数据库表中的字段关系。
    图片.png
  • 编码中添加了数据库中未定义的属性
    在模型类属性上方,使用@TableField注解,通过exist属性,设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用。
    图片.png
  • 表名与编码开发设计不同步
    在模型类上方,使用@TableName注解,通过value属性,设置当前类对应的数据库表名称。
    图片.png
@Data
@TableName("tbl_user")
public class User {
    /*
        id为Long类型,因为数据库中id为bigint类型,
        并且mybatis有自己的一套id生成方案,生成出来的id必须是Long类型
     */
    private Long id;
    private String name;
    @TableField(value = "pwd",select = false)
    private String password;
    private Integer age;
    private String tel;
    @TableField(exist = false) //表示online字段不参与CRUD操作
    private Boolean online;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • MyBatisPlus MyBatisPlus简称mp,是mybatis的增强工具,在mybatis的基础上只做增...
    幻如常阅读 634评论 0 0
  • 转载于:https://mp.weixin.qq.com/s/wyymQUcK1QeCRfoxhd_d7w[htt...
    上善若泪阅读 2,259评论 0 2
  • 一、MP 是什么 MP全称Mybatis-Plus,套用官方的解释便是成为 MyBatis 最好的搭档,简称基友。...
    陈二狗想吃肉阅读 1,673评论 0 4
  • 本文是通过慕课网相关课程学习MyBatisPlus整理的笔记。MyBatisPlus入门 : - ) 老师讲的...
    茶还是咖啡阅读 104,890评论 16 135
  • MyBatisPlus概述 需要的基础:把我的MyBatis,Spring, SpringMVC就可以学习这个了!...
    Raral阅读 743评论 0 4

友情链接更多精彩内容