MP2️⃣基础 CRUD & 分页查询
1、基础 CRUD(❗)
① 增
-
自动生成主键 ID:默认采用雪花算法。
User user = new User(); user.setName("ump1"); user.setPassword("123456"); userDao.insert(user);
-
自动根据实体类属性,生成动态 SQL(只插入非 null 的字段)
(示例:user 没有设置 age,插入时不会有 age)
INSERT INTO mp_user ( id, name, password ) VALUES ( ?, ?, ? )
② 删
删除方法参数为 id 或 entity,但本质上都是通过 ID 进行删除。
同理,批量删除的参数可以是 idList 或 entityList。
Hint:本例中 id 字段是 bigint 类型,对应 Java 的 long 类型。
单个
-
代码
// 根据ID userDao.deleteById(id); // 根据entity,本质也是获取id User user = new User(); user.setId(id); userDao.deleteById(user);
-
SQL
DELETE FROM mp_user WHERE id=?
批量
-
代码
// 根据ID Long[] idList = {id1, id2}; userDao.deleteBatchIds(Arrays.asList(idList)); // 根据entity User u1 = new User(); u1.setId(id1); User u2 = new User(); u2.setId(id2); User[] userList = {u1, u2}; userDao.deleteBatchIds(Arrays.asList(userList));
-
SQL:自动根据 ID 个数,拼接动态 SQL。
DELETE FROM mp_user WHERE id IN {?, ?}
③ 改
-
通过 ID 确定要更新的记录。
User user = new User(); user.setId(id); user.setName("new name"); userDao.updateById(user);
-
自动根据 entity 的属性赋值情况,拼接动态 SQL(只更新非 null 的属性)。
UPDATE mp_user SET name=? WHERE id=?
④ 查
-
ID
-
ID 列表:自动根据 ID 个数,拼接动态 SQL。
-
查询所有(参数是 Wrapper,null 表示不加查询条件)
// 单个 userDao.selectById(id); // 批量 Long[] idList = {id1, id2, id3}; userDao.selectBatchIds(Arrays.asList(idList)); // 所有 userDao.selectList(null);
2、分页(❗)
-
Page:分页模型(可设置分页参数,保存查询数据记录)。
-
Wrapper:条件构造器(可为 null)。
<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
2.1、分页拦截器
要使分页功能生效,需要配置分页拦截器。
-
@Configuration
:创建 MP 配置类。 -
@Bean
:创建拦截器对象,添加分页拦截器。@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mpi = new MybatisPlusInterceptor(); mpi.addInnerInterceptor(new PaginationInnerInterceptor()); return mpi; } }
2.2、使用
从日志可看出,MP 基于
LIMIT
物理分页。
-
创建
Page
对象,设置分页参数(当前页码,页面大小) -
分页查询
-
获取结果
IPage<User> page = new Page<>(1, 5); userDao.selectPage(page, null); // 当前页码、页面大小 System.out.println(page.getCurrent()); System.out.println(page.getSize()); // 总页数、总记录数 System.out.println(page.getPages()); System.out.println(page.getTotal()); // 当前页数据 System.out.println(page.getRecords());
附:BaseMapper <T>
从源码可看出,接口参数的 id 是
Serializable
类型。可作为主键 ID 的所有数据类型,都直接或间接实现了
Serializable
接口。(这就是 面向抽象编程 的体现)
-
String 和 Number 都实现了
Serializable
接口。 -
基本类型、原子类型等都继承自
Number
抽象类。
增
int insert(T entity);
删
-
ID
-
实体,本质也是 ID
-
columnMap
-
拼接条件
-
ID 列表或实体列表,批量
int deleteById(Serializable id); int deleteById(T entity); int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); int deleteBatchIds(@Param(Constants.COLLECTION) Collection<?> idList);
改
-
实体,由 ID 确定记录
-
实体,拼接条件
int updateById(@Param(Constants.ENTITY) T entity); int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
查
基础
-
ID
-
ID 列表,批量
-
columnMap
-
拼接条件
-
拼接条件,批量(entity)
-
拼接条件,批量(包含属性的 Map)
-
拼接条件,首个字段的列表
T selectById(Serializable id); List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) { List<T> ts = this.selectList(queryWrapper); if (CollectionUtils.isNotEmpty(ts)) { if (ts.size() != 1) { throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records"); } return ts.get(0); } return null; } List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
分页
分页 Page 对象,拼接条件。
<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
其它
-
判断存在:拼接条件
-
总记录数:拼接条件
default boolean exists(Wrapper<T> queryWrapper) { Long count = this.selectCount(queryWrapper); return null != count && count > 0; } Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);