当前位置: 首页 > news >正文

MyBatisPlus(SpringBoot版)学习第二讲:基本CRUD

目录

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));
	}

 

相关文章:

  • 安装PrettyZoo操作指南
  • JavaEE进阶---Mybatis(预编译SQL即时SQL动态SQL标签池化技术说明)
  • 堆的相关要点以及模拟实现
  • 快速部署Samba共享服务器作为k8s后端存储
  • 透析主流CSS预处理器的区别
  • 红蓝队自动化项目资产侦察武器库部署企查产权网络空间
  • Excel(实战):INDEX函数和MATCH函数、INDEX函数实战题
  • TDengine 中的 show 命令
  • Scratch游戏 | 《拍苍蝇》——Scratch厨房清洁大作战!
  • 【NLP 42、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】
  • centos7搭建postgresql12主从
  • Node.js 格式化时间的两种方法:原生 Date 与 npm 包 moment 详解
  • [运维]Windows 开启 Hyper-V 之后上传网速变慢解决方案
  • 2025清华大学:DeepSeek教程全集(PDF+视频精讲,共10份).zip
  • Spring MVC 执行流程:一个请求在 Spring MVC 中是如何执行的?
  • css的背景
  • Linux Namespace(网络命名空间)系列二 --- 使用 Open vSwitch 和网络命名空间搭建虚拟网络
  • 前后端开发中,图片上传到不同格式(二进制数据ORbase64编码)
  • nuxt项目 详情页有阅读次数需要更新,有热门推荐列表需要更新适合做SSG吗
  • JSON相关的Java库使用指南
  • 习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式
  • 英国首相斯塔默住所起火,警方紧急调查情况
  • 他站在当代思想的地平线上,眺望浪漫主义的余晖
  • 国家统计局今年将在全国开展两次人口固定样本跟访调查
  • 上海与世界|环城生态公园带是上海绿色发展新名片
  • 山西忻州市人大常委会副主任郭建平接受审查调查