-
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new
window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 -
特性:
环境
JDK 8+
maven:
知识 配置://或 com.baomidou mybatis-plus mybatis-plus-latest-version //注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。 com.baomidou mybatis-plus-boot-starter mybatis-plus-latest-version
@SpringBootApplication
//配置 MapperScan 注解
@MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
spring xml配置文件:
//配置 MapperScan注解//调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory
略:
https://mp.baomidou.com/guide/generator.html
https://mp.baomidou.com/guide/generator-new.html
通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆。
IService方法:
// 新增 // 插入一条记录(选择字段,策略插入) boolean save(T entity); // 插入(批量) boolean saveBatch(CollectionentityList); // 插入(批量) boolean saveBatch(Collection entityList, int batchSize); // 新增或更新 // TableId 注解存在更新记录,否插入一条记录 boolean saveOrUpdate(T entity); // 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法 boolean saveOrUpdate(T entity, Wrapper updateWrapper); // 批量修改插入 boolean saveOrUpdateBatch(Collection entityList); // 批量修改插入 boolean saveOrUpdateBatch(Collection entityList, int batchSize); // 删除 // 根据 entity 条件,删除记录 boolean remove(Wrapper queryWrapper); // 根据 ID 删除 boolean removeById(Serializable id); // 根据 columnMap 条件,删除记录 boolean removeByMap(Map columnMap); // 删除(根据ID 批量删除) boolean removeByIds(Collection extends Serializable> idList); // 更新 // 根据 UpdateWrapper 条件,更新记录 需要设置sqlset boolean update(Wrapper updateWrapper); // 根据 whereWrapper 条件,更新记录 boolean update(T updateEntity, Wrapper whereWrapper); // 根据 ID 选择修改 boolean updateById(T entity); // 根据ID 批量更新 boolean updateBatchById(Collection entityList); // 根据ID 批量更新 boolean updateBatchById(Collection entityList, int batchSize); // 获取单条数据 // 根据 ID 查询 T getById(Serializable id); // 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1") T getOne(Wrapper queryWrapper); // 根据 Wrapper,查询一条记录 T getOne(Wrapper queryWrapper, boolean throwEx); // 根据 Wrapper,查询一条记录 Map getMap(Wrapper queryWrapper); // 根据 Wrapper,查询一条记录 V getObj(Wrapper queryWrapper, Function super Object, V> mapper); // 获取列表数据 // 查询所有 List list(); // 查询列表 List list(Wrapper queryWrapper); // 查询(根据ID 批量查询) Collection listByIds(Collection extends Serializable> idList); // 查询(根据 columnMap 条件) Collection listByMap(Map columnMap); // 查询所有列表 List
baseMapper方法:
// 新增 // 插入一条记录 int insert(T entity); // 删除 // 根据 entity 条件,删除记录 int delete(@Param(Constants.WRAPPER) Wrapper条件构造器wrapper); // 删除(根据ID 批量删除) int deleteBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList); // 根据 ID 删除 int deleteById(Serializable id); // 根据 columnMap 条件,删除记录 int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap); // 更新 // 根据 whereWrapper 条件,更新记录 int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper whereWrapper); // 根据 ID 修改 int updateById(@Param(Constants.ENTITY) T entity); // 查询 // 根据 ID 查询 T selectById(Serializable id); // 根据 entity 条件,查询一条记录 T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper); // 查询(根据ID 批量查询) List selectBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList); // 根据 entity 条件,查询全部记录 List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); // 查询(根据 columnMap 条件) List selectByMap(@Param(Constants.COLUMN_MAP) Map columnMap); // 根据 Wrapper 条件,查询全部记录 List > selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper); // 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值 List selectObjs(@Param(Constants.WRAPPER) Wrapper queryWrapper); // 根据 entity 条件,查询全部记录(并翻页) IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); // 根据 Wrapper 条件,查询全部记录(并翻页) IPage > selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); // 根据 Wrapper 条件,查询总记录数 Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper); // *选装件 int alwaysUpdateSomeColumnById(T entity); int insertBatchSomeColumn(List entityList); int logicDeleteByIdWithFill(T entity);
不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输,推荐使用DTO进行传输
//以下是AbstractWrapper的方法,是QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类 allEq(Map分页插件params) allEq(Map params, boolean null2IsNull) allEq(boolean condition, Map params, boolean null2IsNull) //params : key为数据库字段名,value为字段值 //null2IsNull : 为true则在map的value为null时调用 isNull 方法,为false时则忽略value为null的 eq(R column, Object val) eq(boolean condition, R column, Object val) ne(R column, Object val) ne(boolean condition, R column, Object val) gt(R column, Object val) gt(boolean condition, R column, Object val) ge(R column, Object val) ge(boolean condition, R column, Object val) lt(R column, Object val) lt(boolean condition, R column, Object val) le(R column, Object val) le(boolean condition, R column, Object val) between(R column, Object val1, Object val2) between(boolean condition, R column, Object val1, Object val2) notBetween(R column, Object val1, Object val2) notBetween(boolean condition, R column, Object val1, Object val2) like(R column, Object val) like(boolean condition, R column, Object val) notLike(R column, Object val) notLike(boolean condition, R column, Object val) likeLeft(R column, Object val) likeLeft(boolean condition, R column, Object val) likeRight(R column, Object val) likeRight(boolean condition, R column, Object val) isNull(R column) isNull(boolean condition, R column) isNotNull(R column) isNotNull(boolean condition, R column) in(R column, Collection> value) in(boolean condition, R column, Collection> value) in(R column, Object... values) in(boolean condition, R column, Object... values) notIn(R column, Collection> value) notIn(boolean condition, R column, Collection> value) notIn(R column, Object... values) notIn(boolean condition, R column, Object... values) inSql(R column, String inValue) inSql(boolean condition, R column, String inValue) notInSql(R column, String inValue) notInSql(boolean condition, R column, String inValue) groupBy(R... columns) groupBy(boolean condition, R... columns) orderByAsc(R... columns) orderByAsc(boolean condition, R... columns) orderByDesc(R... columns) orderByDesc(boolean condition, R... columns) orderBy(boolean condition, boolean isAsc, R... columns) having(String sqlHaving, Object... params) having(boolean condition, String sqlHaving, Object... params) func(Consumer consumer) func(boolean condition, Consumer consumer) or() or(boolean condition) or(Consumer consumer) or(boolean condition, Consumer consumer) and(Consumer consumer) and(boolean condition, Consumer consumer) nested(Consumer consumer) nested(boolean condition, Consumer consumer) //例: nested(i -> i.eq("name", "李白").ne("status", "活着"))--->(name = '李白' and status <> '活着') apply(String applySql, Object... params) apply(boolean condition, String applySql, Object... params) //例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'") last(String lastSql) last(boolean condition, String lastSql) //无视优化规则直接拼接到 sql 的最后,只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用 exists(String existsSql) exists(boolean condition, String existsSql) //例: exists("select id from table where age = 1")--->exists (select id from table where age = 1) notExists(String notExistsSql) notExists(boolean condition, String notExistsSql) // 以下是QueryWrapper的方法 select(String... sqlSelect) select(Predicate predicate) select(Class entityClass, Predicate predicate) // 以下是UpdateWrapper的方法 set(String column, Object val) set(boolean condition, String column, Object val) setSql(String sql) //lambda: // 区分: // 链式调用 普通 UpdateChainWrapper update(); // 链式调用 lambda 式。注意:不支持 Kotlin LambdaUpdateChainWrapper lambdaUpdate(); // 等价示例: query().eq("id", value).one(); lambdaQuery().eq(Entity::getId, value).one(); // 等价示例: update().eq("id", value).remove(); lambdaUpdate().eq(Entity::getId, value).remove();
Spring xml配置方式:
Spring boot配置方式:
//Spring boot方式
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
// 旧版
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
}
自定义分页:
// Mapper接口
public interface UserMapper {//可以继承或者不继承baseMapper
IPage selectPageVo(Page> page, Integer state);
}
// Service实现类
public IPage selectUserPage(Page page, Integer state) {
// 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题,这时候你需要自己查询 count 部分
// page.setOptimizeCountSql(false);
// 当 total 为小于 0 或者设置 setSearchCount(false) 分页插件不会进行 count 查询
// 要点!! 分页返回的对象与传入的对象是同一个
return userMapper.selectPageVo(page, state);
}
// 自定义xml方法
序列主键(Sequence):
- DB2KeyGenerator
- H2KeyGenerator
- KingbaseKeyGenerator
- OracleKeyGenerator
- PostgreKeyGenerator
@KeySequence(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class)
public class YourEntity {
@TableId(value = "ID_STR", type = IdType.INPUT)
private String idStr;
}
// Springboot:
// 使用配置类
@Bean
public IKeyGenerator keyGenerator() {
return new H2KeyGenerator();
}
// 或者通过MybatisPlusPropertiesCustomizer自定义
@Bean
public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() {
return plusProperties -> plusProperties.getGlobalConfig().getDbConfig().setKeyGenerator(new H2KeyGenerator());
}
// Spring:
// 使用xml
// 使用注解:
@Bean
public GlobalConfig globalConfig() {
GlobalConfig conf = new GlobalConfig();
conf.setDbConfig(new GlobalConfig.DbConfig().setKeyGenerator(new H2KeyGenerator()));
return conf;
}
自定义ID生成器:
// Springboot:
@Component
public class CustomIdGenerator implements IdentifierGenerator {
@Override
public Long nextId(Object entity) {
//可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.
String bizKey = entity.getClass().getName();
//根据bizKey调用分布式ID生成
long id = ....;
//返回生成的id值即可.
return id;
}
}
@Bean
public IdentifierGenerator idGenerator() {
return new CustomIdGenerator();
}
@Bean
public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() {
return plusProperties -> plusProperties.getGlobalConfig().setIdentifierGenerator(new CustomIdGenerator());
}
// Spring:
// xml:
// 注解:
@Bean
public GlobalConfig globalConfig() {
GlobalConfig conf = new GlobalConfig();
conf.setIdentifierGenerator(new CustomIdGenerator());
return conf;
}
相关连接
https://mp.baomidou.com/guide/



