跳至主要內容

Mybatis-plus

TenSoFlow...大约 6 分钟后端MybatisPlus

Mybatis-plus

简介

MybatisPlus简称MP,是基于Mybatis框架基础上开发的增强型工具,旨在简化开发,提高效率。是国人开发的。

官网

MyBatis-Plus 官网open in new window

所需依赖

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.4.1</version>
</dependency>

使用方法

在Mapper上继承BaseMapper类

package com.ctg.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ctg.pojo.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserDao extends BaseMapper<User>
{

}

BaseMapper类里面的方法如下图

开启MybatisPlus的输出日志

# 开启mp的日志(输出到控制台,能查看SQL语句)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 关闭MP的banner
  global-config:
    banner: false

分页查询

第一步需要配置MybatisPlus这个框架为我们准备的分页拦截器

package com.ctg.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() {
        //定义Mp拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //添加具体的拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}

第二步使用方法

@Test
void testSelectByPage() {
    // Page(1,2) 表示查第一页,每页2条数据
    IPage page = new Page(1,2);
    userDao.selectPage(page,null);
    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());
}

条件查询

单条件查询

@Test
void testSelect() {
    // 方式一 普通条件查询
    QueryWrapper<User> qw = new QueryWrapper<>();
    // lt表示小于 查询age字段小于18岁的
    qw.lt("age",18);
    List<User> list = userDao.selectList(qw);
    System.out.println(list);

    // 方式二 lambda格式按条件查询
    QueryWrapper<User> qw1 = new QueryWrapper<>();
    // lt表示小于 查询age字段小于18岁的
    qw1.lambda().lt(User::getAge,18);
    List<User> list1 = userDao.selectList(qw1);
    System.out.println(list1);

    // 推荐使用方式三
    // 方式三 lambda格式按条件查询
    LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
    // lt表示小于 查询age字段小于18岁的
    lqw.lt(User::getAge,18);
    List<User> list2 = userDao.selectList(lqw);
    System.out.println(list2);
}
// lt表示小于 gt表示大于 le小于等于 ge大于等于 eq等于 between在xx之间 like模糊查询 likeLeft%在左边 likeRight%在右边

多条件查询

@Test
void testSelect() {
    // lambda格式按条件查询
    LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
    // 采用链式编程思想 表示查询年龄大于10并且小于30的
    lqw.lt(User::getAge,30).gt(User::getAge,10);
    List<User> list2 = userDao.selectList(lqw);
    System.out.println(list2);
    
    // lambda格式按条件查询
    LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
    // 采用链式编程思想 表示查询年龄大于10或者小于30的
    lqw.lt(User::getAge,30).or().gt(User::getAge,10);
    List<User> list2 = userDao.selectList(lqw);
    System.out.println(list2);
}

null问题

@Test
void testSelect() {
    User user = new User();
    // lambda格式按条件查询
    LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
    // 先判定第一个参数是否为true,如果是则连接当前条件
    lqw.lt(null != user.getAge() ,User::getAge,user.getAge());
    List<User> list2 = userDao.selectList(lqw);
    System.out.println(list2);
}

查询投影

@Test
void testSelect() {
    LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
    // 设置只查询年龄和姓名
    lqw.select(User::getAge,User::getName);
    List<User> list = userDao.selectList(lqw);
    System.out.println(list);
}

字段映射与表名映射

package com.ctg.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

//打上这个注解set和get以及toString方法自动生成
@Data
// 表示这个类与数据库中的user表映射
@TableName("user")
public class User {
    private String name;

    // value表示此属性与数据库中的passcode字段映射起来
    // select=false表示此属性不参与查询
    @TableField(value = "passcode", select = false)
    private String passcode;

    private int age;
    private String tel;

    // 表示数据库表中没有此字段
    @TableField(exist = false)
    private String online;

}

Id生成策略

自增

@TableId(type = IdType.AUTO)
private Long id;

不设置id生成策略

@TableId(type = IdType.NONE)
private Long id;

用户手动输入id

@TableId(type = IdType.INPUT)
private Long id;

雪花算法

@TableId(type = IdType.ASSIGN_ID)
private Long id;

UUID

@TableId(type = IdType.ASSIGN_UUID)
private Long id;

全局配置

每个类都要写的话太麻烦,进行全局设置

# 开启mp的日志(输出到控制台)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 关闭MP的banner
  global-config:
    banner: false
    # 设置全局ID生成策略
    db-config:
      id-type: auto

代码生成器

所需依赖

 <dependencies>
        <!-- Web核心启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
<!--            <version>5.1.47</version>-->
        </dependency>
        <!-- MyBatis Plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- 以下是代码生成器的jar依赖 -->
        <!-- 代码生成器核心jar依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- 使用默认的velocity模板 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>
        <!-- sfl4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
    </dependencies>

工具类源代码

package com.fithub.utils;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * 1. @ClassDescription: 代码生成器
 * 2. @author: TenSoFlow
 * 3. @date: 2024年04月21日 16:31
 */
public class GeneratorCode
{

    // 作者名称(可改)
    private static String author = "tensoflow";

    // 生成的位置(一般是必须要改,除非路径和我的一样)
    private static String outputDir = "D:\\Desktop\\fithub\\src\\main\\java";

    // 驱动,注意版本(MySQL8是com.mysql.cj.jdbc.Driver MySQL5是com.mysql.jdbc.Driver)
    private static String driver = "com.mysql.cj.jdbc.Driver";

    // 连接路径,注意修改数据库名称(一般是必须要改,除非数据库名称是fithub)
    private static String url = "jdbc:mysql://localhost:3306/fithub?serverTimezone=GMT&useUnicode=true&characterEncoding=utf-8";

    // 数据库用户名(根据需要改)
    private static String username = "root";

    // 数据库密码(根据需要改)
    private static String password = "123456";

    // 数据库表的前缀,如t_user(没有前缀就为"")
    private static String tablePrefix = "";

    // 生成的表(比较麻烦,需要把生成的表名一个一个添加到数组中去)
    private static String[] tables = {"admin", "coach", "collect", "course", "equipment", "message","sign","user","vip"};

    // 顶级包结构(不是必改项,根据自己的喜好改)
    private static String parentPackage = "com.tensoflow";

    // 数据访问层包名称(一般不需要改都是mapper名)
    private static String dao = "mapper";

    // 业务逻辑层包名称(一般不需要改都是service名)
    private static String service = "service";

    // 实体层包名称(可根据喜好改 如domain)
    private static String entity = "entity";

    // 控制器层包名称(一般不需要改都是controller名)
    private static String controller = "controller";

    // mapper映射文件包名称(一般不需要改都是mapper名)
    private static String mapperxml = "mapper";

    public static void main(String[] args) {
        //1.全局配置
        GlobalConfig config = new GlobalConfig();
        config.setAuthor(author) // 作者
                .setOutputDir(outputDir) // 生成路径
                .setFileOverride(true) // 文件覆盖
                .setIdType(IdType.AUTO) // 主键策略
                .setServiceName("%sService") // 设置生成的service接口的名字的首字母是否为I,加%s则不生成I
                .setBaseResultMap(true) // 映射文件中是否生成ResultMap配置
                .setBaseColumnList(true); // 生成通用sql字段
        //2.数据源配置
        DataSourceConfig dsConfig = new DataSourceConfig();
        dsConfig.setDbType(DbType.MYSQL) // 设置数据库类型
                .setDriverName(driver) // 设置驱动
                .setUrl(url) // 设置连接路径
                .setUsername(username) // 设置用户名
                .setPassword(password); // 设置密码
        //3.策略配置
        StrategyConfig stConfig = new StrategyConfig();
        stConfig.setCapitalMode(true) // 全局大写命名
                .setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                .setTablePrefix(tablePrefix) // 表前缀
                .setInclude(tables) // 生成的表
                .setEntityLombokModel(true); // 支持Lombok
        //4.包名策略配置
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent(parentPackage) // 顶级包结构
                .setMapper(dao) // 数据访问层
                .setService(service) // 业务逻辑层
                .setController(controller) // 控制器
                .setEntity(entity) // 实体类
                .setXml(mapperxml); // mapper映射文件
        //5.整合配置
        AutoGenerator ag = new AutoGenerator();
        ag.setGlobalConfig(config)
                .setDataSource(dsConfig)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig);
        //6.执行
        ag.execute();
    }

}
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8