springboot项目中mybatis-plus的使用
一,创建项目
1.准备数据库数据,创建表
# 创建数据库
create database if not exists student;
#建表
use student;
create table if not exists stu_message(
id int auto_increment primary key comment 'id',
name varchar(10) comment '姓名',
gender varchar(1) comment '性别',
age int check ( age>0 && age <=120 ) comment '年龄',
id_delete int default 0
)comment '学生信息表';
insert into stu_message (id, name, gender, age)
values (1,'张三','男',26),(2,'李四','男',20),('3','王梓涵','女',20),(4,'jerry','女',18);
2.创建maven项目并引入需要的坐标
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<mybatisPlus.version>3.5.4</mybatisPlus.version>
<druid.version>1.2.1</druid.version>
<mysql.version>8.0.32</mysql.version>
<junit.version>5.9.3</junit.version>
<springboot.version>3.1.0</springboot.version>
<lombok.version>1.8.32</lombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${springboot.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisPlus.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${springboot.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
</dependency>
</dependencies>
3.编写配置文件
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/student
username: 账号
password: 密码
server:
port: 8080
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4.创建启动类
启动类创建后,启动类所在的包以及子包都是可以被扫描到的
@SpringBootApplication
public class mybatisPlusBootApplication {
public static void main(String[] args) {
SpringApplication.run(mybatisPlusBootApplication.class,args);
}
}
5.编写实体类,并创建接口继承BaseMapper
@Data
@Builder
@TableName("stu_message")
public class Student {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField("name")
private String name;
@TableField("gender")
private String gender;
@TableField("age")
@OrderBy(asc = true,sort = 10)
private Integer age;
@TableLogic
@TableField("id_delete")
private Integer is_delete;
}
必须使用@Mapper注解
作用:标识该接口是 MyBatis 的映射器接口,以便 MyBatis-Plus 能够扫描到并自动实现接口的方法,无需手动编写 XML 文件或者实现类。
@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}
6.编写测试类
这个测试类需要位于启动类所在包或子包里面,才可以正常注入对象。
@SpringBootTest
public class testMapper {
@Autowired
private StudentMapper studentMapper;
}
二, 实体类使用注解讲解
@TableName
该注解用于指定实体类对应的数据库表名。当实体类名与数据库表名不一致,或者实体类名不是数据库表名的驼峰写法时,您需要使用这个注解来明确指定表名。
@TableId
该注解用于标记实体类中的主键字段。如果你的主键字段名为 id,你可以省略这个注解。
@TableId(value = "id",type = IdType.AUTO)
value作用:指定数据库表的主键字段名。如果不设置,MyBatis-Plus 将使用实体类中的字段名作为数据库表的主键字段名。
type:指定主键生成策略
IdType 枚举类型定义
IdType.AUTO:使用数据库自增 ID 作为主键。使用这个需要先将数据库表字段设置成主键,自增。
IdType.NONE:无特定生成策略,如果全局配置中有 IdType 相关的配置,则会跟随全局配置。默认是这个
IdType.INPUT:在插入数据前,由用户自行设置主键值。
IdType.ASSIGN_ID:自动分配 ID,适用于 Long、Integer、String 类型的主键。默认使用雪花算法通过 IdentifierGenerator 的 nextId 实现。@since 3.3.0
IdType.ASSIGN_UUID:自动分配 UUID,适用于 String 类型的主键。默认实现为 IdentifierGenerator 的 nextUUID 方法。
@TableField
该注解用于标记实体类中的非主键字段,它告诉 MyBatis-Plus 如何映射实体类字段到数据库表字段。如果你的实体类字段名遵循驼峰命名规则,并且与数据库表字段名一致,你可以省略这个注解。
@TableLogic
该注解用于标记实体类中的字段作为逻辑删除字段。逻辑删除是一种数据管理策略,它不是真正地从数据库中删除记录,而是在记录中标记该记录为已删除状态。通过使用@TableLogic注解,MyBatis-Plus 可以在查询、更新和删除操作中自动处理逻辑删除字段的值。
逻辑删除:在数据库中标记该记录为已删除状态
物理删除:真正地从数据库中删除记录
@OrderBy
该注解用于指定实体类中的字段在执行查询操作时的默认排序方式。通过在实体类字段上使用@OrderBy注解,可以确保在执行查询时,如果没有显式指定排序条件,MyBatis-Plus 将按照注解中定义的排序规则返回结果。
@OrderBy(asc = true,sort = 10)
@OrderBy注解的asc属性用于指定排序是否为升序,如果设置为true,则表示升序排序;如果设置为false,则表示降序排序。sort属性用于指定排序规则的优先级,数字越小,优先级越高,即越先被应用。
三,功能测试
查询所有
@Test
public void findAll(){
List<Student> students = studentMapper.selectList(null);
System.out.println(students);
}
不使用@TableLogic,sql语句条件会有变化
修改
将id=3的学生的年龄修改成18岁
@Test
public void update(){
// 跟据id获取学生
Student student = studentMapper.selectById(3);
// 设置修改内容
student.setAge(20);
// 调用方法实现修改
int update = studentMapper.updateById(student);
System.out.println(update);
}
添加
@Test
public void add(){
Student student = Student.builder()
.name("王子涵")
.age(21)
.gender("女")
.build();
int insert = studentMapper.insert(student);
System.out.println(insert);
}
删除
@Test
public void delete(){
int i = studentMapper.deleteById(4);
System.out.println(i);
}
批量删除
@Test
public void deleteList(){
int i = studentMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
System.out.println(i);
}
条件构造器
使用步骤
- 使用条件构造器
- 设置条件
- 调用方法执行
查询
查询所有年龄大于20岁,并且性别为女的学生。
@Test
public void find(){
// 创建条件构造器
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
// 设置条件
queryWrapper.eq("gender","女");
queryWrapper.gt("age",20);
// 调用方法
List<Student> students = studentMapper.selectList(queryWrapper);
System.out.println(students);
}
修改
将张三的年龄修改为22
@Test
public void updateByName(){
// 创建条件构造器
UpdateWrapper<Student> updateWrapper = new UpdateWrapper<>();
// 设置修改内容
updateWrapper.set("age",22);
// 设置条件
updateWrapper.eq("name", "张三");
// 调用方法执行
int update = studentMapper.update(updateWrapper);
System.out.println(update);
}
删除
逻辑删除张三的信息
@Test
public void delete(){
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name","张三");
int delete = studentMapper.delete(queryWrapper);
System.out.println(delete);
}
物理删除,不使用@TableLogic