[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| Insert | v. | /ɪnˈsɜːt/ | 插入(insert 方法向表中插入一行数据) |
| Delete | v. | /dɪˈliːt/ | 删除(deleteById 按主键删除) |
| Update | v. | /ˌʌpˈdeɪt/ | 更新(updateById 按主键更新) |
| Select | v. | /sɪˈlekt/ | 查询(selectList 查询列表,selectOne 查询单个) |
| Count | n. | /kaʊnt/ | 计数(selectCount 统计满足条件的记录数量) |
Lecture04-BaseMapper-增删改查
一、说明
Mapper 接口继承 BaseMapper<T> 后,框架为它提供了几十个内置方法,覆盖单表增删改查的所有常见场景。本章讲解最常用的方法,学完这些,日常 80% 的单表操作都不需要写 SQL。
二、方法总览
| 分类 | 方法 | 作用 | 返回值 |
|---|---|---|---|
| 新增 | insert(T entity) | 插入一条记录,主键自动回填 | int(影响行数) |
| 删除 | deleteById(id) | 按主键删除 | int |
| 删除 | deleteBatchIds(ids) | 按主键批量删除 | int |
| 删除 | delete(wrapper) | 按条件删除 | int |
| 修改 | updateById(entity) | 按主键更新(null 字段不更新) | int |
| 修改 | update(entity, wrapper) | 按条件更新 | int |
| 查询 | selectById(id) | 按主键查一个 | T |
| 查询 | selectBatchIds(ids) | 按主键批量查 | List<T> |
| 查询 | selectList(wrapper) | 按条件查列表 | List<T> |
| 查询 | selectOne(wrapper) | 按条件查一个 | T |
| 查询 | selectCount(wrapper) | 按条件统计数量 | Long |
| 查询 | selectMaps(wrapper) | 按条件查列表,结果为 Map | List<Map<String,Object>> |
| 查询 | exists(wrapper) | 判断是否存在满足条件的记录 | boolean |
表中 wrapper 即条件构造器(第 5、6 章),本章演示时传
null表示不带条件。
三、新增:insert
1、代码
@Test
public void testInsert() {
// 创建一个实体对象,注意:主键 empId 不赋值,交给数据库自增
Employee employee = new Employee();
employee.setEmpNo("No.10005");
employee.setEmpName("钱七");
employee.setEmpSalary(new BigDecimal("9500.00"));
employee.setEmpBirthday(new Date());
employee.setPhoneNum("13511110005");
employee.setDeptId(2);
// 执行插入
int rows = employeeMapper.insert(employee);
System.out.println("rows = " + rows);
// 重点:插入后主键被自动回填
System.out.println("回填的主键 empId = " + employee.getEmpId());
}
2、控制台日志
==> Preparing: INSERT INTO t_emp ( emp_no, emp_name, emp_salary, emp_birthday, phone_num, dept_id ) VALUES ( ?, ?, ?, ?, ?, ? )
==> Parameters: No.10005(String), 钱七(String), 9500.00(BigDecimal), ..., 2(Integer)
<== Updates: 1
3、要点
- 框架生成的 INSERT 不包含主键列(因为自增)
empId为 null 的属性(主键)不参与插入- 插入成功后,主键值自动回填到实体对象中:
employee.getEmpId()能拿到新主键,后续业务(比如和子表关联)直接使用
四、删除:delete 系列
1、按主键删除
@Test
public void testDeleteById() {
int rows = employeeMapper.deleteById(5); // 删除 emp_id=5 的记录
System.out.println("rows = " + rows);
}
==> Preparing: DELETE FROM t_emp WHERE emp_id=?
==> Parameters: 5(Integer)
<== Updates: 1
2、按主键批量删除
@Test
public void testDeleteBatchIds() {
List<Integer> idList = Arrays.asList(5, 6, 7);
int rows = employeeMapper.deleteBatchIds(idList);
System.out.println("rows = " + rows);
}
==> Preparing: DELETE FROM t_emp WHERE emp_id IN ( ? , ? , ? )
==> Parameters: 5(Integer), 6(Integer), 7(Integer)
3、按条件删除
条件删除需要条件构造器,先看示例,细节下一章学:
需要导入:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@Test
public void testDeleteByWrapper() {
// 删除 dept_id=2 的员工(第 5 章学完 QueryWrapper 后回来复习)
int rows = employeeMapper.delete(new QueryWrapper<Employee>().eq("dept_id", 2));
System.out.println("rows = " + rows);
}
五、修改:updateById
1、代码
@Test
public void testUpdateById() {
Employee employee = new Employee();
employee.setEmpId(7);
employee.setEmpName("AAAAAAAA");
employee.setEmpSalary(new BigDecimal(99999.99));
int effectedRows = employeeMapper.updateById(employee);
System.out.println("effectedRows = " + effectedRows);
}
2、控制台日志
==> Preparing: UPDATE t_emp SET emp_name=?, emp_salary=? WHERE emp_id=?
==> Parameters: AAAAAAAA(String), 99999.990000000005238689482212066650390625(BigDecimal), 7(Integer)
<== Updates: 1
3、要点
updateById 以实体非 null 的属性作为 SET 内容,按主键作为 WHERE 条件
六、查询:select 系列
1、按主键查询
@Test
public void testSelectById() {
Employee employee = employeeMapper.selectById(1);
System.out.println("employee = " + employee);
}
==> Preparing: SELECT emp_id,emp_no,emp_name,emp_salary,emp_birthday,phone_num,dept_id FROM t_emp WHERE emp_id=?
2、查询列表(本章先传 null)
@Test
public void testSelectList() {
List<Employee> employeeList = employeeMapper.selectList(null);
employeeList.forEach(System.out::println);
}
3、按主键批量查询
@Test
public void testSelectBatchIds() {
List<Employee> employeeList = employeeMapper.selectBatchIds(Arrays.asList(1, 2, 3));
employeeList.forEach(System.out::println);
}
==> Preparing: SELECT emp_id,emp_no,emp_name,emp_salary,emp_birthday,phone_num,dept_id FROM t_emp WHERE emp_id IN ( ? , ? , ? )
4、统计数量
@Test
public void testSelectCount() {
Long count = employeeMapper.selectCount(null); // 统计全部记录数
System.out.println("count = " + count);
}
==> Preparing: SELECT COUNT(*) FROM t_emp
注意:3.5.x 版本
selectCount返回类型是 Long(旧版本是 Integer),别用错类型。
5、查询单个对象
@Test
public void testSelectOne() {
// 按编号精确查询一个(条件构造器下一章学)
Employee employee = employeeMapper.selectOne(
new QueryWrapper<Employee>().eq("emp_no", "No.10001"));
System.out.println("employee = " + employee);
}
同样需要
QueryWrapper的 import,见「三、按条件删除」处提示。
注意:
selectOne要求查询结果最多一条;如果查到多条会抛异常。适合按唯一字段(如编号)查询。
6、查询为 Map(不常用,了解即可)
@Test
public void testSelectMaps() {
List<Map<String, Object>> mapList = employeeMapper.selectMaps(null);
System.out.println("mapList = " + mapList);
}
返回的是「列名 → 值」的 Map,适合没有对应实体类的临时查询。
七、本章小结
- 继承
BaseMapper<T>后:insert/deleteById/updateById/selectById/selectList/selectCount直接可用 - 增删改方法返回
int(影响行数),可以用来判断是否成功 - 插入后主键自动回填,更新时 null 字段不更新
- 查询方法传
null表示无条件;传条件构造器可以实现精确查询
下一章学习条件构造器 QueryWrapper,让查询真正"活"起来。