目录
1.BaseMapper
2. 基本CRUD
1. 插入一条记录
2. 删除
1>. 根据ID删除
2>. 根据实体(ID)删除
3>. 根据columnMap条件删除
4>. 根据entity条件删除
5>. 根据ID批量删除
3. 修改
1>. 根据ID修改
2>. 根据whereEntity条件更改
4. 查询
1>. 根据ID查询
2>. 根据ID批量查询
3>. 根据columnMap条件查询
4>. 根据entity条件,查询一条记录
5>. 根据wrapper条件,查询总记录数
6>. 根据entity条件 ,查询全部记录
7>. 根据wrapper条件, 查询全部记录,封装map
8>. 根据wrapper条件,查询全部记录,返回第一个字段值
9>. 根据entity条件,查询全部记录并翻页
10>. 根据wrapper条件,查询全部记录并翻页
1.BaseMapper
MyBatis-Plus中的基本CRUD在内置的BaseMapper中都已得到了实现,我们可以直接使用,接口如下:
package com.baomidou.mybatisplus.core.mapper;
public interface BaseMapper<T> extends Mapper<T> {
/**
* 插入一条记录
* @param entity 实体对象 */
int insert(T entity);
/**
* 根据 ID 删除
* @param id 主键ID */
int deleteById(Serializable id);
/**
* 根据实体(ID)删除
* @param entity 实体对象
* @since 3.4.4 */
int deleteById(T entity);
/**
* 根据 columnMap 条件,删除记录
* @param columnMap 表字段 map 对象 */
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,删除记录
* @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where
语句)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 删除(根据ID 批量删除)
* @param idList 主键ID列表(不能为 null 以及 empty) */
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 根据 ID 修改
* @param entity 实体对象 */
int updateById(@Param(Constants.ENTITY) T entity);
/**
* 根据 whereEntity 条件,更新记录
* @param entity 实体对象 (set 条件值 ,可以为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成
where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
/**
* 根据 ID 查询
* @param id 主键ID */
T selectById(Serializable id);
/**
* 查询(根据ID 批量查询)
* @param idList 主键ID列表(不能为 null 以及 empty) */
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 查询(根据 columnMap 条件)
* @param columnMap 表字段 map 对象 */
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,查询一条记录
* <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录 , 注意:多条数据会报异常 </p>
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
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;
}
/**
* 根据 Wrapper 条件,查询总记录数
* @param queryWrapper 实体对象封装操作类(可以为 null) */
Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录
* @param queryWrapper 实体对象封装操作类(可以为 null) */
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
* @param queryWrapper 实体对象封装操作类(可以为 null) */
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
* <p>注意: 只返回第一个字段的值</p>
* @param queryWrapper 实体对象封装操作类(可以为 null) */
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录(并翻页)
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null) */
<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类 */
<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
2. 基本CRUD
1. 插入一条记录
原码:
/**
* 插入一条记录
* @param entity 实体对象 */
int insert(T entity);
测试:
@Test
public void testInsert(){
User user = new User(null, "张三", 23, "zhangsan@qcby.com");
//INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
int result = userMapper.insert(user);
System.out.println("受影响行数:"+result);
//1475754982694199298
System.out.println("id自动获取:"+user.getId());
}
最终执行的结果,所获取的id为1903360524240498689
这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id。
2. 删除
1>. 根据ID删除
原码:
/**
* 根据 ID 删除
* @param id 主键ID */
int deleteById(Serializable id);
测试:
@Test
public void testDeleteById(){
//通过id删除用户信息
//DELETE FROM user WHERE id=?
int result = userMapper.deleteById(1903360524240498689L);
System.out.println("受影响行数:"+result);
}
2>. 根据实体(ID)删除
原码:
/**
* 根据实体(ID)删除
* @param entity 实体对象
* @since 3.4.4 */
int deleteById(T entity);
测试:
/***
* 根据用户ID删除
*/
@Test
public void deleteByUserID(){
int result=userMapper.deleteById(8L);
System.out.println("受影响的行数:"+result);
}
3>. 根据columnMap条件删除
原码:
/**
* 根据 columnMap 条件,删除记录
* @param columnMap 表字段 map 对象 */
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
测试:
@Test
public void testDeleteByMap(){
//根据map集合中所设置的条件删除记录
//DELETE FROM user WHERE name = ? AND age = ?
Map<String, Object> map = new HashMap<>();
map.put("age", 23);
map.put("name", "张三");
int result = userMapper.deleteByMap(map);
System.out.println("受影响行数:"+result);
}
4>. 根据entity条件删除
原码:
/**
* 根据 entity 条件,删除记录
* @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where
语句)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试:
/***
* 根据entity条件,删除记录
*/
@Test
public void deleteByEntity(){
User user=new User();
user.setName("nn");
user.setAge(22);
QueryWrapper<User> queryWrapper=new QueryWrapper<>(user);
int result=userMapper.delete(queryWrapper);
System.out.println("受影响的行数:"+result);
}
5>. 根据ID批量删除
原码:
/**
* 删除(根据ID 批量删除)
* @param idList 主键ID列表(不能为 null 以及 empty) */
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
测试:
@Test
public void testDeleteBatchIds(){
//通过多个id批量删除
//DELETE FROM user WHERE id IN ( ? , ? , ? )
List<Long> idList = Arrays.asList(1L, 2L, 3L);
int result = userMapper.deleteBatchIds(idList);
System.out.println("受影响行数:"+result);
}
3. 修改
1>. 根据ID修改
原码:
/**
* 根据 ID 修改
* @param entity 实体对象 */
int updateById(@Param(Constants.ENTITY) T entity);
测试:
@Test
public void testUpdateById(){
User user = new User(4L, "admin", 22, null);
//UPDATE user SET name=?, age=? WHERE id=?
int result = userMapper.updateById(user);
System.out.println("受影响行数:"+result);
}
2>. 根据whereEntity条件更改
原码:
/**
* 根据 whereEntity 条件,更新记录
* @param entity 实体对象 (set 条件值 ,可以为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成
where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
测试:
/***
* 根据whereEntity条件更新
*/
@Test
public void testUpdateByWhere(){
User updateUser=new User();
updateUser.setName("Updated");
updateUser.setAge(30);
User oldUser=new User();
oldUser.setName("丽丽");
oldUser.setAge(33);
UpdateWrapper<User> updateWrapper=new UpdateWrapper<>(oldUser);
int result=userMapper.update(updateUser,updateWrapper);
System.out.println("受影响行数:"+result);
}
4. 查询
1>. 根据ID查询
原码:
/**
* 根据 ID 查询
* @param id 主键ID */
T selectById(Serializable id);
测试:
@Test
public void testSelectById(){
//根据id查询用户信息
//SELECT id,name,age,email FROM user WHERE id=?
User user = userMapper.selectById(4L);
System.out.println(user);
}
2>. 根据ID批量查询
原码:
/**
* 查询(根据ID 批量查询)
* @param idList 主键ID列表(不能为 null 以及 empty) */
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
测试:
@Test
public void testSelectBatchIds(){
//根据多个id查询多个用户信息
//SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
List<Long> idList = Arrays.asList(4L, 5L);
List<User> list = userMapper.selectBatchIds(idList);
list.forEach(System.out::println);
}
这里的foreach是lamda表达式的遍历语句。
3>. 根据columnMap条件查询
原码:
/**
* 查询(根据 columnMap 条件)
* @param columnMap 表字段 map 对象 */
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
测试:
@Test
public void testSelectByMap(){
//通过map条件查询用户信息
//SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
Map<String, Object> map = new HashMap<>();
map.put("age", 22);
map.put("name", "admin");
List<User> list = userMapper.selectByMap(map);
list.forEach(System.out::println);
}
4>. 根据entity条件,查询一条记录
原码:
/**
* 根据 entity 条件,查询一条记录
* <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录 , 注意:多条数据会报异常 </p>
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
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;
}
测试:
测试有多条记录的:
@Test
public void testSelectByEntity(){
User user=new User();
user.setAge(22);//有两条记录
QueryWrapper<User> queryWrapper=new QueryWrapper<>(user);
System.out.println(userMapper.selectOne(queryWrapper));//会报错
}
测试一条数据的:
@Test
public void testSelectByEntity(){
User user=new User();
user.setAge(30);//有两条记录
user.setName("Updated");
QueryWrapper<User> queryWrapper=new QueryWrapper<>(user);
System.out.println(userMapper.selectOne(queryWrapper));//会报错
}
5>. 根据wrapper条件,查询总记录数
原码:
/**
* 根据 Wrapper 条件,查询总记录数
* @param queryWrapper 实体对象封装操作类(可以为 null) */
Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试:
/***
* 根据Wrapper条件,查询总记录数
*/
@Test
public void testByWrapper(){
User user=new User();
user.setAge(22);
QueryWrapper<User> queryWrapper=new QueryWrapper<>(user);
System.out.println(userMapper.selectCount(queryWrapper));
}
6>. 根据entity条件 ,查询全部记录
原码:
/**
* 根据 entity 条件,查询全部记录
* @param queryWrapper 实体对象封装操作类(可以为 null) */
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试:
@Test
public void testSelectList1(){
//查询所有用户信息
//SELECT id,name,age,email FROM user
List<User> list = userMapper.selectList(null);
list.forEach(System.out::println);
}
7>. 根据wrapper条件, 查询全部记录,封装map
原码:
/**
* 根据 Wrapper 条件,查询全部记录
* @param queryWrapper 实体对象封装操作类(可以为 null) */
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试:
/***
* 根据wrapper条件,查询全部记录
*/
@Test
public void testDelectMaps(){
List<Map<String,Object>> resultList=userMapper.selectMaps(null);
// 输出查询结果
for (Map<String, Object> result : resultList) {
System.out.println(result);
}
}
8>. 根据wrapper条件,查询全部记录,返回第一个字段值
原码:
/**
* 根据 Wrapper 条件,查询全部记录
* <p>注意: 只返回第一个字段的值</p>
* @param queryWrapper 实体对象封装操作类(可以为 null) */
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试:
/***
* 根据wrapper条件,查询全部记录,返回第一个字段值
*/
@Test
public void testSelectObjs(){
List<Object> resultObjs=userMapper.selectObjs(null);
for(Object o:resultObjs){
System.out.println(o);
}
}
9>. 根据entity条件,查询全部记录并翻页
原码:
/**
* 根据 entity 条件,查询全部记录(并翻页)
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null) */
<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试:
/***
* 根据entity查询并翻页
*/
@Test
public void testSelectPage(){
Page<User> p=new Page<>(1,5);
IPage<User> results=userMapper.selectPage(p,null);
// 输出分页查询结果信息
System.out.println("当前页: " + results.getCurrent());
System.out.println("每页记录数: " + results.getSize());
System.out.println("总记录数: " + results.getTotal());
System.out.println("总页数: " + results.getPages());
// 输出查询到的记录
results.getRecords().forEach(user -> System.out.println(user));
}
getRecords()
是 IPage
接口的一个方法,用于获取分页查询结果中的数据记录集合。
user
是一个参数,表示集合中的每个元素。
10>. 根据wrapper条件,查询全部记录并翻页
原码:
/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类 */
<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试:
/***
* 根据wrapper条件查询并翻页
*/
@Test
public void testSelectMapsPage(){
Page<Map<String,Object>> page=new Page<>();
IPage<Map<String,Object>> results=userMapper.selectMapsPage(page,null);
// 输出分页查询结果信息
System.out.println("当前页: " + results.getCurrent());
System.out.println("每页记录数: " + results.getSize());
System.out.println("总记录数: " + results.getTotal());
System.out.println("总页数: " + results.getPages());
// 输出查询到的记录
results.getRecords().forEach(record -> System.out.println(record));
}