根据条件更新(可以更新NULL)
上边根据id更新 根据条件更新的方法只能将对象中不为NULL的属性更新到表中,下边通过UpdateWrapper进行更新,将birthday字段更新为NULL。
//根据条件进行更新,可以将为NULl的值更新到数据库 @Test public void testUpdate3(){ UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("name","曹操").set("birthday",null); //只将对象中不为NULL的值更新到数据库中 int i = userMapper.update(null,updateWrapper); System.out.println(i); }
还可以同时更新多个属性
//根据条件进行更新,可以将为NULl的值更新到数据库 @Test public void testUpdate4(){ UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("name","曹操").set("age", 999).set("birthday",null); //只将对象中不为NULL的值更新到数据库中 int i = userMapper.update(null,updateWrapper); System.out.println(i); }
删除操作
根据id删除
方法定义:
/** *根 据 ID 删 除 * *@param id 主键ID */ int deleteById(Serializable id);
删除步骤:
- 指定要删除记录的主键值。
- 调用deleteById方法执行删除。
测试用例:
@Test public void testDeleteById() { //执行删除操作 int result = this.userMapper.deleteById(6L); System.out.println("result = " + result); }
根据 entity 条件删除
方法定义:
/** *根据 entity 条件,删除记录 * *@param wrapper 实体对象封装操作类(可以为 null) */ int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
删除步骤:
根据条件删除步骤:
- 定义对象,设置属性值,指定删除条件 ,可指定多个删除条件注意:删除条件只匹配对象中不为NULL的属性值
- 设置QueryWrapper
- 执行删除
测试案例:
@Test public void testDelete(){ //设置条件 User user = new User(); user.setAge(999); user.setName("曹操1"); QueryWrapper<User> queryWrapper =new QueryWrapper<>(user); //根据条件删除 int delete = userMapper.delete(queryWrapper); System.out.println(delete); }
注意:定义QueryWrapper可以不包装模型对象,手动设置条件,如下:
@Test public void testDelete(){ //设置条件 QueryWrapper<User> queryWrapper =new QueryWrapper<>(); queryWrapper.eq("age",999); queryWrapper.eq("name","曹操1"); //根据条件删除 int delete = userMapper.delete(queryWrapper); System.out.println(delete); }
上面两种写法是一样的,运行结果如下:
影响了一行,看一下数据库前后,确实删掉了:
根据ID 批量删除
方法定义:
/** *删除(根据ID 批量删除) * *@param idList 主键ID列表(不能为 null 以及 empty) */ int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
删除步骤:
批量删除操作步骤:
- 指定 id列表
- 执行删除
测试案例:
删除id为101、102、103的
//批量删除 @Test public void testDelete2(){ //根据条件删除 int delete = userMapper.deleteBatchIds(Arrays.asList(101L,102L,103L)); System.out.println(delete); }
查询操作
MP提供了多种查询操作,包括根据id查询 批量查询 查询单条数据 查询列表 分页查询等操作。
根据id查询
方法定义:
/** *根 据 ID 查 询 * *@param id 主键ID */ T selectById(Serializable id);
查询步骤:
根据id查询步骤:
- 设置查询记录的主键值。
- 执行查询。
- 查询结果返回一个对象。
注意:这里返回的就是对象了,之前都是返回影响的行数。
测试用例:
@Test public void testSelectById() { //根据id查询数据 User user = this.userMapper.selectById(2L); System.out.println("result = " + user); }
查询结果:
根据id批量查询
方法定义:
/** *查询(根据ID 批量查询) * *@param idList 主键ID列表(不能为 null 以及 empty) */ List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
查询步骤:
根据id列表查询:
- 设置id列表
- 执行查询
- 查询对象返回List
注意:这里返回的就是对象list了
测试案例:
@Test public void testSelectBatchIds() { //根据id集合批量查询 List<User> users = this.userMapper.selectBatchIds(Arrays.asList(2L, 3L, 10L)); for (User user : users) { System.out.println(user); } }
查询结果:
根据 entity 条件查询一条记录
方法定义:
/** *根据 entity 条件,查询一条记录 * *@param queryWrapper 实体对象封装操作类(可以为 null) */ T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
查询步骤:
- 设置QueryWrapper对象,设置查询条件,可以设置多个条件
- 执行查询
注意:如果查询结果为多条记录则报错(TooManyResultsException)。
测试案例:
@Test public void testSelectOne(){ QueryWrapper<User> queryWrapper =new QueryWrapper<>(); queryWrapper.eq("name","张三"); //根据条件查询,只能查询出一条记录,否则报错 User user = userMapper.selectOne(queryWrapper); System.out.println(user); }
查询结果:
根据 Wrapper 条件查询总记录数
方法定义:
/** *根据 Wrapper 条件,查询总记录数 * *@param queryWrapper 实体对象封装操作类(可以为 null) */ Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试案例:
@Test public void testSelectCount() { QueryWrapper<User> wrapper = new QueryWrapper<User>(); wrapper.gt("age", 23); //年龄大于23岁 //根据条件查询数据条数 Integer count = this.userMapper.selectCount(wrapper); System.out.println("count = " + count); }
运行结果为:count = 2
点进gt方法的声明类里,还可以看到其的 Wrapper 条件:
根据 entity 条件查询全部记录
方法定义:
/** *根据 entity 条件,查询全部记录 * *@param queryWrapper 实体对象封装操作类(可以为 null) */ List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试案例:
@Test public void testSelectList() { QueryWrapper<User> wrapper = new QueryWrapper<User>(); wrapper.gt("age", 23); //年龄大于23岁 // 根据条件查询数据 List<User> users = this.userMapper.selectList(wrapper); for (User user : users) { System.out.println("user = " + user); } }
运行结果为:
根据 entity 条件查询全部记录(并翻页)
方法定义:
/** *根据 entity 条件,查询全部记录(并翻页) * *@param page 分页查询条件(可以为 RowBounds.DEFAULT) *@param queryWrapper 实体对象封装操作类(可以为 null) */ IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
测试案例:
@Test public void testSelectPage() { //条件 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // queryWrapper.eq("name","张三");//等于 queryWrapper.gt("age", 20);//大于? //用构造方法设置当前页码,每页记录数 int pageIndex = 2;//当前页码 int size = 3;//每页记录数 Page<User> page = new Page<>(pageIndex, size); IPage<User> userIPage = userMapper.selectPage(page, queryWrapper); // 打印一下记录信息 long pages = userIPage.getPages();//总页数 long total = userIPage.getTotal();//总记录数 System.out.println("数据总条数 :" + total); System.out.println("总页数:" + pages); //记录列表 List<User> records = userIPage.getRecords(); System.out.println(records); }
运行结果:
2022-03-23 21:14:39.335 DEBUG 138796 --- [ main] c.b.m.e.p.p.o.JsqlParserCountOptimize : JsqlParserCountOptimize sql=SELECT id,user_name,password,name,age,email,birthday FROM tb_user WHERE age > ? 2022-03-23 21:14:39.372 DEBUG 138796 --- [ main] c.i.mp.mapper.UserMapper.selectPage : ==> Preparing: SELECT COUNT(1) FROM tb_user WHERE age > ? 2022-03-23 21:14:39.402 DEBUG 138796 --- [ main] c.i.mp.mapper.UserMapper.selectPage : ==> Parameters: 20(Integer) 2022-03-23 21:14:39.558 DEBUG 138796 --- [ main] c.i.mp.mapper.UserMapper.selectPage : ==> Preparing: SELECT id,user_name,password,name,age,email,birthday FROM tb_user WHERE age > ? LIMIT ?,? 2022-03-23 21:14:39.559 DEBUG 138796 --- [ main] c.i.mp.mapper.UserMapper.selectPage : ==> Parameters: 20(Integer), 3(Long), 3(Long) 2022-03-23 21:14:39.715 DEBUG 138796 --- [ main] c.i.mp.mapper.UserMapper.selectPage : <== Total: 3 2022-03-23 21:14:39.716 DEBUG 138796 --- [ main] org.mybatis.spring.SqlSessionUtils : Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7fd987ef] 数据总条数 :6 总页数:2 [User(id=5, userName=sunqi, password=123456, name=孙七, age=24, email=test5@itcast.cn, birthday=2022-03-09T00:00), User(id=1506541267385905153, userName=caocao, password=12222, name=曹操, age=999, email=null, birthday=null), User(id=1506541407249121282, userName=caocao, password=12222, name=曹操, age=999, email=null, birthday=null)]