Mybatis-plus

特性

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

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

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

  • 支持主键自动生成

  • 内置分页插件

查询条件:https://mybatis.plus/guide/wrapper.html#abstractwrapper

CUID

  • pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.7.1</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>mybatisplus-quickStart</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
      <java.version>1.8</java.version>
  </properties>
  <dependencies>
      <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.12</version>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
      </dependency>

      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <scope>runtime</scope>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <scope>provided</scope>
      </dependency>
      <!--代码生成器-->
      <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.3</version>
      </dependency>
  </dependencies>

  <build>
      <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
      </plugins>
  </build>

</project>
  • application.yml &

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
 #关闭springBoot logo
main:
  banner-mode: off

mybatis-plus:
configuration:
   #打印log信息
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 #关闭mybatis logo
global-config:
  banner: false
  db-config:
     #主键生成策略
    id-type: assign_id
     #table表映射
    table-prefix: td_
     #设置逻辑删除
    logic-delete-field: deleted
    logic-not-delete-value: 0
    logic-delete-value: 1
  • logback.xml 可以将很多日志信息不输出

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

</configuration>
  • MPConfig 配置分页和锁

package com.yang.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
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 plusInterceptor(){
       MybatisPlusInterceptor plusInterceptor = new MybatisPlusInterceptor();
       //分页
       plusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
       //乐观锁
       plusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
       return plusInterceptor;
  }
}
  • dao . UserDao 要继承 BaseMapper<User>,,@Mapper

package com.yang.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yang.domain.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserDao extends BaseMapper<User> {
}
  • domain . User

package com.yang.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

@Data
//@TableName("td_user")//和表名不一致时,映射,配置中设置了前缀
public class User {
   //配置中设置了id生成策略
//   @TableId(type=IdType.AUTO)
//   @TableId(type = IdType.ASSIGN_ID)//雪花算法生成id,可兼容字符串和数值型,64位的二进制
//   @TableId(type = IdType.INPUT)//用户自己输入
//@TableId(type = IdType.ASSIGN_UUID)//使用UUID算法生成id策略
   private Long id;
   private String name;
//   @TableField(select = false)//不参与查询
   private String password;
//   @TableField(value = "ages")和表中的字段映射
   private Integer age;
   private String tel;
   @TableField(exist = false)//不存在的字段
   private String online;
   //逻辑删除
//   @TableLogic(value = "0",delval = "1")//在配置中已经做了
   private Integer deleted;

   @Version//乐观锁,要加这个
   private Integer versions;

}
  • Test

package com.yang;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yang.dao.UserDao;
import com.yang.domain.User;
import com.yang.query.UserQuery;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@SpringBootTest
class MybatisplusQuickStartApplicationTests {
   @Autowired
   private UserDao userDao;


   @Test
   public void pageTest(){
       //分页查询,需要添加分页配置MPConfig
       IPage page = new Page(2,2);
       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());
       userDao.selectPage(page,null);
  }

   @Test
   void contextLoads() {
       //特殊情况下
       QueryWrapper qw = new QueryWrapper<>();
       qw.lt("age",20);
       List<User> userList = userDao.selectList(qw);
       System.out.println(userList);
       //常用这个
       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper();
       //小于20岁的
       lqw.lt(User::getAge,25);
       List<User> userList1 = userDao.selectList(lqw);
       System.out.println(userList1);
  }

   @Test
   public void doNull(){
       //封装条件,上限和下限
       UserQuery userQuery = new UserQuery();
       userQuery.setAge2(19);
       userQuery.setAge(25);

       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper();
       //条件查询,判断条件是否为空
       lqw.gt(null != userQuery.getAge2(),User::getAge, userQuery.getAge2() )
          .lt(null != userQuery.getAge(),User::getAge, userQuery.getAge() );
       List<User> userList = userDao.selectList(lqw);
       System.out.println(userList);


  }
   @Test
   public void doAlso(){//并且
       //多条件10<?<25
//       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper();
       //小于25岁的
//       lqw.lt(User::getAge,25);
       //大于20岁的
//       lqw.gt(User::getAge,20);
       //链式:大于19小于20
       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
       lqw.gt(User::getAge,20).lt(User::getAge,25);
       List<User> userList = userDao.selectList(lqw);
       System.out.println(userList);

  }

   @Test
   public void doPerhaps(){//或者
       //或者关系<19 or >20
       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
       lqw.lt(User::getAge,19).or().gt(User::getAge,20);
       List<User> userList = userDao.selectList(lqw);
  }
   @Test
   public void doProjection(){
       //查询投影
       //第一种
       LambdaQueryWrapper<User> lq = new LambdaQueryWrapper();
       lq.select(User::getAge,User::getName,User::getTel);
       List<User> userList = userDao.selectList(lq);
       System.out.println(userList);
       //第二种
       QueryWrapper<User> lqw = new QueryWrapper();
       lqw.select("age","name","tel");
       //聚合
       lqw.select("count(*) as count");

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

  }
   @Test
   public void doGroupBy(){
       //分组查询,聚合
       QueryWrapper<User> lqw = new QueryWrapper();
       lqw.select("count(*) as count,password");
       lqw.groupBy("password");
       //map集合
       List<Map<String, Object>> maps = userDao.selectMaps(lqw);
       System.out.println(maps);
  }
   @Test
   public void doCondition(){
       //条件查询
       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper();
       lqw.eq(User::getName,"张无忌").eq(User::getPassword,"123");
       //查询一个对象
       User userLogin = userDao.selectOne(lqw);
       System.out.println(userLogin);
  }
   @Test
   public void doBetween(){
       //范围查询
       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper();
       lqw.between(User::getAge,20,25);
       List<User> userList = userDao.selectList(lqw);
       System.out.println(userList);
  }
   @Test
   public void doLike(){
       //模糊查询
       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper();
//       lqw.like(User::getName,"冰");
       lqw.likeRight(User::getName,"冰");//冰%
//       lqw.likeLeft(User::getName,"冰");//%冰
       List<User> userList = userDao.selectList(lqw);
       System.out.println(userList);
  }

   /**
    * 开始 UID操作
    */
   @Test
   public void insert(){
       //插入数据
       User user = new User();
       user.setName("Brown");
       user.setAge(26);
       user.setPassword("222");
       user.setTel("333");
       userDao.insert(user);
  }
   @Test
   public void delete(){
       //删除多条
       List<Long> ids = new ArrayList<>();
       ids.add(1543416990979026946L);
       ids.add(1543417335125848066L);
       userDao.deleteBatchIds(ids);
       //查询多条
       List<Long> ids1 = new ArrayList<>();
       ids1.add(1L);
       ids1.add(2L);
       ids1.add(3L);
       userDao.selectBatchIds(ids1);

  }
   @Test
   public void doDelete(){
       userDao.deleteById(1543433893889941506L);
  }
   @Test
   public void update(){
       User user = new User();
       user.setName("jack");
       user.setAge(18);
       user.setPassword("123");
       user.setTel("111");
       userDao.updateById(user);
  }

   @Test
   public void updateLock(){
      //乐观锁 versions+1
       User user = userDao.selectById(3L); //versions=1
       User user1 = userDao.selectById(3L);//versions=1

       user1.setName("范冰冰888");
       userDao.updateById(user1); //versions=2

       user.setName("范冰冰688");//versions=1
       userDao.updateById(user);
  }

}

 

  • td_user 数据库

屏幕截图 2022-07-03 143352

代码生成器

  • pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.7.1</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>mybatis-plus-generate</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>mybatis-plus-generate</name>
  <description>mybatis-plus-generate</description>
  <properties>
      <java.version>1.8</java.version>
  </properties>
  <dependencies>
      <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.12</version>
      </dependency>
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <scope>provided</scope>
      </dependency>
      <!--代码生成器-->
      <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.3</version>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <scope>runtime</scope>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>
  </dependencies>

  <build>
      <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
      </plugins>
  </build>

</project>
  • Generator.java

package com.yang;

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;

public class Generator {
   public static void main(String[] args) {
       //创建代码生成器对象
       AutoGenerator autoGenerator = new AutoGenerator();
       
       //设置连接数据库信息
       DataSourceConfig datasource = new DataSourceConfig();
       datasource.setDriverName("com.mysql.cj.jdbc.Driver");
       datasource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
       datasource.setUsername("root");
       datasource.setPassword("root");
       autoGenerator.setDataSource(datasource);

       //设置全局配置
       GlobalConfig globalConfig = new GlobalConfig();
       globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");
       globalConfig.setAuthor("yangzl");
       globalConfig.setOpen(false);//设置生成代码后是否打开
       globalConfig.setFileOverride(true);//是否覆盖生成原始的代码
       globalConfig.setMapperName("%sDao");//设置数据层接口名,%s是占位符,指代模块名称
       globalConfig.setIdType(IdType.ASSIGN_ID);
       autoGenerator.setGlobalConfig(globalConfig);
       
       //包相关config
       PackageConfig packageInfo = new PackageConfig();
       packageInfo.setParent("com.yang");
       packageInfo.setEntity("domain");
       packageInfo.setMapper("dao");
       autoGenerator.setPackageInfo(packageInfo);
       
       //策略相关的配置
       StrategyConfig strategy = new StrategyConfig();
       strategy.setInclude("td_user");
       strategy.setTablePrefix("td_");
       strategy.setRestControllerStyle(true);
       strategy.setEntityLombokModel(true);
       strategy.setLogicDeleteFieldName("deleted");
       strategy.setVersionFieldName("versions");
       autoGenerator.setStrategy(strategy);
       //执行
       autoGenerator.execute();
  }
}