Mybatis(14)Mybatis-Plus入门 & 简单使用

Mybatis(14)Mybatis-Plus入门 & 简单使用

文章目录

观前提醒:

如果你是第一次点击这篇博客,需要你回看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操作数据库的步骤:

  1. 准备工作(数据准备, 项目准备, 引入依赖, 配置数据库连接信息)
  2. 编码(数据库表对应的实体类, 以及数据操作的Mapper接口)
  3. 测试

下面,有些情况,我就把 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会根据这个实体类来推断表的信息。

默认情况下:

  1. 表名: 实体类的驼峰表示法转换成蛇形表示法(下划线分割), 作为表名。比如UserInfo -> user_info
  2. 字段: 根据实体类的属性名 转换为蛇形表示法作为字段名。 比如deleteFlag -> delete_flag
  3. 主键: 默认为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 添加数据:

测试也是通过的,没有报错。

解决方案:

解决办法分这么几个步骤:

  1. 在表对应的类的 id属性前,添加一个注解:@TableId(type = IdType.AUTO)
  2. 删除表中,不合理的字段记录:
  1. 选中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 差不多。

步骤:

  1. 引入依赖
  2. 添加配置文件
  3. 创建实体类
  4. 编写 mapper接口
  5. 创建(依赖注入) mapper接口对象,调用方法

与 Mybatis 不同的是 Mybatis-plus,mapper接口,需要继承 BaseMapper<T >接口,T,换成这个接口操作的实体类。

Java实体类的名称,数据库表的名称,按照规范来,MP内置的命名规范,会自动匹配 Java实体类和数据库表。

所以,命名规范,很重要,特别是在 MP 的使用中

如果命名不规范 ,MP 提供了 @TableName注解(Java实体类和数据库表映射)和 @TableField注解(属性和字段映射)

并实现 表和实体类的映射,属性和字段的映射,但是,你能遵守命名规范就一定要遵守 ,不要对着来,不要抬杠。

遵守命名规范,能减少很多不必要的情况发生。

简单的遵守命名规范,不至于处理很麻烦的报错情况!!!

mapper接口,继承 BaseMapper<T >接口,之后,就能够使用 BaseMapper<T >接口 提供的所有 增删查改方法。

不用写 sql语句,调用方法,就能够实现增删查改。

最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!

下一篇博客:Mybatis(15)@TableName注解 & @TableField注解 & @TableId注解

相关推荐
人道领域1 小时前
Maven配置加载:动态替换的艺术
java·数据库·后端
MX_93591 小时前
@Import整合第三方框架原理
java·开发语言·后端·spring
坚持就完事了2 小时前
Java实现数据结构中的链表
java·数据结构·链表
玩具猴_wjh2 小时前
JWT优化方案
java·服务器·数据库
坚持就完事了2 小时前
Java各种命名规则
java·开发语言
白露与泡影2 小时前
2026年Java面试题精选(涵盖所有Java核心面试知识点),立刻收藏
java·开发语言
星火开发设计2 小时前
STL 容器:vector 动态数组的全面解析
java·开发语言·前端·c++·知识
小妖6662 小时前
js 实现插入排序算法(希尔排序算法)
java·算法·排序算法
星火开发设计2 小时前
标准模板库 STL:C++ 的利器 —— 容器、算法、迭代器
java·开发语言·数据结构·c++·算法·html