首页 > 数据库 >MyBatisPlus 实现数据库 CURD 操作

MyBatisPlus 实现数据库 CURD 操作

时间:2024-07-10 10:54:44浏览次数:17  
标签:MyBatisPlus String 数据库 private Employee CURD emp employee Param

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("[email protected]");
    employeeMapper.insert(employee);
}

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

==>  Preparing: INSERT INTO employee ( emp_id, name, emp_gender, age, email ) VALUES ( ?, ?, ?, ?, ? )
==> Parameters: 100000(Long), 刘龙(String), 男(String), 25(Integer), [email protected](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("[email protected]");
    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), [email protected](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("[email protected]");
    employeeMapper.updateById(employee);
}

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

==>  Preparing: UPDATE employee SET name=?, emp_gender=?, age=?, email=? WHERE emp_id=?
==> Parameters: 刘龙(String), 女(String), 23(Integer), [email protected](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("[email protected]");
    employeeMapper.update(employee2,new UpdateWrapper<Employee>().eq("name","刘龙"));
}

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

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

==>  Preparing: UPDATE employee SET emp_gender=?, age=?, email=? WHERE (name = ?)
==> Parameters: 男(String), 18(Integer), [email protected](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, [email protected]
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3bb8aabc]
Employee(empId=1367717669156028419, name=刘龙, empGender=男, age=18, [email protected])
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, [email protected]
<==        Row: 1367717669156028419, 刘龙, 男, 18, [email protected]
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@29a4f594]
Employee(empId=1367717669156028418, name=何雨柱, empGender=男, age=23, [email protected])
Employee(empId=1367717669156028419, name=刘龙, empGender=男, age=18, [email protected])
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, [email protected]
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7c3ebc6b]
Employee(empId=1367717669156028418, name=何雨柱, empGender=男, age=23, [email protected])

删除数据

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;
}

标签:MyBatisPlus,String,数据库,private,Employee,CURD,emp,employee,Param
From: https://www.cnblogs.com/binbingg/p/18293469

相关文章

  • MySQL导入数据库报错#1118 - Row size too large ( 8126). 的解决方法
    导入SQL文件时报错(在执行创建表或者增加字段时,发现rowsize长度过长,会导致出现以下错误)[ERR]1118-Rowsizetoolarge(>8126).ChangingsomecolumnstoTEXTorBLOBorusingROW_FORMAT=DYNAMICorROW_FORMAT=COMPRESSEDmayhelp.Incurrentrowformat,BLOBprefix......
  • 20240709(byte数据转换、字典数据选择性保留、选择性查询数据库)
    需要补的知识:​ 1.HTTP协议,url里,那些header、body里都是啥东西报错信息:"服务异常'bytes'objecthasnoattribute'get'"错误原因:​ http传输中,GET方法传入的是byte格式的数据,没有.get方法#假设你有一个包含JSON数据的字节字符串json_bytes=b'{"name":"John",&quo......
  • oracle数据库状态监控
    1、功能介绍  1、检查oracle数据库的运行状态  2、第一次失败后,等待5秒钟再次检查一次2、脚本#!/bin/bashsource/etc/profileexportNLS_LANG=AMERICAN_AMERICA.AL32UTF8w=$(cd$(dirname$0);pwd)#检查数据库的方法fun(){result=$(sqlplus-s${user}/${p......
  • SpringBoot 整合 MyBatisPlus框架入门
    步骤1:创建maven工程创建一个空Maven工程,如下:步骤2:pom.xml文件中添加MyBatisPlus相关依赖<dependencies><!--mybatispulus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter&l......
  • Crontab定时任务更新SOLO以及备份数据库
    Linux定时执行任务Crontab1.安装Crontab1.1安装命令#vixie-cron软件包是cron的主程序yuminstallvixie-cron#crontabs软件包是用来安装、卸装、或列举用来驱动cron守护进程的表格的程序yuminstallcrontabs1.2启动命令#启动服务/sbin/servicecrondstar......
  • 使用Spring Data JPA进行数据库访问
    使用SpringDataJPA进行数据库访问大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!SpringDataJPA是Spring提供的一种数据访问抽象框架,能够极大地简化数据库操作。通过SpringDataJPA,我们可以轻松地实现增删改查等数据库操作,而无需编写大量的样板代......
  • idea springboot 如何支持数据库配置 redis配置 支持不同环境(uat验证环境、测试环境)切
    在SpringBoot中,可以通过配置文件来支持数据库和Redis的配置,并支持不同环境的切换。以下是一些常用的方法:创建配置文件:在src/main/resources目录下创建以下配置文件:application.properties:通用配置文件application-uat.properties:uat验证环境配置文件application-test.prope......
  • python web框架如何处理与数据库的交互
    pythonweb框架如何处理与数据库的交互1.ORM在python中通过关系映射(orm),调用底层dbapi来实现数据库的操作。通过定义类和对象,(类是表,类的对象是数据库的一行数据。)来操作数据库,通过底层的转换,最终形成sql,在相应的数据库中执行。对象关系映射(英语:ObjectRelationMapping,简称O......
  • Java项目:基于SSM框架实现的中小型企业财务管理系统【ssm+B/S架构+源码+数据库+答辩PPT
    一、项目简介本项目是一套基于SSM框架实现的中小型企业财务管理系统包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。项目都经过严格调试,eclipse或者idea确保可以运行!该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值二......
  • Java项目:基于SSM框架实现的农家乐信息管理平台含前后台【ssm+B/S架构+源码+数据库+答
    一、项目简介本项目是一套基于SSM框架实现的农家乐信息管理平台包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。项目都经过严格调试,eclipse或者idea确保可以运行!该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值二、技......