Это 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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。