MybatisPlus介绍
- Mybatis是一款优秀的持久层框架,用来简化JDBC的开发
- MybatisPlus又是基于Mybatis实现的,它又简化了Mybatis的操作,可以做到对于MySQL的单表操作不再需要写SQL语句。MybatisPlus基于 MyBatis 增强,
只做增强不做改变,简化数据库操作。
快速入门
数据库准备
create database day07 default charset utf8mb4;
use day07;
-- 创建用户表
create table user
(
id int unsigned primary key auto_increment comment 'ID,主键',
username varchar(20) comment '用户名',
password varchar(32) comment '密码',
name varchar(10) comment '姓名',
age tinyint unsigned comment '年龄'
) comment '用户表';
-- 插入数据
insert into user(id, username, password, name, age)
values (1, 'daqiao', '123456', '大乔', 22),
(2, 'xiaoqiao', '123456', '小乔', 18),
(3, 'diaochan', '123456', '貂蝉', 24),
(4, 'lvbu', '123456', '吕布', 28),
(5, 'zhaoyun', '12345678', '赵云', 27);创建maven项目,添加依赖
创建一个新的maven模块day07_mybatisplus,添加如下依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>day07_mybatisplus</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 设置当前工程继承 spring boot 的工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.7</version>
</parent>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--父工程-->
<dependencies>
<!--mysql-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatisplus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.17</version>
</dependency>
<!--mybatis-plus分页插件依赖(3.5.9+版本需要单独引入)-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser</artifactId>
<version>3.5.17</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.38</version>
</dependency>
<!--springboot单元测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>启动创建类
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MpApplication {
public static void main(String[] args) {
SpringApplication.run(MpApplication.class, args);
}
}添加配置文件
在resources下添加配置文件application.yaml,然后添加如下的配置
# 数据库连接信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动(固定)
url: jdbc:mysql://localhost:3306/day07 # 数据库连接字符串(数据库名称改成你自己的)
username: root # 连接数据库的用户名
password: 123456 # 连接数据库的密码(改成自己的)
# mybatis-plus配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启mp的sql的日志
global-config:
db-config:
#table-prefix: jy_ # 设置表名的统一前缀为jy_ 这个适合我们全部表是统一前缀的时候可以这么设置
id-type: auto # 设置统一的id生成策略为auto,也就是数据库自增
map-underscore-to-camel-case: true # 驼峰映射创建实体类User
在com.itheima.entity下创建实体类User,注意根据MybatisPlus的要求,实体类必须指定对应的数据表的名字
package com.itheima.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("user")
public class User {
private Integer id;
private String username;
private String password;
private String name;
private Integer age;
}使用时请注意!
如果实体类与数据库表不符合默认的规则,MybatisPlus提供了常见的如下注解来指定表、字段的信息。
@TableName("数据库表名"):这个注解用于解决实体类名和表名不一致的问题
@TableId:这个注解用于解决实体类主键属性和表的主键不一致的问题,以及解决主键生成策略等问题
@TableField:这个注解用于标注实体类普通属性和表中的普通列不一致的问题, 属性在表中不存在的问题
@TableId(value="id", type=IdType.AUTO)
- IdType的常见类型:
- AUTO:自动增长
- INPUT:用户输入ID
- ASSIGN_ID:雪花算法生成一个ID (分布式场景下使用)
- ASSIGN_UUID:生成一个UUID
一般情况下我们并不需要给字段添加@TableField注解,一些特殊情况除外:
- 成员变量名与数据库字段名不一致
- 成员变量不是数据库中的字段,则需要使用
exist表明为false
下面是一个完整的实体类的参考代码:
@TableName("tb_course") // 由于类名和表名不一致无法自动映射可以通过该注解标注表名
public class Course {
@TableId(value="id", type=IdType.AUTO)// 标注该属性对应的表中的主键列, 主键策略为数据库的默认自动增长
private Integer id; // 课程id
@TableField("subject") // 如果列名和属性名一致, 可以省略不写
private Integer subject; // 课程所属学科
@TableField("name")
private String name; // 课程名称
@TableField("price")
private Integer price; // 课程价格
@TableField("target")
private Integer target; // 课程目标
@TableField("description")
private String description; // 课程描述
@TableField("created")
private LocalDateTime createTime; // 创建时间
@TableField("updated")
private LocalDateTime updateTime; // 修改时间
}创建持久层接口
根据MybatisPlus的要求,在com.itheima.mapper下创建实体类UserMapper
此接口必须继承BaseMapper<实体类>,还必须添加@Mapper注解,但是不用写实现类
注意
创建的Mapper是一个Interface接口类,不需要写实现类!!!!
在Mybatis的开发规范中,持久层的命名规范为XxxxMapper(而不使用xxxDao),所以这个接口我们也称为Mapper接口
package com.itheima.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper // 框架自动生成接口的实现类对象并装入Spring IOC容器(代理技术后面讲)
public interface UserMapper extends BaseMapper<User> {
}测试
在test目录下,创建一个测试类com.itheima.mapper.UserMapperTest来测试UserMapper接口中的方法,代码如下:
特别提醒
创建的测试类的包名称请和mapper的包名称保持一致,比如存放Mapper的包名称是com.itheima.mapper, 那存放测试文件的包名称就是com.itheima.mapper,至于测试类的名称则无关紧要。
package com.itheima.mapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.itheima.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest // 标注当前类是一个SpringBoot的测试类
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test // 单元测试注解(方法测试注解)
public void testFinAll() {
List<User> userList = userMapper.selectList(Wrappers.emptyWrapper());
userList.forEach(user -> System.out.println(user));
}
}执行测试,发现在控制台上输出了下面内容,此内容已经揭示了MybatisPlus的工程流程
- 当我们调用
userMapper.selectList(null)时,mybatisPlus底层会发送一条SQL到数据库 - MyBatisPlus会接受MySQL数据返回的结果集(包含字段名和值)
- MyBatisPlus会将返回结果按照字段名跟实体类中属性名的对应关系封装到
List<User>中
