Mybatis(14)Mybatis-Plus入门 & 简单使用
文章目录
- [Mybatis(14)Mybatis-Plus入门 & 简单使用](#Mybatis(14)Mybatis-Plus入门 & 简单使用)
- [1. Mybatis-plus 快速上手](#1. Mybatis-plus 快速上手)
- [2. 注意事项:](#2. 注意事项:)
-
- [一、使用 MP,主键自增问题](#一、使用 MP,主键自增问题)
- 二、MP内置命名规范(重要:star::star::star:):
-
- [Java实体类的 类名 命名不规范:](#Java实体类的 类名 命名不规范:)
- [Java实体类的 属性命名不规范:](#Java实体类的 属性命名不规范:)
- [3. Mybatis-plus 打印日志](#3. Mybatis-plus 打印日志)
- [4. 总结](#4. 总结)
观前提醒:
如果你是第一次点击这篇博客,需要你回看Mybatis-plus系列的这个博客:
Mybatis(13)MyBatis Generator(xml生成器)& Mybatis-Plus初识
这篇博客的代码,都是需要自己敲一下的。
建议你看着我说的知识点,自己尝试一下,创建 Springboot项目,使用 Mybatis-plus 框架,访问数据库。
这里使用的数据库是 MySQL。
图形化工具:Navicat
sql文件获取:https://gitee.com/mrbgvhbhjv/java-ee-course

1. Mybatis-plus 快速上手
Mybatis-Plus操作数据库的步骤:
- 准备工作(数据准备, 项目准备, 引入依赖, 配置数据库连接信息)
- 编码(数据库表对应的实体类, 以及数据操作的Mapper接口)
- 测试
下面,有些情况,我就把 Mybatis-Plus 称为 MP 了。
1.1 准备工作:
新创建一个数据库表,user_info表:
sql
-- 创建表[⽤户表]
DROP TABLE IF EXISTS user_info;
CREATE TABLE `user_info` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`username` VARCHAR ( 127 ) NOT NULL,
`password` VARCHAR ( 127 ) NOT NULL,
`age` TINYINT ( 4 ) NOT NULL,
`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
`phone` VARCHAR ( 15 ) DEFAULT NULL,
`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
-- 添加⽤户信息
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.user_info( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
1.1.1 创建项目,引入依赖:
创建一个新的 springboot项目。
然后在 pom文件中,引入 springboot对应版本的依赖,这里以 spring boot3 为例:
依赖:
xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.14</version>
</dependency>
还需要根据目前的数据库,引入对应的依赖驱动:
这里以 MySQL 为例:
xml
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
引入 MP 的依赖之后,Mybatis 的依赖,也会一起引入进来的。
所以,后续,你引入 MP的依赖,就可以了,不用再引入 Mybatis 的依赖了。
Mybatis-Plus 的操作,也比 Mybatis 的操作,要方便的多。
1.1.2 添加配置文件,连接数据库
添加的配置文件,我们以 yml配置文件 为例:
yaml
spring:
application:
name:
# 数据库连接配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test characterEncoding=utf8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# 配置打印 MyBatis⽇志
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#配置驼峰⾃动转换
map-underscore-to-camel-case: true
# XML文件映射
mapper-locations: classpath:mapper/**Mapper.xml
Mybatis-plus 的配置文件,和 Mybatis 是一样的,没有什么区别。
Mybatis-plus 是 Mybatis 的增强版,本质上,还是 Mybatis为基础开发的。
1.2 编码:
创建实体类 UserInfo:
java
import lombok.Data;
import java.util.Date;
@Data
public class UserInfo {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
编写 mapper接口:
UserInfoMapper接口,需要继承 BaseMapper<T>接口:
java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}
还要加上 @Mapper 注解,将 UserInfoMapper接口,交给 Spring进行管理。
使用 UserInfoMapper接口 的时候,依赖注入(@Autowired 或 @Resource)即可。
继承 BaseMapper<T >接口之后,T,换成这个接口操作的实体类(UserInfo):BaseMapper<UserInfo >
UserInfoMapper 在继承 BaseMapper 时, 指定了⼀个泛型, 这个UserInfo就是与数据库表相对应的实体类 。
MyBatis-Plus会根据这个实体类来推断表的信息。
默认情况下:
- 表名: 实体类的驼峰表示法转换成蛇形表示法(下划线分割), 作为表名。比如UserInfo -> user_info
- 字段: 根据实体类的属性名 转换为蛇形表示法作为字段名。 比如deleteFlag -> delete_flag
- 主键: 默认为id
那如果实体类和数据库不是按照上述规则定义的呢 MyBatis-Plus也给我们提供了⼀下注解,让我们标识表的信息。
注解有两个:@TableName注解 & @TableField注解
在 第2个标题(注意事项) 详细演示这两个注解的用法。
提供的方法:
BaseMapper<T>接口,提供了 增删改查 的很多方法:

子类继承父类,父类有的方法,子类也有这些方法,调用 UserInfoMapper创建的对象,就可以调用这些方法了。
1.3 CRUD单元测试
新增:
借助UserInfoMapper创建的对象userInfoMapper ,调用 BaseMapper<T> 中提供的 insert( ) 方法。
测试代码:
java
@Test
void insert() {
UserInfo userInfo = new UserInfo();
userInfo.setId(3);
userInfo.setUsername("lisi");
userInfo.setPassword("123456");
userInfo.setAge(18);
userInfo.setGender(1);
userInfo.setPhone("15019873544");
userInfoMapper.insert(userInfo);
}
当然,UserInfo类,添加 全参的构造方法的注解,添加 无参的构造方法的注解 之后,也可以直接使用 构造方法,设置这些属性,不用一个一个的调用对应的 set方法。
运行结果:


删除:
借助UserInfoMapper创建的对象userInfoMapper ,调用 BaseMapper<T> 中提供的 deleteById( ) 方法。
测试代码:
java
@Test
void delete(){
userInfoMapper.deleteById(4);
}
运行结果:


查询:
借助UserInfoMapper创建的对象userInfoMapper ,调用 BaseMapper<T> 中提供的 selectById( ) 方法。
测试代码:
java
@Test
void select(){
UserInfo userInfo = userInfoMapper.selectById(3);
System.out.println(userInfo);
}
运行结果:

修改:
借助UserInfoMapper创建的对象userInfoMapper ,调用 BaseMapper<T> 中提供的 updateById( ) 方法。
测试代码:
java
@Test
void update(){
UserInfo userInfo = new UserInfo();
userInfo.setId(3);
userInfo.setUsername("admin444");
userInfo.setPassword("admin444");
userInfo.setAge(20);
userInfo.setGender(2);
userInfo.setPhone("15019873544");
userInfoMapper.updateById(userInfo);
}
运行结果:


2. 注意事项:
一、使用 MP,主键自增问题
使用 Mybatis-plus,默认情况下:一个对象 的 id属性,并不会按照数据库的自增机制,设置 id字段的值。
而是会按照 MP 的规则,自动设置一个 id值。
例如,不指定 id 添加数据:


测试也是通过的,没有报错。
解决方案:
解决办法分这么几个步骤:
- 在表对应的类的 id属性前,添加一个注解:@TableId(type = IdType.AUTO)
- 删除表中,不合理的字段记录:

- 选中user_info表,右键,在 设计表 功能中,选项界面,手动设置 自动自增 的下一个值。

第二步:除了删除数据记录,还可以设置完其他记录的 id 值,再做第三步的操作。

至于 @TableId 这个注解的作用,后面介绍。
二、MP内置命名规范(重要⭐️⭐️⭐️):
MP,内置了一套规制:了解 数据库表的命名规则,Java类的命名规则
MP 就会根据这个 Java实体类的命名,自动匹配连接的数据库中的 对应命名规则的表。
Java实体类的命名规则,数据库表的命名规则:
Java实体类名通常采用 驼峰命名法(Camel Case)来命名
而数据库表名通常采用 下划线命名法(Snake Case)来命名
例如:

MP 内置的命名规范,会自动判断。
匹配到数据库中的表,查询到的数据库的字段,就能够映射到 对应命名规则的 Java类的属性了。
Java类的属性的命名规则,数据库表的字段的命名规则:

Java实体类的 类名 命名不规范:

报错:说明表不存在
Java实体类的 类名命名不规范,MP内置的命名规范,无法匹配对应的表。
解决办法(@TableName注解):
使用 @TableName注解:

Java实体类的 属性命名不规范:

报错:说明 MP不认识 deleteflag 这个属性,无法和数据库表中的 delete_flag 匹配。
Java实体类的 属性命名不规范,MP内置的命名规范,无法匹配对应的表的字段。
解决办法(@TableField注解):
使用 @TableField注解:

3. Mybatis-plus 打印日志
Mybatis-plus 打印日志,和 Mybatis 差不多,在 yml配置文件中,加入配置项就行。
配置代码:
yaml
# 配置打印 MyBatis-Plus⽇志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
检测效果:
根据 id,查询指定记录:

4. 总结
使用 MP框架,和 Mybatis 差不多。
步骤:
- 引入依赖
- 添加配置文件
- 创建实体类
- 编写 mapper接口
- 创建(依赖注入) mapper接口对象,调用方法
与 Mybatis 不同的是 Mybatis-plus,mapper接口,需要继承 BaseMapper<T >接口,T,换成这个接口操作的实体类。
Java实体类的名称,数据库表的名称,按照规范来,MP内置的命名规范,会自动匹配 Java实体类和数据库表。
所以,命名规范,很重要,特别是在 MP 的使用中。
如果命名不规范 ,MP 提供了 @TableName注解(Java实体类和数据库表映射)和 @TableField注解(属性和字段映射)
并实现 表和实体类的映射,属性和字段的映射,但是,你能遵守命名规范就一定要遵守 ,不要对着来,不要抬杠。
遵守命名规范,能减少很多不必要的情况发生。
简单的遵守命名规范,不至于处理很麻烦的报错情况!!!
mapper接口,继承 BaseMapper<T >接口,之后,就能够使用 BaseMapper<T >接口 提供的所有 增删查改方法。
不用写 sql语句,调用方法,就能够实现增删查改。
最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!