mybatis plus学习笔记

1、配置application.yml

server:
  port: 9090

#设置数据库
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3309/xiaobai?serverTimezone=GMT%2b8
    username: root
    password: admin123

mybatis:
  mapper-locations: classpath:mapper/*.xml  #让系统扫描所有mybatis的xml文件

#Mybatis打印运行日志
configuration:
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

#mybatisplus打印运行日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  #设置全局实体类的id策略
  global-config:
     db-config:
       id-type: auto
       #给实体类统一加前缀来对应数据库表名
       table-prefix: tbl_
       #逻辑删除策略
       #控制逻辑删除的字段名叫deleted
       logic-delete-field: deleted
       # 设定:"1" 表示已经删除
       logic-delete-value: 1
       # 设定:"0" 表示未删除
       logic-not-delete-value: 0

2、各种注解

@Data

加在实体类之前,加上这个注解后会自动给实体类提供相应getter setter方法

@TableId(value = " ", type = IdType.AUTO)

描述:主键注解,作用,加在主键字段之前表示这是主键,

value中填数据库中对应的字段名称(如果数据库中字段名和实体类中相同则value可以省略不写)

type设定id策略,常用的就是AUTO:数据库 ID 自增

@TableField(" ")

用在实体类中,当实体类中字段名和数据库不匹配时,用来让他们一一对应

如下图,这样数据库的"pwd"和实体类中的password就对应起来了

@TableField(exist = false)

数据库中没有对应字段时,加上这个注释即可

@TableName(" ")

在设计表和实体类时,有可能名字不对应,需要用这个注解让他们联系起来

@TableLogic

描述:表字段逻辑处理注解(逻辑删除),加在某一个字段之前,表示这是逻辑删除字段

3、分页查询功能实现

3.1 写分页拦截器

entity同级创建config文件夹,此文件夹下创建MybatisPlusConfig.java配置文件

@Configuration    
@MapperScan("scan.your.mapper.package")  
public class MybatisPlusConfig {  
  @Bean  
  public MybatisPlusInterceptor mybatisPlusInterceptor() {  
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();  
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));  
    return interceptor;  
  }  
}  

3.2 调用

然后直接用IPage创建对象查询即可

Ipage<T> selectPage(Ipage<T> page)

mybatis-plus的日志在application.yml中配置

4、条件查询

方式一

查询条件有多种

eq:“=”; ne:“≠”; gt:“>”; ge:“>=”;

lt:”<“; le:”<=“; like:”%值%“即模糊查询 等等

QueryWrapper queryWrapper = new QueryWrapper<>();
 queryWrapper.like("username", username);//括号中前一个为传入的数据中需要比较的字段名,后一个为用来比较的数据
 List<User> userList = userService.selectList(queryWrapper);

方式二(lambda方式)

 QueryWrapper<User> queryWrapper = new QueryWrapper<User>();//用lambda方法需要写清楚泛型名
 queryWrapper.lambda().like(User::username, username);//这里传入方法不一样,由于没有双引号,更容易发现拼写错误
 List<User> userList = userService.selectList(queryWrapper);

方式三(常用)

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
lambdaQueryWrapper.like(User::getUsername, username);
List<User> userList = userService.selectList(lambdaQueryWrapper);

5、多条件查询

5.1 条件之间 &&

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();

//这两个条件表示查询年龄≥10且≤30的user
lambdaQueryWrapper.le(User::getAge, 30);
lambdaQueryWrapper.ge(User::getAge, 10);

//替换一下,链式也是可以的,效果相同
lambdaQueryWrapper.le(User::getAge, 30).lambdaQueryWrapper.ge(User::getAge, 10);

List<User> userList = userService.selectList(lambdaQueryWrapper);

5.2 条件之间 ||

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//这儿查询的是年龄≥30或者≤10的user
lambdaQueryWrapper.le(User::getAge, 10).or().lambdaQueryWrapper.ge(User::getAge, 30);
List<User> userList = userService.selectList(lambdaQueryWrapper);

5.3 null值处理

方法一

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//这里的age1和age2仅作为模拟前端传入的用于判断的参数

//age1不为空时才做笔记哎
if(age1 != null){
    lambdaQueryWrapper.le(User::getAge, age1);
}
//age2不为空时才做比较
if(age1 != null){
    querylambdaQueryWrapperWrapper.ge(User::getHeight, age2);
}

List<User> userList = userService.selectList(lambdaQueryWrapper);

方法二(作用同方法一)

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
lambdaQueryWrapper.le(age1 != null, User::getAge, age1)
                  .ge(age2 != null, User::getHeight, age2);
List<User> userList = userService.selectList(lambdaQueryWrapper);

6、查询投影

6.1 查询部分字段

方法一(lambda)

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//这里只取出了id和age,就只会打印id和age
lambdaQueryWrapper.select(User::getId, User::getAge);
List<User> userList = userService.selectList(lambdaQueryWrapper);

方法二(作用同方法一)

QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//这里只取出了id和age,就只会打印id和age
queryWrapper.select("id", "age");
List<User> userList = userService.selectList(queryWrapper);

方法三(查询结果包含模型类中未定义的属性)

QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//查询总数据条数
queryWrapper.select("count(*) as count");
List<Map<String, Object>> userList = userService.selectMaps(queryWrapper);

6.2 分组查询

QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
//按性别分组,这里会显示每个性别对应的数据条数
queryWrapper.select("count(*) as count, sex");
queryWrapper.groupBy("sex"),
List<Map<String, Object>> userList = userService.selectMaps(queryWrapper);

7、常用查询条件

相等(一般用于用户登录)

        注意:用户登陆时要采用MD5加密

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
//只有在username=张三且密码=123456时,才会查询出这条数据
lambdaQueryWrapper.eq(User::getName, "张三").eq(User::getPassword, "123456");
User loginUser = userService.selectOne(lambdaQueryWrapper);

8、字段映射和表名映射

表名和实体类名不对应

方法一:加注解

使用TableName(" ")注解

方法二:全局配置(application.yml)

这里的意思是给所有的实体类加上前缀“tbl_”,后在去跟数据库表名一一对应

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_

数据库字段名和实体类字段名不一致

添加@TableField(value = "")注解

让某一字段不参与查询

在@TableField注解中添加select = false,这里的password就不会被查询出来

9、Id生成策略

方法一:添加注解

@TableId(type = IdType.AUTO)

使用数据库制定的策略

@TableId(type = IdType.INPUT)

自己在后端手动输入id传给数据库

@TableId(type = IdType.ASSIGN_ID)

雪花算法生成id(兼容数值型和字符串型)

方法二:全局配置(application.yml)

在application.yml中写

10、逻辑删除

方法一:加注解

1、数据库中添加delete字段

默认值:0

2、实体类中添加逻辑删除字段

方法二:全局配置

1、修改数据库(同上)

2、添加全局配置(application.yml)

11、乐观锁

1、数据库添加version字段

2、实体类中添加字段

3、添加乐观锁拦截器(MybatisPlusConfig.java)

//        添加乐观锁拦截器
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

12、代码生成器

添加依赖

<!--        代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
<!--        velocity模板引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

创建类CodeGenerator.java

package com.example.test.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import java.util.Collections;

public class CodeGenerator {
    public static void main(String[] args) {
        generate();
    }

    private static void generate() {
        //        数据库相关配置
        FastAutoGenerator.create("jdbc:mysql://localhost:3309/xiaobai?serverTimezone=GMT%2b8", "root", "admin123")
                //全局配置
                .globalConfig(builder -> {
                    builder.author("良辰") // 设置作者
                            .disableOpenDir() //禁止打开输出目录
//                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("G:\\UserDesktop\\桌面\\小白前后端\\test-core\\src\\main\\java"); // 指定输出目录
                })
                //包配置
                .packageConfig(builder -> {
                    builder.parent("com.example.test") // 设置父包名    	默认值:com.baomidou
                            .moduleName(null) // 设置父包模块名,没有就写null
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "G:\\UserDesktop\\桌面\\小白前后端\\test-core\\src\\main\\resources\\mapper\\")); // 设置mapperXml生成路径
                })
                //策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("sys_user") //增加表匹配  写什么表名,就生成哪个表的实体类,写多个表就生成多个表
                            .addTablePrefix("sys_"); //过滤表前缀,相当于生成类时自动去掉表名的sys_前缀,其他前缀同理,修改成需要删除的前缀即可
                    builder.entityBuilder() //实体类策略配置
                            .versionPropertyName("version") //乐观锁属性名(实体)
                            .logicDeletePropertyName("deleted") //逻辑删除属性名(实体)
                            .enableLombok() //开启 lombok 模型
                            .enableTableFieldAnnotation(); //给所有字段加上说明注解
                    builder.controllerBuilder() //controller 策略配置
                            .formatFileName("%sController") //设置controller名字,%s代表实体类名 (貌似不需要设置,有特殊情况可以用)
                            .enableHyphenStyle()  // 开启驼峰转连字符
                            .enableRestStyle();  // 开启生成@RestController 控制器
                })
                .execute();
    }
}

运行即可生成entity,controller,mapper,service层文件

更多相关配置设置:mybatis plus代码生成器配置

小技巧

去掉运行程序产生的日志

resource中新建logback.xml文件,内容如下

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

</configuration>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值