Причудливое использование MybatisPlus на основе SpringBoot

Spring Boot Java
Причудливое использование MybatisPlus на основе SpringBoot

Это 9-й день моего участия в ноябрьском испытании обновлений, подробности о событии:Вызов последнего обновления 2021 г.

предисловие

Mybatis похож на автомобиль, но благословенныйMybatisPlusЭто определенно суперкар с добавлением азота.

без использованияMybatisPlusРаньше при запросе одной таблицы вы должны были либо молча писать код SQL, либо использовать генератор кода для генерации базового кода.Если параметры имеют несколько методов сопоставления, вы должны либо скопировать копию и переписать, либо добавить условие if. довольно неудобно.

Но когда-то использовалMybatisPlusЭто казалось еще другим миром.

Проект интеграции MybatisPlus см.Интеграция MybatisPlus на основе SpringBoot

Предварительная базовая информация

SQL

CREATE TABLE `student` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `info` varchar(255)  COMMENT 'zouzdc',
  `del_flag` tinyint(1) DEFAULT '0',
 `create_time` datetime,
 `create_by` varchar(255),
 `update_time` datetime ,
 `update_by` varchar(255),
 PRIMARY KEY (`id`)
) ;

Bean

@Data
@NoArgsConstructor
public class Student {
    
    /**
     * id
     */
    @TableId
    private Long id;

    /**
     * 其他信息
     */
    private String info;
    
    /**
     * 是否伪删除  0否 1是
     */
    @TableLogic
    private String delFlag;
    
    /**
     * 创建日期
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 创建人
     */
    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 更新日期
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 更新人
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
}

Расширенная конфигурация MyBatisPlus — автозаполнение полей

Как обычно,createTimeа такжеcreateByа такжеdel_flagТакая информация, как арендаторы и арендаторы, должна быть назначена при вводе и вставке, иupdateTimeа такжеupdateByПри изменении данных их нужно переназначить.Для фиксированных полей этого режима можно использоватьMyBatisPlusФункция автозаполнения полей, пусть программа автоматически поможет нам это сделать.

Расположение, которое необходимо изменить, добавить класс конфигурации и добавить аннотации к полям, требуемым в bean-компоненте.

Аннотировать поля, которые необходимо заполнить@TableField(

Пример, как показано вышеStudent

@TableField(fill = FieldFill.INSERT)Это поле будет автоматически заполнено при добавлении, если поле имеет значение, оно не будет перезаписано

@TableField(fill = FieldFill.INSERT_UPDATE)Это поле будет автоматически заполняться как новым, так и обновленным, если поле имеет значение, оно будет перезаписано

@TableField(fill = FieldFill.UPDATE)Это поле будет автоматически заполнено при обновлении, и если поле имеет значение, оно будет перезаписано.

Класс конфигурации автозаполнения поля

В классе конфигурации настройте правила заполнения для каждого поля, которое необходимо автоматически заполнять данными

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {

        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "createBy", String.class,  getUserBy());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateBy", String.class,  getUserBy());
        // 另一种方式 通用填充功能
        //this.setFieldValByName("createTime",new Date(),metaObject);

    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateBy", String.class,  getUserBy());
    }

    private String getUserBy(){
        //获取当前操作人的方法,根据自己业务操作
        return "admin";
    }
}

Надгробие данных

Большая часть бизнес-системы не будет действительно удалена, поэтому вам нужно использовать поле, чтобы определить, следует ли ее удалять.MybatisPlusМетод, который идет с ним и определено поле удаления, будет псевдоудален, иначе он будет удален.Для sql, написанного самостоятельно, вам нужно справиться с этим самостоятельно.

Здесь del_flag используется для определения, следует ли удалять псевдоудаление, 0 не удаляется, 1 удаляется

application.yml

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: delFlag  # 全局逻辑删除的实体字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

В классе бобов

/**
 * 是否伪删除  0否 1是
 */
@TableLogic
private String delFlag;

Официальный сайт сообщил, что начиная с 3.3.0, вapplication.ymlПосле настройки глобального компонента в Bean-компоненте вы больше не можете настраивать поля в Bean-компоненте.@TableLogic

Добавление, удаление, изменение и использование одной таблицы

Уровень контроллера использует добавления, удаления и изменения для проверки

@RestController
@RequestMapping("/student")
public class StudentController {

    @Autowired(required = false)
    public StudentService studentService;

    @GetMapping("getById")
    public R getStudentById( Student student){
        //增
        studentService.save(student);
        //改
        studentService.updateById(student);
        //查
        Student student = studentService.getById(student.getId());
        //删
        studentService.removeById(student.getId());
       //列表 带参数查询
        List<Student> zouzdc = studentService.lambdaQuery().eq(Student::getInfo, "zouzdc").list();
        return R.success();
    }
}

Сервисный уровень использует добавления, удаления и изменения для проверки

CRUD

@Service
@Slf4j
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {

    @Autowired(required = false)
    private StudentMapper studentMapper;


    @Override
    public void savePlus(Student student) {
         //增
        studentMapper.insert(student);
         //改
        studentMapper.updateById(student);
          //查
        baseMapper.selectById(student.getId());
          //删
        baseMapper.deleteById(student.getId());
         //列表 带参数查询
        List<Student> list = this.lambdaQuery().eq(Student::getId, student.getId()).list();
    }
}

ServiceСуществует объект Mapper по умолчанию вbaseMapper, что эквивалентно здесьstudentMapper

Пример условного запроса для одной таблицы

лямбда-синтаксис

Запросinfoравныйzouzdcсписок

 List<Student> zouzdc = studentService.lambdaQuery().eq(Student::getInfo, "zouzdc").list();

Запросinfoравныйzouzdcобъект

Student zouzdc = studentService.lambdaQuery().eq(Student::getInfo, "zouzdc").one();
Student zouzdc = studentService.lambdaQuery().eq(Student::getInfo, "zouzdc").last(" limit 1").one();

Для неуникальных данных используйте one() напрямую, может быть ошибка неуникальных данных, вы можете использоватьlast()Параметры сплайсинга для получения первых данных

возобновитьid=1изinfoполе

 studentService.lambdaUpdate().set(Student::getInfo,"zdc").eq(Student::getId,1).update();

удалятьinfoэто данные zouzdc

studentService.lambdaUpdate().set(Student::getInfo,"zouzdc").remove()

Дополнительные условные конструкции см.официальная документация

вариант синтаксиса устарел
 List<Student> zouzdc1 = studentService.list(new QueryWrapper<Student>().lambda().eq(Student::getInfo, "zouzdc"));
 Student zouzdc2 = studentService.getOne(new LambdaQueryWrapper<Student>().eq(Student::getInfo, "zouzdc"));

Пейджинговый запрос

Класс конфигурации пейджинга

@Configuration
@MapperScan("zdc.enterprise.mapper.*")
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置最大单页限制数量,,-1 不受限制
        paginationInterceptor.setLimit(1000);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

разбиение на страницы в лямбда-режиме


public  IPage<StudentDto> listPage(StudentDto vo){

return this.lambdaQuery()
        .eq(vo.getInfo() != null, Student::getInfo, vo.getInfo())
        .eq(Student::getDelFlag, "0")
        .page(new Page(vo.getCurrent(), vo.getSize()));
}

Разбиение на страницы в смешанном режиме

Сервисный уровень

 public  Page<StudentDto> listPage(StudentDto vo){
 
        Page<Student> page = new Page(vo.getCurrent(), vo.getSize());
        page.addOrder(OrderItem.desc("a.create_time"));

        QueryWrapper<Student> wrapper = new QueryWrapper();
        wrapper.apply(" a.del_flag =0 ");
          wrapper.eq("a.info","zouzdc")
                .le("a.id",10);
        return baseMapper.listPage(page, wrapper);
    }

Картографический слой

Page<StudentDto> listPage(@Param("page") Page<Student> page, @Param("ew") QueryWrapper<Student> wrapper);

@Param("ew")исправлено по умолчанию

XML-уровень

<select id="listPage" resultType="zdc.enterprise.dto.StudentDto">
    select * from student a
    ${ew.customSqlSegment}

</select>

Это написание находится вserviceСлой записывает условие where в виде sql, а затем проходит${ew.customSqlSegment}Сращен с обратной стороны sql в xml.Свой куда принесет

Есть много других способов написать это... проведите собственное исследование

作者:ZOUZDC
链接:https://juejin.cn/post/7028963866063306760
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。