Mapper的CRUD接口5:增删改操作
1、新增数据
- insert 方法可以将一个实体对象插入到对应的数据表中:
@RestController
public class HelloController {
@Autowired
private AreaMapper areaMapper;
@RequestMapping("/test")
public void test(){
Area area = new Area();
area.setAreaName("重庆");
areaMapper.insert(area);
}
}
- 插入成功后,当前插入对象在数据库中的 id 会自动写回到该实体中。
2、删除数据
- deleteById 方法可以根据 id 删除一条记录:
// 返回删除的记录数
int i = userInfoMapper.deleteById(4);
- deleteBatchIds 方法根据 id 批量删除:
// 返回删除的记录数
int i = userInfoMapper.deleteBatchIds(Arrays.asList(4,5,6));
- deleteByMap 方法通过 Map 封装的条件删除记录:
注意:map 写的是数据表中的列名,而非实体类的属性名。比如属性名为 userName,数据表中字段为 user_name,这里应该写的是 user_name。
Map<String,Object> columnMap = new HashMap<>();
columnMap.put("user_name", "hangge");
columnMap.put("age", 22);
// 返回删除的记录数
int i = userInfoMapper.deleteByMap(columnMap);
- delete 方法使用查询构造器,删除记录:
关于查询条件构造器(QueryWrapper LambdaQueryWrapper)的详细用法可以参考我之前写的文章:
- MyBatis-Plus 4 Mapper的CRUD接口1:基本查询
- MyBatis-Plus 5 Mapper的CRUD接口2:条件构造器
// 查询条件:名字中包含'ha'并且年龄小于40
LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40);
// 开始删除,返回删除的记录数
int i = userInfoMapper.delete(queryWrapper);
return i;
3、修改数据
- updateById 方法根据实体对象中的 ID 进行修改:
注意:如果实体类某个属性为 null,不会更新该属性(不会把对应的数据库字段值设置为 null)
UserInfo userInfo = new UserInfo();
userInfo.setId(3);
userInfo.setUserName("hangge");
userInfo.setPassWord("123");
// 开始修改,返回影响的记录数
int i = userInfoMapper.updateById(userInfo);
- update 方法可以实体对象封装操作类进行更新操作:
- 数据更新相关的构造器(UpdateWrapper、LambdaUpdateWrapper、LambdaUpdateChainWrapper)使用方法类似于查询构造器(QueryWrapper、LambdaQueryWrapper、LambdaQueryChainWrapper),不同的是它增加了如下两个方法:
- set:设置数据库字段值
- setSql:设置 set 部分的 sql
- 关于查询构造器(QueryWrapper、LambdaQueryWrapper、LambdaQueryChainWrapper)具体用法,可以查看我之前的文章:
// 查询条件:名字中包含'ha'并且年龄小于40
LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40);
// 将满足条件的记录密码都设置为8888
UserInfo userInfo = new UserInfo();
userInfo.setPassWord("8888");
// 开始修改,返回影响的记录数
int i = userInfoMapper.update(userInfo, updateWrapper);
- 我们也可以通过 UpdateWrapper 的 set 方法直接设置字段值,比如下面除了将密码设置为 8888 外,还将年龄设置为 null:
// 查询条件:名字中包含'ha'并且年龄小于40
LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40)
.set(UserInfo::getPassWord, "8888")
.set(UserInfo::getAge, null);
// 开始修改,返回影响的记录数
int i = userInfoMapper.update(null, updateWrapper);
/*********** 二者可以结合使用的,下面效果等效于上面的 ****************/
// 查询条件:名字中包含'ha'并且年龄小于40
LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40)
.set(UserInfo::getAge, null);
// 将满足条件的记录密码都设置为8888
UserInfo userInfo = new UserInfo();
userInfo.setPassWord("8888");
// 开始修改,返回影响的记录数
int i = userInfoMapper.update(userInfo, updateWrapper);
- 而也通过 UpdateWrapper 的 setSql 方法可以直接设置 set 部分的 sql,下面的效果同上面是一样的:
// 查询条件:名字中包含'ha'并且年龄小于40
LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40)
.setSql("pass_word = '8888'")
.setSql("age = null");
// 开始修改,返回影响的记录数
int i = userInfoMapper.update(null, updateWrapper);
/*********** 二者可以结合使用的,下面效果等效于上面的 ****************/
// 查询条件:名字中包含'ha'并且年龄小于40
LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.like(UserInfo::getUserName,"ha").lt(UserInfo::getAge,40)
.setSql("age = null");
// 将满足条件的记录密码都设置为8888
UserInfo userInfo = new UserInfo();
userInfo.setPassWord("8888");
// 开始修改,返回影响的记录数
int i = userInfoMapper.update(userInfo, updateWrapper);
- 上面每次编写完构造语句后都要将对象传递给 mapper 的 update 方法,比较麻烦,MyBatis Plus 提供了函数式编程方式:
boolean success = new LambdaUpdateChainWrapper<>(userInfoMapper)
.like(UserInfo::getUserName,"ha")
.lt(UserInfo::getAge,40)
.set(UserInfo::getPassWord, "8888")
.set(UserInfo::getAge, null)
.update();
/*********** 二者可以结合使用的,下面效果等效于上面的 ****************/
UserInfo userInfo = new UserInfo();
userInfo.setPassWord("8888");
boolean success = new LambdaUpdateChainWrapper<>(userInfoMapper)
.like(UserInfo::getUserName,"ha")
.lt(UserInfo::getAge,40)
.set(UserInfo::getAge, null)
.update(userInfo);
- 下面是结合 setSql 使用:
boolean success = new LambdaUpdateChainWrapper<>(userInfoMapper)
.like(UserInfo::getUserName,"ha")
.lt(UserInfo::getAge,40)
.setSql("pass_word = '8888'")
.setSql("age = null")
.update();
/*********** 二者可以结合使用的,下面效果等效于上面的 ****************/
UserInfo userInfo = new UserInfo();
userInfo.setPassWord("8888");
boolean success = new LambdaUpdateChainWrapper<>(userInfoMapper)
.like(UserInfo::getUserName,"ha")
.lt(UserInfo::getAge,40)
.setSql("age = null")
.update(userInfo);
--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------
--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------