最近在实际开发中使用了MybatisPlus,初次使用发现对于单表CURD的是真的好用,少些很多sql。不过逻辑复杂的sql还是自己写的。在这里做简单总结。
1. 依赖:
这里就没有什么好说的了我们使用一个功能,首先肯定要引用依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
</dependency>
2. 项目基础分层:
按照常规,分为controller、service、mapper、entity。
(1) controller层:和普通的spring项目没有区别
(2) service层:
service接口继承 IService<T> 接口
public interface GlsServiceUnitService extends IService<GlsServiceUnit> {
List<GlsServiceUnit> queryList(GlsServiceUnit glsServiceUnit);
}
serviceImpl继承ServiceImpl<M extends BaseMapper<T>, T>类
@Service
public class GlsServiceUnitServiceImpl extends ServiceImpl<GlsServiceUnitMapper, GlsServiceUnit> implements GlsServiceUnitService {
}
(3) mapper层:
mapper层继承BaseMapper<T>接口
@Mapper
public interface GlsServiceUnitMapper extends BaseMapper<GlsServiceUnit> {
}
(4) entity层:
entity层继承Model<T>类
@Data
@TableName("***")
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "***")
public class GlsServiceUnit extends Model<GlsServiceUnit> {
private static final long serialVersionUID = 1L;
@TableId
@ApiModelProperty(value = "ID")
private Integer id;
@TableField(value = "INSERTTIME", fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "插入时间")
private LocalDateTime insertTime;
@TableField(exist = false)
@ApiModelProperty(value = "IDList")
private List<String> idList;
}
3. 注解说明:
@TableName:类注解,实体类的表名
@TableField:字段注解,详情见下表
注解可选值 | 注解说明 |
value | 字段名称(可以不填,默认根据属性的驼峰转换为下划线对应上数据库字段,比如这里的insertTime默认对应数据库字段为insert_time,而实际我的数据库字段是INSERTTIME,所以这里指定为INSERTTIME) |
update | 预处理 ,将字段set注入自定义内容。 例如: @TableField(.. , update="%s+1") %s 为字段 @TableField(.. , update="now()") SQL :update 表 set 字段=now() where ... |
condition | 预处理 WHERE 条件 例如: @TableField(condition = SqlCondition.LIKE) private String name; SQL 为:select 表 where 字段LIKE CONCAT('%',值,'%') |
el | 详看注释说明 |
exist | 是否为数据库表字段( 默认 true 存在,false 不存在 ),比如这里的idList配置为false,就被当成一个普通的类属性而非数据库中的字段 |
strategy | 字段验证 ( 默认 非 null 判断) |
fill | 字段填充标记 ( FieldFill, 配合自动填充使用 ) DEFAULT:默认不处理 INSERT:插入时处理 UPDATE:修改时处理 INSERT_UPDATE:插入和修改时处理 |
4. 自动填充:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler{
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("insertTime", LocalDateTime.now(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
}
}
这里用了FieldFill,自定义一个MyMetaObjectHandler组件继承MetaObjectHandler并重写了insertFill方法,实现insertTime字段自动填充插入时间。踩坑,这里setFieldValByName方法里面填写的类里面的属性,本人在刚写的时候填了字段的值,估计这里底层又是使用反射实现的。
5. 查询:
public List<GlsServiceUnit> queryList(GlsServiceUnit glsServiceUnit) {
QueryWrapper<GlsServiceUnit> queryWrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(glsServiceUnit.getAreaId())) {
queryWrapper.lambda().eq(GlsServiceUnit::getAreaId, glsServiceUnit.getAreaId());
}
if (glsServiceUnit.getServiceMode() != null) {
queryWrapper.lambda().eq(GlsServiceUnit::getServiceMode, glsServiceUnit.getServiceMode());
}
List<GlsServiceUnit> glsServiceUnits = list(queryWrapper);
return glsServiceUnits;
}
查询QueryWrapper也是比较好用的,这里提供一个简单的案例
6. 查看sql日志配置:
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在yml文件加上改配置,就可以看到sql和执行结果了,查询语句会直接打印出查询到的数据,还是比较详细的。