MybatisPlus:入门案例(lombok的使用)

创建数据库及表

CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据:

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

创建Spring Boot工程

初始化工程

使用 Spring Initializr 快速初始化一个 Spring Boot 工程

引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--Mybatis Plus 启动器-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.1</version>
    </dependency>
    <!--    lombok 简化实体类开发    -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <!--     MySQL 驱动   -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

idea中安装lombok插件

引入了lombok依赖为什么IDEA还需要安装lombok插件

引入了lombok依赖后,IDEA还需要安装lombok插件的原因主要在于lombok的工作机制与IDE的集成方式。

首先,lombok是一个Java库,它可以通过注解来自动生成getter、setter、构造函数等常用方法,从而简化Java代码。然而,这些注解在源代码层面是看不到对应的方法实现的,它们是在编译阶段由lombok库处理的

当使用javac编译器编译Java文件时,lombok库会介入编译过程,根据注解自动生成相应的方法。但是,IDE(如IntelliJ IDEA)在解析源代码时,看不到这些由lombok生成的方法,因此会报错,认为这些方法未定义

为了解决这个问题,IDEA需要安装lombok插件。这个插件能够识别lombok的注解,并在IDE内部模拟lombok的编译过程,从而在源代码层面显示这些由注解生成的方法。这样,开发者就可以在IDE中看到完整的方法定义,而不会出现编译错误。

此外,lombok插件还提供了其他功能,如自动生成日志对象等,进一步简化了Java开发过程。

因此,虽然已经在项目中引入了lombok依赖,但为了确保IDE能够正确解析和显示由lombok注解生成的方法,仍然需要安装lombok插件。

Lombok 的常用注解

@Data

  • 用途:注解在类上,为类提供所有属性的get和set方法,以及equals、canEqual、hashCode、toString方法。
  • 注意事项:如果需要在getter或setter中做自定义操作,则不能使用@Data注解。

@Setter/@Getter

  • 用途:注解在属性上,为属性提供set/get方法。如果注解在类上,则为类中的所有属性生成对应的set/get方法。
  • 灵活性:可以通过设置访问级别(如@Getter(AccessLevel.PROTECTED))来控制生成方法的访问权限。

@NonNull

  • 用途:注解在属性上,判断属性是否为空。如果为空,则在调用setter方法时抛出NullPointerException。
  • 安全性:提高代码的健壮性,防止空指针异常的发生。

@ToString

  • 用途:注解在类上,自动生成toString方法。默认情况下,所有非静态字段都将以名称/值对的形式包含在方法的输出中。
  • 自定义:可以通过属性(如callSuper、includeFieldNames、exclude)来进一步设置toString方法的生成方式。

@EqualsAndHashCode

  • 用途:注解在类上,自动生成equals和hashCode方法。这两个方法用于比较对象是否相等以及获取对象的哈希码。
  • 注意事项:默认情况下,被这个注解标注的类会使用除了static、transient修饰的所有属性作为判断标准。可以使用exclude选项排除不想要的属性,也可以通过callSuper包含父类的equals和hashCode方法。

@NoArgsConstructor/@AllArgsConstructor/@RequiredArgsConstructor

  • @NoArgsConstructor:注解在类上,为类提供一个无参的构造方法。
  • @AllArgsConstructor:注解在类上,为类提供一个包含所有参数的构造方法。
  • @RequiredArgsConstructor:注解在类上,生成一个包含“特定参数”的构造器,特定参数指的是那些有加上final修饰词的变量。
  • 便捷性:这些注解可以快速生成构造方法,减少样板代码。

@Builder

  • 用途:注解在类上,自动生成流式set值写法,用于复杂对象的构建。
  • 注意事项:虽然@Builder注解可以简化对象的创建过程,但是setter方法还是必须要写,因为Spring或其他框架可能会用到对象的getter/setter方法进行取值/赋值。

@Cleanup

  • 用途:注解在资源对象上(如IO流),用于关闭并释放资源。
  • 便捷性:可以简化资源释放的代码,提高代码的可读性和安全性。

@Log4j/@Slf4j等

  • 用途:注解在类上,为类提供一个日志对象(如Log4j或SLF4J的Logger对象)。
  • 便捷性:可以方便地进行日志记录,提高代码的调试和维护效率。

编写代码

配置application.yml

spring:
  # 配置数据源信息
  datasource:
    # 配置数据源类型
    type: com.zaxxer.hikari.HikariDataSource
    # 配置连接数据库的各个信息
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.124.188:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
    username: root
    password: 1234

对比使用druid的配置:

spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        druid:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://数据库IP:端口/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
            username: root
            password: root

spring.datasource.type:数据源类型,默认情况下,Spring Boot使用HikariCP作为数据源

驱动类driver-class-name

  • spring boot 2.0(内置jdbc5驱动),驱动类使用:driver-class-name: com.mysql.jdbc.Driver
  • spring boot 2.1及以上(内置jdbc8驱动),驱动类使用:driver-class-name: com.mysql.cj.jdbc.Driver
  • 否则运行测试用例的时候会有 WARN 信息

连接地址url

  • MySQL5.7版本的url:jdbc:mysql://192.168.124.188:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
  • MySQL8.0版本的url:jdbc:mysql://192.168.124.188:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
  • 否则运行测试用例报告如下错误:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more

启动类

在Spring Boot启动类中添加@MapperScan注解,扫描mapper包

@SpringBootApplication
@MapperScan("com.lin.mymybatisplusdemo.mapper") // 扫描包
public class MyMybatisPlusdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyMybatisPlusdemoApplication.class, args);
    }

}

添加实体类

// lombok注解
@NoArgsConstructor //注解在类上,为类提供一个无参的构造方法。
@AllArgsConstructor // 解在类上,为类提供一个包含所有参数的构造方法
@Data //为类提供所有属性的get和set方法,以及equals、canEqual、hashCode、toString方法。
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

添加mapper

BaseMapper是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的实体类型

public interface UserMapper extends BaseMapper<User> {
}

测试

@SpringBootTest
public class MybatisPlusTest {
    @Autowired
    private UserMapper userMapper;
    @Test
    public void testSelectList(){
        //selectList()根据MP内置的条件构造器查询一个list集合,null表示没有条件,即查询所有
        userMapper.selectList(null).forEach(System.out::println);
    }
}

结果:

User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)

注意:

IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。

为了避免报错,可以在mapper接口上添加 @Repository 注解

@Repository
public interface UserMapper extends BaseMapper<User> {
}

添加日志

在application.yml中配置日志输出

# 配置MyBatis日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 默认的实现类

实际上还是有很多其他的实现类

实现效果:

JDBC Connection [HikariProxyConnection@1507604180 wrapping com.mysql.cj.jdbc.ConnectionImpl@12fcc71f] will not be managed by Spring
==>  Preparing: SELECT id,name,age,email FROM user
==> Parameters: 
<==    Columns: id, name, age, email
<==        Row: 1, Jone, 18, test1@baomidou.com
<==        Row: 2, Jack, 20, test2@baomidou.com
<==        Row: 3, Tom, 28, test3@baomidou.com
<==        Row: 4, Sandy, 21, test4@baomidou.com
<==        Row: 5, Billie, 24, test5@baomidou.com
<==      Total: 5
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2330e3e0]
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com

×

喜欢就点赞,疼爱就打赏