MyBatisPlus 实现数据库 CURD 操作

BaseMapper 接口方法介绍

BaseMapper 中提供了 CRUD 方法,具体方法如下:

复制代码
// 插入一条记录
int insert(T entity);
 
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
 
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
 
// 根据 ID 删除
int deleteById(Serializable id);
 
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
 
// 根据 whereEntity 条件,更新记录
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
 
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
 
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page,
@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

插入数据

insert 方法
复制代码
//插入一条记录
int insert (T entity);

在 MybatisPlusTests.java 测试类中增加 testInsert 测试方法,如下:

复制代码
@Test
@DisplayName("insert 方法插入数据")
public void testInsert() {
    Employee employee=new Employee();
    employee.setEmpId(100000);
    employee.setName("刘龙");
    employee.setEmpGender("男");
    employee.setAge(25);
    employee.setEmail("liulong@163.com");
    employeeMapper.insert(employee);
}

执行 testInsert 测试方法插入数据,结果如下:

复制代码
==>  Preparing: INSERT INTO employee ( emp_id, name, emp_gender, age, email ) VALUES ( ?, ?, ?, ?, ? )
==> Parameters: 100000(Long), 刘龙(String), 男(String), 25(Integer), liulong@163.com(String)
<==    Updates: 1

插入成功,测试OK~

由于数据库表中主键字段设置为自增ID,应该不需要employee.setEmpId(100000) 设置 empId,所以将其注释,如下:

复制代码
@Test
@DisplayName("insert 方法插入数据")
public void testInsert() {
    Employee employee=new Employee();
    //employee.setEmpId(100000);
    employee.setName("刘龙");
    employee.setEmpGender("男");
    employee.setAge(25);
    employee.setEmail("liulong@163.com");
    employeeMapper.insert(employee);
}

再次执行 testInsert 测试方法插入数据,结果如下:

插入失败,异常信息是说 empId 属性没有设置默认值,这是怎么回事呀,数据库表中不是已经设置了自增主键,为何这里还报错呀?

原因是我们的定义的 Employee 数据模型类并不知道数据表的主键字段是自增主键,所以需要告诉它一下。怎么告诉,使用 @TableId 注解

@TableId注解

描述:主键注解

IdType 属性

描述
Auto 数据库ID自增
None 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于Input)
Input Insert前自行set主键值
ASSIGN_ID 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator 的方法 nextId (默认实现类为DefaultIdentifierGenerator 雪花算法)
ASSIGN_UUI 分配UUID,主键类型为String(since 3.3.0),使用接口 IdentifierGenerator 的方法 nextUUID (默认default方法)

修改 Employee.java 如下:

复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
    public class Employee {
    @TableId(type = IdType.AUTO) //设置自增主键
    private Long empId;
    private String name;
    private String empGender;
    private Integer age;
    private String email;
}

再次执行 testInsert 测试方法插入数据,结果如下:

复制代码
==>  Preparing: INSERT INTO employee ( name, emp_gender, age, email ) VALUES ( ?, ?, ?, ? )
==> Parameters: 刘龙(String), 男(String), 25(Integer), liulong@163.com(String)
<==    Updates: 1

插入成功,测试OK~

更新数据

updateById 方法

根据 id 进行记录更新,如果对象属性未传值,则不会更新该字段,保持数据库表原来字段值

复制代码
@Test
@DisplayName("updateById 方法更新数据")
public void testUpdateById() {
    Employee employee=new Employee();
    employee.setEmpId(1367717669156028419L);
    employee.setName("刘龙");
    employee.setEmpGender("女");
    employee.setAge(23);
    employee.setEmail("liulong@163.com");
    employeeMapper.updateById(employee);
}

执行 testUpdateById 测试方法更新数据,结果如下:

复制代码
==>  Preparing: UPDATE employee SET name=?, emp_gender=?, age=?, email=? WHERE emp_id=?
==> Parameters: 刘龙(String), 女(String), 23(Integer), liulong@163.com(String), 1367717669156028419(Long)
<==    Updates: 1
update(entity,wrapper)方法

根据数据模型的属性进行记录更新,如果对象属性未传值,则不会更新该字段,保持数据库表原来字段值

复制代码
@Test
@DisplayName("update 方法更新数据")
public void testUpdate(){
    //根据员工的名字,更新
    Employee employee = new Employee();
    employee.setEmpGender("男");
    employee.setAge(18);
    employee.setEmail("liulong@126.com");
    employeeMapper.update(employee2,new UpdateWrapper<Employee>().eq("name","刘龙"));
}

注意:UpdateWrapper 类用于设置更新条件

执行 testUpdate 测试方法更新数据,结果如下:

复制代码
==>  Preparing: UPDATE employee SET emp_gender=?, age=?, email=? WHERE (name = ?)
==> Parameters: 男(String), 18(Integer), liulong@126.com(String), 刘龙(String)
<==    Updates: 1

查询数据

selectById 方法

根据 id 查询指定记录

复制代码
@Test
@DisplayName("selectById 方法根据ID查询数据")
public void testSelectById() {
    Employee employee=employeeMapper.selectById(1367717669156028419L);
    System.out.println(employee);
}

执行 testSelectById测试方法更新数据,结果如下:

复制代码
==>  Preparing: SELECT emp_id,name,emp_gender,age,email FROM employee WHERE emp_id=?
==> Parameters: 1367717669156028419(Long)
<==    Columns: emp_id, name, emp_gender, age, email
<==        Row: 1367717669156028419, 刘龙, 男, 18, liulong@126.com
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3bb8aabc]
Employee(empId=1367717669156028419, name=刘龙, empGender=男, age=18, email=liulong@126.com)
selectBatchIds方法

批量查询指多个id的记录集合

复制代码
@Test
@DisplayName("selectBatchIds 方法根据批量 ID 查询数据")
public void testSelectBatchIds() {
    List list= Arrays.asList(1367717669156028419L,1367717669156028418L);
    List<Employee> employeeList = employeeMapper.selectBatchIds(list);
    employeeList.forEach(System.out::println);
}

执行 testSelectBatchIds 测试方法更新数据,结果如下:

复制代码
Preparing: SELECT emp_id,name,emp_gender,age,email FROM employee WHERE emp_id IN ( ? , ? )
==> Parameters: 1367717669156028419(Long), 1367717669156028418(Long)
<==    Columns: emp_id, name, emp_gender, age, email
<==        Row: 1367717669156028418, 何雨柱, 男, 23, heyuzhu@126.com
<==        Row: 1367717669156028419, 刘龙, 男, 18, liulong@126.com
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@29a4f594]
Employee(empId=1367717669156028418, name=何雨柱, empGender=男, age=23, email=heyuzhu@126.com)
Employee(empId=1367717669156028419, name=刘龙, empGender=男, age=18, email=liulong@126.com)
selectByMap方法

根据Map集合中传入的条件进行查询,每个条件都是and关系

复制代码
@Test
@DisplayName("selectByMap 方法多条件查询数据")
public void testSelectByMap() {
    Map<String,Object> map=new HashMap<>();
    map.put("emp_gender","男");
    map.put("age",23);
    List<Employee> employeeList = employeeMapper.selectByMap(map);
    employeeList.forEach(System.out::println);
}

注意:map 结构用于存放多个查询条件,key 对应的是数据库字段名(不是数据模型属性名),value 对应查询条件

执行 selectByMap 测试方法更新数据,结果如下:

复制代码
==>  Preparing: SELECT emp_id,name,emp_gender,age,email FROM employee WHERE (emp_gender = ? AND age = ?)
==> Parameters: 男(String), 23(Integer)
<==    Columns: emp_id, name, emp_gender, age, email
<==        Row: 1367717669156028418, 何雨柱, 男, 23, heyuzhu@126.com
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7c3ebc6b]
Employee(empId=1367717669156028418, name=何雨柱, empGender=男, age=23, email=heyuzhu@126.com)

删除数据

deleteById方法

根据 id 删除记录

复制代码
@Test
@DisplayName("deleteById 根据ID删除数据")
public void testDeleteById(){
    int rows = employeeMapper.deleteById(1367717669156028419L);
    System.out.println("受影响的行数:"+rows);
}

执行 testDeleteById 测试方法更新数据,结果如下:

复制代码
==>  Preparing: DELETE FROM employee WHERE emp_id=?
==> Parameters: 1367717669156028419(Long)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@58294867]
受影响的行数:1
deleteByMap方法

根据 Map 中的条件进行删除,map中的条件在sql语句中是and关系

复制代码
@Test
@DisplayName("deleteByMap 方法多条件删除数据")
public void testDeleteByMap(){
    Map<String,Object> map=new HashMap<>();
    map.put("emp_gender","男");
    map.put("name","何雨柱");
    int rows = employeeMapper.deleteByMap(map);
    System.out.println("受影响的行数:"+rows);
}

执行 deleteByMap 测试方法更新数据,结果如下:

复制代码
==>  Preparing: DELETE FROM employee WHERE (name = ? AND emp_gender = ?)
==> Parameters: 何雨柱(String), 男(String)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7c3ebc6b]
受影响的行数:1

@TableName注解:表名注解

作用:当表名跟实体类类名不一致时,要使用@TableName注解进行映射

举例如下:

复制代码
@NoArgsConstructor
@AllArgsConstructor
@Data
@TableName(value = "tb_employee")
public class Employee {
    @TableId(type=IdType.AUTO)
    private Long empId;
    private String empName;
    private String empGender;
    private Integer age;
    private String email;
}

@TableField 字段注解(非主键)

作用:当表字段名跟实体类属性名不一致时,要使用 @TableField 注解进行映射

举例如下:

复制代码
@NoArgsConstructor
@AllArgsConstructor
@Data
@TableName(value = "tb_employee")
public class Employee {
    @TableId(type=IdType.AUTO)
    private Long empId;
    //当表中的列与实体类属性不一致时,使用TableField指定数据库中的列名
    @TableField(value = "emp_name")
    private String name;
    private String empGender;
    private Integer age;
    private String email;
    //当表中没有remark时,使用TableField的exist=false属性忽略该字段
    @TableField(exist = false)
    private String remark;
}
posted @   Binge-和时间做朋友  阅读(135)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示