Lecture04-BaseMapper-增删改查

文章目录

    [toc]

    单词词性音标含义
    Insertv./ɪnˈsɜːt/插入(insert 方法向表中插入一行数据)
    Deletev./dɪˈliːt/删除(deleteById 按主键删除)
    Updatev./ˌʌpˈdeɪt/更新(updateById 按主键更新)
    Selectv./sɪˈlekt/查询(selectList 查询列表,selectOne 查询单个)
    Countn./kaʊnt/计数(selectCount 统计满足条件的记录数量)

    Lecture04-BaseMapper-增删改查

    一、说明

    Mapper 接口继承 BaseMapper<T> 后,框架为它提供了几十个内置方法,覆盖单表增删改查的所有常见场景。本章讲解最常用的方法,学完这些,日常 80% 的单表操作都不需要写 SQL。


    二、方法总览

    BaseMapper 内置方法家族

    分类方法作用返回值
    新增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)按条件查列表,结果为 MapList<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,让查询真正"活"起来。

    end