目录
前言
这篇文章主要来学习MyBatis-Plus这个非常强大的框架.
在学习MyBatis-Plus之前,需要有MyBatis的学习基础.因为MyBatis -Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
这里提到的简化开发,提高效率主要是MyBatis-Plus为我们省去了很多的SQL的操作.也就是说我们在项目中可以将更多的精力放在业务上,而不是SQL语句上,
这也为很多的不喜欢写SQL的人提供了很好的便利.
特性
只做增强不做改变,引入它不会对现有工程产生影响,启动即会自动注入基本 CURD,性能基本无损耗,内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求,通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错. 更对特性请移步官网: MyBatis-Plus 🚀 为简化开发而生
MyBatis-Plus入门案例
MyBatis -Plus的使用非常简单,只要你属性springboot,你就能非常轻松的使用它.
在使用之前我们需要创建一个springboot项目. 关于springboot项目创建这里再不过多赘述.
在项目创建好,因为MyBatis -Plus主要是对数据库进行操作,所以我们需要引入数据库驱动,配置数据源等操作.关于这个操作这里也不过多赘述
在一切准备工作就绪之后,我们就需要在我们的项目中引入MyBatis -Plus的依赖了.
XML
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.5.7</version>
</dependency>
然后我们需要执行我们的SQL语句.来创建对应的表结构.
sql
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户主键',
`username` varchar(255) DEFAULT NULL COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '用户密码',
`email` varchar(255) DEFAULT NULL COMMENT '用户邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
创建实体类.
java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private Long userId; // 用户ID
private String username;
private String password;
private String email;
}
实体类和sql创建好了之后,我们还需要创建mapper接口.
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
可以看到我们的mapper接口中,我们是继承了BaseMapper类,并设置泛型为我们的实体类.
接下来我们就可以对UserMapper接口进行测试,测试mybatis-plus给我们提供的API.
需要注意的是.需要在启动类上添加MapperScan注解,标明mapper包的位置
java
@SpringBootApplication
@MapperScan("com.example.mybatisplus.mapper")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
接下来我们就可以进行测试
-
创建springboot的测试类
-
注入UserMapper
-
使用MyBatis-Plus提供的API
java
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testUser() {
// 这个方法表示查询所有
List<User> users = userMapper.selectList(null);
System.out.println(users);
}
}
点击运行之后,就会出现
这样的错误,这是因为我们的实体类和数据库中表名不一致导致的,mybatis-plus默认会把我们的实体类的名称当做数据库中表名进行操作,如何解决这个问题呢?
1. 在实体类上使用注解
可以在实体类上使用@TableName这个注解 这个注解的作用就是指定表明,在实体类上加,表示映射的表名
同时可以使用@TableId, 这个注解的作用就是指定主键的字段,在userId字段上添加这个注解,并设置value的值为id,说明此字段在数据库中映射为主键,主键字段为id
java
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_user")
public class User implements Serializable {
@TableId(value = "id") // 主键
private Long userId; // 用户ID
private String username;
private String password;
private String email;
}
添加这个注解之后,我们在运行测试方法
可以看到能够正确的从数据库表中查询中所有的数据
- 在配置文件中统一配置表前缀
XML
# mybatis-plus配置
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.type-aliases-package=com.example.mybatisplus.model
# 打印sql
mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl
# 设置表名前缀 SYS_
mybatis-plus.global-config.db-config.table-prefix= SYS_
当我们在配置文件中配置表前缀之后,实体类上@TableName注解就可以去掉了,但是需要注意的是,当在配置文件中配置之后,后续的数据库表名的前缀就都应该与我们配置的前缀相同.
现在再次运行测试方法:
在控制台中同时也打印出来了执行的sql,说明我们的配置是生效了.
我们再进行一次插入操作:
java
@Test
public void testInsert() {
User user = new User();
user.setUsername("ccccccccc");
user.setEmail("ccccccccc@qq.com");
int insert = userMapper.insert(user); // 插入一条记录
System.out.println(insert);
}
这里可以看到mybatis-plus插入的值,但是大家发现主键id的值是不是不正常
这是因为mybatis-plus默认使用的主键策略是雪花算法。雪花算法 (Snowflake) 是 Twitter 开发的一种分布式 ID 生成算法,用于在分布式系统中生成唯一的 64 位整数 ID。雪花算法生成的 ID 不仅具有全局唯一性,还能够根据时间顺序生成有序的 ID,这对于需要高并发和分布式环境的系统非常有用。但是对于我们目前来说用不到,那么我们就不能再使用雪花算法了,而是使用数据库自己的主键生成策略.
@TableId(value = "id",type = IdType.AUTO) // 主键 ID 自增
在主键的字段上面的TableId注解上,添加type,如上所示. 就能将注解的生成策略设置为数据库的自增主键,然后我们再次运行插入的测试方法:
可以看到在插入的时候,mybatis-plus不会使用雪花算法来计算主键并一起插入了. 现在主键就是使用的我们数据库的自动递增的策略.
可以看到,刚才插入的主键的值比之前的主键刚好递增一次.这里需要说明,现在的主键并没有使用雪花算法,那为什么值还是如此大,原因就是上次在插入时使用的时雪花算法,并且给我们生成了一个id,并且插入,那么这次在插入的时候,我们使用的数据库的自动递增策略,自动递增就是在上一个注解的基础之后+1.
常用注解
目前我们已经介绍了两个注解,分别是@TableName和@TableId
这里对这些注解做个整体说明:
@TableName 指定表明,在实体类上加,表示映射的表名
@TableId 在属性上添加,将这个数据对应的字段设置为主键,@TableId() 的value属性,用于指定主键的字段,@TableId() 的type属性,type表示主键生成的策略,id使用默认的为雪花算法,
@TableField(" ") // 指定这个字段所对应的数据库中的字段名
java
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_user")
public class User implements Serializable {
@TableId(value = "id",type = IdType.AUTO) // 主键 ID 自增
private Long userId; // 用户ID
@TableField("username")
private String name;
private String password;
private String email;
}
@TableLogic 在某个字段上添加这个注解,表示这个字段表示逻辑删除
演示这个注解我们需要重新设置表结构,添加is_delete字段,0表示正常,1表示删除
sql
alter table sys_user add COLUMN is_delete int
在表中添加一个字段,用户表示使用删除.
修改实体类:
java
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sys_user")
public class User implements Serializable {
@TableId(value = "id",type = IdType.AUTO) // 主键 ID 自增
private Long userId; // 用户ID
@TableField("username")
private String name;
private String password;
private String email;
@TableLogic // 逻辑删除 字段 0 未删除 1 已删除
private int isDelete;
}
需要注意的是,数据库中的字段为is_delete,而在实体类中字段为isDelete,两个字段的名称不一致,但是也没有添加tableField注解,这是因为字段名称的映射有默认规则,它会根据驼峰命名法自动将Java类的属性名映射到数据库中的字段名。因此,即使没有使用
@TableField
注解,MyBatis-Plus 仍然能够将isDelete
映射到is_delete
。
MyBatis-Plus 默认遵循的映射规则是将 Java 类中的驼峰命名属性名转换为下划线分隔的小写字段名。例如,isDelete
会自动映射到 is_delete
。
我们进行查询测试:
查询测试:
可以看到在查询的时候,后面添加了一个规则,where is_delete=0,这就是我们在进行逻辑删除的字段.
插入测试:
小结
mybatis-plus的基本使用是非常简单的,总体来说分为以及步骤:
-
创建springboot项目,引入mybatis-plus依赖
-
创建数据库和实体类
-
创建mapper接口,并继承BaseMapper类
这篇文章主要介绍mybatis-plus的入门基本使用,下篇文章将进行mybatis-plus的后续部分.包括在项目中的使用以及其他特性.