MyBatis-Plus 常用用法总结
本文以实体类 ChatgptSetting为例子
public class ChatgptSetting {private String setting;// 配置项名称private String value;
}
一、基本 CRUD 操作
1. 插入数据
chatgptSettingMapper.insert(chatgptSetting);
-
自动将非 null 字段插入到对应的数据库字段中
-
主键自增会自动回填(需实体类加
@TableId(type = IdType.AUTO)
)
2. 根据主键查询
chatgptSettingMapper.selectById(1);
3. 查询所有数据
List<ChatgptSetting> list = chatgptSettingMapper.selectList(null);
4. 条件查询
List<ChatgptSetting> list = chatgptSettingMapper.selectList( new QueryWrapper<ChatgptSetting>().eq("type", "api") );
-
QueryWrapper
用于构造 WHERE 条件 -
你也可以链式调用:
.like()
,.between()
,.orderByDesc()
,.isNotNull()
5. 更新数据(按主键)
chatgptSettingMapper.updateById(chatgptSetting);
-
前提是
chatgptSetting.getId()
不为 null -
自动更新非 null 字段
6. 条件更新
chatgptSettingMapper.update( chatgptSetting, new UpdateWrapper<ChatgptSetting>().eq("setting", chatgptSetting.getSetting()) );
-
常用于“非主键”条件更新
-
如果你还用
.set("value", xxx)
,优先以set()
为准
7. 批量删除
chatgptSettingMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
二、Wrapper 用法:QueryWrapper / UpdateWrapper
方法 | 含义 | 示例 |
---|---|---|
.eq("字段", 值) | 等于 | eq("type", "api") |
.like("字段", 值) | 模糊匹配 | like("name", "key") |
.in("字段", List) | 在范围内 | in("id", ids) |
.orderByDesc("字段") | 倒序排序 | orderByDesc("create_time") |
.set("字段", 值) | 更新字段 | set("status", "已更新") |
三、常见注解说明
注解 | 说明 |
---|---|
@TableName("表名") | 映射数据库表 |
@TableId(type = IdType.AUTO) | 主键自增策略 |
@TableField("字段名") | 映射字段名(如果数据库列和实体字段名不一致) |
@TableField(exist = false) | 该字段不参与数据库操作,常用于分页、展示字段等 |
四、分页查询
需要配置分页插件:
// Spring Boot 配置分页插件(一次配置即可)
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;
}
使用
Page<ChatgptSetting> page = new Page<>(1, 10);
Page<ChatgptSetting> result = chatgptSettingMapper.selectPage(page, queryWrapper);
五、结合使用示例:分页+条件查询
QueryWrapper<ChatgptSetting> wrapper = new QueryWrapper<>();
wrapper.like("type", "api").orderByDesc("create_time");Page<ChatgptSetting> page = new Page<>(1, 10);
Page<ChatgptSetting> result = chatgptSettingMapper.selectPage(page, wrapper);
六、其它实用技巧
✅ 实体类中加分页参数,但不影响数据库操作:
@TableField(exist = false)
private Integer page;@TableField(exist = false)
private Integer size;
七、构造器的使用
通常在刚开始使用mybatis-plus时会出现的问题有:什么时候直接用mybatis-plus封装的方法、什么使用在方法中添加构造器**Warpaper<T>。
BaseMapper<T> 封装的方法有:
public interface BaseMapper<T> extends Mapper<T> {int insert(T entity);int deleteById(Serializable id);int deleteByMap(@Param("cm") Map<String, Object> columnMap);int delete(@Param("ew") Wrapper<T> queryWrapper);int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);int updateById(@Param("et") T entity);int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);T selectById(Serializable id);List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);T selectOne(@Param("ew") Wrapper<T> queryWrapper);Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}
根据方法中的参数类型来调用对于的方法。
✅小编在学习过程中总结出一个小点:
在开发过程中 我们一旦用到关于主键id有关的crud操作 我们可以直接调用方法 不需要使用构造器构造具体sql条件。一但执行的sql操作不是根据主键id执行 那么参数里面就会包含构造器(但不绝对 还是以方法中的参数类型为准)
例如:
chatgptSettingMapper.update(chatgptSetting,new UpdateWrapper<ChatgptSetting>().set("value", chatgptSetting.getValue()).eq("setting", chatgptSetting.getSetting())
);
而不能直接写成:
chatgptSettingMapper.update(chatgptSetting);
✅ 总结一句话:
MyBatis-Plus = 自动化 + 高效 + 函数式链式调用 + 兼容原生 MyBatis,适合中小型项目快速开发。