一、Mybatis plus使用流程

1、导入依赖

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

2、配置

3、编写测试代码

po层实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer id;
    private String name;
    private Integer age;
    private String email;
}

mapper(继承BaseMapper即可)

@Repository
public interface UserMapper extends BaseMapper<User> {
}

编写测试代码

@GetMapping("user")
    public String test(){
        List<User> user = userMapper.selectList(null);
        System.out.println("user---"+user);
        return "ok";
    }

二、日志输出配置

#  mybatis-plus的日志输出
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

三、Mybatis-Plus代码生成器配置操作

1、依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.0.7.1</version>
</dependency>
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity-engine-core</artifactId>
        <version>2.0</version>
    </dependency>

2、编写配置文件

//代码生成
public class Codegenerator {

    public static void main(String[] args) {
        //构建代码生成对象
        AutoGenerator mpg = new AutoGenerator();
        //配置策略

        //1、全局配置
        GlobalConfig gc = new GlobalConfig();

        String path = System.getProperty("user.dir");//输出目录
        gc.setOutputDir(path+"/src/main/java");
        gc.setAuthor("mp");
        gc.setOpen(false);
        gc.setFileOverride(false);//是否覆盖原文件
        gc.setServiceName("%sService");// 去I前缀
        gc.setIdType(IdType.NONE);
        gc.setDateType(DateType.ONLY_DATE);
        gc.setSwagger2(true);
        gc.setServiceName("%sService");

        mpg.setGlobalConfig(gc);//放入全局配置

        //2、设置数据源
        DataSourceConfig dc = new DataSourceConfig();
        dc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
        dc.setUsername("root");
        dc.setPassword("123456");
        dc.setDriverName("com.mysql.cj.jdbc.Driver");
        dc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dc);

        //3、包配置(生成文件地址)
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName("model");
        pc.setParent("com.above.test");
        pc.setEntity("po");
        pc.setMapper("dao");
        pc.setService("service");
        pc.setController("controller");
        pc.setServiceImpl("service.impl");
        pc.setXml("mapper");
        mpg.setPackageInfo(pc);

        //4、策略配置
        StrategyConfig sc = new StrategyConfig();
        sc.setInclude("user");//设置映射的表名
        sc.setNaming(NamingStrategy.underline_to_camel);//表面转驼峰
        sc.setColumnNaming(NamingStrategy.underline_to_camel);//字段名转驼峰
        sc.setEntityLombokModel(true);//lombok注释
        sc.setRestControllerStyle(true);//生成@RestController注解
        sc.setEntityTableFieldAnnotationEnable(true);//生成字段注解


        //自动填充
        TableFill creatTime = new TableFill("creat_time", FieldFill.INSERT);
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT);
        ArrayList<TableFill> tableFiles = new ArrayList<>();
        tableFiles.add(creatTime);
        tableFiles.add(updateTime);
        sc.setTableFillList(tableFiles);
        sc.setVersionFieldName("version");//乐观锁
        sc.setRestControllerStyle(true);
//        sc.setControllerMappingHyphenStyle(true);//localhost:8080/hello_id_2 url转下划线

        mpg.setStrategy(sc);



        mpg.execute();//执行
    }

}

3、直接运行main方法即可

四、自动填充配置

1、字段注释

可在生成器中配置自动生成

image-20210926111348474

在策略配置中添加

生成后的效果:image-20210926111437079

字段中有注释即可!

2、配置处理器

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    //插入填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        //default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
        this.setFieldValByName("creatTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);

    }
    //更新填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

五、乐观锁

1、配置插件

@EnableTransactionManagement//自动管理事务
@Configuration//配置类
public class MPVersionConfig {
    //注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

2、新增字段

​ 新增version字段

3、使用@Version注解

image-20210926114224832

六、分页

1、原始limit

2、mp内置分页插件、

image-20210926141527025

配置插件

3、使用page

image-20210926141621787

七、逻辑删除

1、配置插件

image-20210926141710331

2、在实体类中使用注解

@TableLogic

3、在yaml中配置

image-20210926141815602

配置删除和未删除的字段状态

八、条件构造器Wrapper

1、查询

//    普通查询
    @Test
    void test1(){
        //查询email不为空,name不为空的,年龄大于
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.isNotNull("email")
                .isNotNull("name")
                .ge("age",20);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }
//查询单条数据
    @Test
    void test2(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name","Sandy");
        User user = userMapper.selectOne(wrapper);
        System.out.println(user);
    }
//范围查询
    @Test
    void test3(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("age",20,30);
        Integer integer = userMapper.selectCount(wrapper);
        System.out.println(integer);
    }
//模糊查询
@Test
void test4(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.notLike("name","b").likeLeft("email","m");
    List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
    maps.forEach(System.out::println);
}
//内嵌sql
    @Test
    void test5(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.inSql("id","select id from user where id<3");
        List<Object> objects = userMapper.selectObjs(wrapper);
        objects.forEach(System.out::println);
    }
//    排序
    @Test
    void test6(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("id");//Desc降序 AESC升序
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }