MybatisPlus学习

尽量不要同时导入mybatis和mybatis-plus。添加mybatis-plus之后,mapper的xml文件也可以写动态sql,实现较复杂的查询。

主键生成策略

分布式系统唯一id生成:

public enum IdType {
    AUTO(0),//数据库id自增
    NONE(1),//未设置主键
    INPUT(2),//手动输入
    ID_WORKER(3),//默认的全局唯一id
    UUID(4),//全局唯一id
    ID_WORKER_STR(5);//ID_WORKER 字符串表示法

    private final int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}

乐观锁

乐观锁:它总是认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再去更新值测试。

悲观锁:它总是认为总是出现问题,无论干什么都会上锁!再去操作!

乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时,set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败
乐观锁:先查询,获得版本号 version=1
--A
update user set name = "ming", version = version + 1
where id = 2 and version = 1

--B 线程抢先完成,这个时候version = 2 ,会导致A修改失败
update user set name = "ming", version = version + 1
where id = 2 and version = 1

逻辑删除

  1. 在数据表中增加一个deleted字段

  2. 实体类中增加属性

  3. 在application.yml中配置

    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      global-config:
        db-config:
          logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
          logic-delete-value: 1
          logic-not-delete-value: 0
      mapper-locations: classpath:mymapper/*.xml
    

测试

进行map删除

//通过map删除
@Test
public void testDeleteMap() {
    HashMap<String, Object> map = new HashMap<>();
    map.put("name", "小明");
    userMapper.deleteByMap(map);
}

原本的物理删除都会变成逻辑删除

在这里插入图片描述

条件构造器

用来替代复杂的sql

模糊查询

@Test
void test3() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.notLike("name", "e")
            .like("email", "t");
    List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
    maps.forEach(System.out::println);
}

在这里插入图片描述

子查询

@Test
void test4() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.inSql("id", "select id from user where id<3");
    List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
    maps.forEach(System.out::println);
}

在这里插入图片描述

降序查询

@Test
void test5() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.orderByDesc("id");
    List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
    maps.forEach(System.out::println);
}

在这里插入图片描述

代码生成器

  1. 添加依赖
         <!--代码生成器默认的模板引擎依赖-->        
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>
        <!--代码生成器依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>
  1. 编写代码生成器代码
package com.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.AbstractList;
import java.util.ArrayList;

public class AutoCode {

    public static void main(String[] args) {
       AutoGenerator mpg = new AutoGenerator();

        //配置策略

        //1.全局配置
        GlobalConfig gc = new GlobalConfig();
        String project = System.getProperty("user.dir");//当前项目路径
        gc.setOutputDir(project + "/src/main/java");
        gc.setAuthor("Evan");
        gc.setOpen(false);
        gc.setFileOverride(false); //是否覆盖
        //gc.setServiceName("%sService"); //去掉Service的I前缀
        gc.setIdType(IdType.ID_WORKER);
        gc.setDateType(DateType.ONLY_DATE);
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);

        //2.设置数据源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatisplus?userUnicode=true&characterEncoding=utf-8&serverTimezone=UTC")
                .setDriverName("com.mysql.cj.jdbc.Driver")
                .setUsername("root")
                .setPassword("123456")
                .setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);


        //3.包的配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("blog")
                .setParent("com.evan")
                .setEntity("entity")
                .setMapper("mapper")
                .setService("service")
                .setController("controller");

        mpg.setPackageInfo(pc);

        //4.策略配置
        StrategyConfig strategy = new StrategyConfig();
        //可以设置多个表
        //strategy.setInclude("user", "course", "links");
        strategy.setInclude("user");//设置要映射的表名
        //下划线转驼峰命名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);

        strategy.setEntityLombokModel(true);//自动生成Lombok
        strategy.setLogicDeleteFieldName("deleted");

        //自动填充配置
        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
        TableFill gmtModify = new TableFill("gmt_modify", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreate);
        tableFills.add(gmtModify);
        strategy.setTableFillList(tableFills);

        //乐观锁配置
        strategy.setVersionFieldName("version");
        strategy.setRestControllerStyle(true);
        strategy.setControllerMappingHyphenStyle(true); // localhost:8080/hello_id_2
        mpg.setStrategy(strategy);

       mpg.execute();//执行代码构造器
    }
}
tVersionFieldName("version");
        strategy.setRestControllerStyle(true);
        strategy.setControllerMappingHyphenStyle(true); // localhost:8080/hello_id_2
        mpg.setStrategy(strategy);

       mpg.execute();//执行代码构造器
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值