目录
一、简介
2.特性
二、入门
1.创建springboot 项目(点击查看如何创建 )
注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题
2.数据准备
3.配置application.yml
4.代码
BaseMapper<>很重要!它封装了常用的 CRUD 操作
5.创建 测试类
三、主键策略&自动填充
1.自增策略
要想影响所有实体的配置,可以设置全局主键配置
2.自动填充
项目结构展示(还没写完)
三、MybatisPlus分页查询
以下是完整的测试代码:
一、简介
Mybatis-Plus简称 MP 是一个mybatis的增强工具,在mybatis的基础上只做增强,不做改变,为简化开发 提高效率而生,MP 提供了代码生成器,可以一键生成controller service mapper model mapper.xml 代码,同时 提供丰富的CRUD 操作方法,非常方便我们操作
2.特性
|
二、入门
1.创建springboot 项目(点击查看如何创建 )
# pom 文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhp</groupId>
<artifactId>sbdemo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sbdemo1</name>
<description>sbdemo1</description>
<properties>
<java.version>1.8</java.version>
</properties>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--使用lombok 记得装插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!--mybatis-plus代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<!--模板 代码生成器需要使用模板进行生成-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<!--mybatis-plus 扩展插件 比如 分页插件依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题
2.数据准备
创建数据 库 创建User 表
DROP TABLE IF EXISTS user; CREATE TABLE user ( id BIGINT(20) NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) ); 其对应的数据库 Data 脚本如下: DELETE FROM user; 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'); |
3.配置application.yml
# 数据库地址
datasource:
url: localhost:3306/java
spring:
# profiles:
# active: dev
#数据库的配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${datasource.url}?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
username: root
password: 123456
#mp的配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: 1
logic-not-delete-value: 0
id-type: auto # 设置全局主键自增
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看sql输出日志
map-underscore-to-camel-case: true # 驼峰命名规范 stu_name stuName
mapper-locations: classpath:mapper/*.xml # 指定映射文件所在位置
# 指定别名设置的包
type-aliases-package: com.zhp.sbdemo1.pojo
# 查看sql语句的日志
logging:
level:
com.zhp.sbdemo1.mapper: debug
server:
port: 8888
4.代码
# 1.启动类
#启动类添加 @MapperScan 注解 ,扫描mapper 包下的接口
/**
* 这类也算是 配置类
*
* @SpringBootConfiguration
* @EnableAutoConfiguration
*
* 1.添加mp依赖
* 2.在 application.yml 中配置
* 3.创建mapper 继承BaseMapper接口,这个接口封装了常用的增删改查方法,可以直接调用
* */
@SpringBootApplication // 忽略数据源的自动配置
@MapperScan("com.zhp.sbdemo1.mapper")
public class Sbdemo1Application {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
#2.实体类 在pojo 下 创建User.java 使用lombok 简化代码
@Data
public class User {
//@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
#3. 创建mapper 包 创建UserMapper 接口 UserMapper.java
@Repository
public interface UserMapper extends BaseMapper<User> {
}
BaseMapper<>很重要!它封装了常用的 CRUD 操作
* 1.公共的方法进行抽取,抽取到BaseMapper接口中,将用户操作的方法对象,转化为数据库能够识别的SQL语句
|
注意:
IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。
为了避免报错,可以在 mapper 层 的接口上添加 @Repository 注
5.创建 测试类
@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectList() {
//UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
//所以不填写就是无任何条件
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
}
通过以上几个简单的步骤,我们就实现了 User 表的 基本查询 功能,甚至连 XML 文件都不用编写!
三、主键策略&自动填充
1.自增策略
要想主键自增需要配置如下主键策略
-
需要在创建数据表的时候设置主键自增
-
实体字段中配置 @TableId(type = IdType.AUTO)
// 使用 数据库的 自增策略 默认是 IdType.ID_WORKER 雪花算法生成的id
@TableId(type = IdType.AUTO)
private Long id;
要想影响所有实体的配置,可以设置全局主键配置
在application.yml中添加
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
2.自动填充
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:
1.数据库表中添加自动填充字段
在User表中添加datetime类型的新的字段 create_time、update_time
2.实体上添加注解
@Data public class User { ......
@TableField(fill = FieldFill.INSERT) // 添加时 赋值 private Date createTime;
//@TableField(fill = FieldFill.UPDATE) 修改时 赋值
@TableField(fill = FieldFill.INSERT_UPDATE) // 添加 和 修改 都会赋值
private Date updateTime;
}
3.实现元对象处理器接口 注意:不要忘记添加 @Component 注解
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("insert info ......");
// 添加时填充
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
// 添加 乐观锁的 默认值是 1
this.setFieldValByName("version", 1, metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("update info ......");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
项目结构展示(还没写完)
三、MybatisPlus分页查询
首先配置分页在配置类 MybatisPlusConfig 中
@EnableTransactionManagement
@Configuration
@MapperScan("com.zhp.sbdemo1.mapper")
public class MybatisPlusConfig {
// 配置这个拦截器 可以帮助我们实现 乐观锁、分页等功能
@Bean
public MybatisPlusInterceptor optimisticLockerInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页拦截器 --- 分页插件
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
// 添加乐观锁拦截器 --- 乐观锁插件
OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor = new OptimisticLockerInnerInterceptor();
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor);
return interceptor;
}
}
在controller方法中,先写上: Page<User> userPage = new Page<>(1,3);
如果返回结果想要 对象:userPage = userMapper.selectPage(userPage, null);
如果返回结果想要 集合:
// 封装 页码和每页的记录数
Page userPage = new Page<User>(1,3);
// 分页查询的方法
Page<Map<String,Object>> page1 = userMapper.selectMapsPage(userPage, null);
以下是完整的测试代码:
@Test
// 结果封装为 实体类对象 方式
// 结果为: [User(id=1, name=小萝卜, password=123456), User(id=2, name=小溪, password=123, User(id=3, name=张小溪, password=222)]
public void testSelectPage(){
// 封装 页码和每页的记录数
Page<User> userPage = new Page<>(1,3);
// 分页查询的方法
userPage = userMapper.selectPage(userPage, null);
List<User> records = userPage.getRecords();
System.out.println(records);
}
@Test
// 结果封装为 键值(map) 方式
// 结果为: [{password=123456, name=小萝卜, id=1}, {password=123, name=小溪, id=2}, {password=222, name=张小溪, id=3}]
public void testSelectMapsPage(){
// 封装 页码和每页的记录数
Page userPage = new Page<User>(1,3);
// 分页查询的方法
Page<Map<String,Object>> page1 = userMapper.selectMapsPage(userPage, null);
List<Map<String, Object>> records = page1.getRecords();
System.out.println(records);
}
MybatisPlus分页查询就这么简单,直接两行搞定,不需要SQL因为BaseMapper帮你做了crud