创建数据库及表
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