二、MyBatis-Plus入门
================
1. 入门案例
入门案例主要讲一下使用mybatis-plus基本的增删改查
1.1 创建并初始化数据库
1.1.1 创建数据库
这里采用Navicat可视化工具创建数据库,当然,也可以在命令窗口创建,如下:
-
数据库名:mybatis_plus
-
字符集:常用为utf8
-
排序规则:这里选utf8_general_ci
1.1.2 创建User表
这里为了方便演示,就直接创建一个简单的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)
);
插入测试数据:
INSERT INTO user (id,name,age,email) VALUES
(1,‘onestar’,18,‘onestar@136.com’),
(2,‘twostar’,18,‘twostar@136.com’),
(3,‘threestar’,18,‘threestar@136.com’),
(4,‘fourstar’,18,‘fourstar@136.com’),
(5,‘fivestar’,18,‘fivestar@136.com’);
1.2 创建springboot工程
使用idea快捷创建springboot项目,这里就不细说,还有不懂的可以看我之前的文章SpringBoot 框架入门: ,idea快速创建SpringBoot项目那一部分。
注:这里使用的是springboot2.2.1的版本
1.2.1 导入依赖
这里需要将mybatis-plus、MySQL依赖导入,另外,为了简化实体类,不写get、set、tostring方法,添加lombok依赖,用lombok需要下载插件,可以再settings里面的Plugins搜索下载,下载后重启idea
- 导入依赖
com.baomidou
mybatis-plus-boot-starter
3.0.5
mysql
mysql-connector-java
org.projectlombok
lombok
- 下载lombok插件
1.2.2 修改配置文件
springboot配置文件方式有多种,这里选用yml格式的,所以将配置文件后缀改成yml,并添加以下两个配置,如下:
-
数据库配置:driver、url、username、password
-
mybatisplus日置配置:用来在终端显示数据库执行的详细信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: 806188
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
1.3 代码编写
在com.star包下创建两个包,并创建User实体类和UserMapper接口,目录结构如下:
-
entity包:用来放实体类
-
mapper包:用来放持久层接口
这里还需要让springboot扫描到mapper接口,在MybatisplusdemoApplication类中添加注解@MapperScan(“com.star.mapper”)
@SpringBootApplication
@MapperScan(“com.star.mapper”) //扫描到mapper接口
public class MybatisplusdemoApplication {…}
1.3.1 编写User实体类
package com.star.entity;
import lombok.Data;
/**
-
@Description: User实体类
-
@Date: Created in 11:54 2020/7/28
-
@Author: ONESTAR
-
@QQ群: 530311074
-
@URL: https://onestar.newstar.net.cn/
*/
@Data //可以简化实体类
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
分析:
- @Data注解:用于简化实体类,可以不用写get、set等方法
- @TableId(type = IdType.AUTO)注解:这是主键策略注解
* AUTO:表示自动增长策略
* INPUT:表示需要自己设置ID,需要输入
* NONE:表示没有策略,需要输入
* UUID:随机生成唯一的值
* ID\_WORKER:mybatisplus自带策略,生成19位的值,数字类型使用该策略
* ID\_WORKER\_STR:mybatisplus自带策略,生成19位的值,字符串类型使用该策略
1.3.2 编写UserMapper接口
- @Repository注解:可有可无,可以消去依赖注入的报错信息
package com.star.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.star.entity.User;
import org.springframework.stereotype.Repository;
/**
-
@Description: UserMapper接口
-
@Date: Created in 11:57 2020/7/28
-
@Author: ONESTAR
-
@QQ群: 530311074
-
@URL: https://onestar.newstar.net.cn/
*/
@Repository
public interface UserMapper extends BaseMapper {
}
1.3.3 编写测试类(简单增删改查)
编写好以上代码后,框架基本就搭建好了,可以在测试类中进行测试了,在test中添加测试,代码如下:
- 注入mapper
@Autowired
private UserMapper userMapper;
- 简单增删改查
//查询User
@Test
void findUser() {
//查询列表
List user = userMapper.selectList(null);
System.out.println(“user:” + user);
//根据ID查询
User user1 = userMapper.selectById(1L);
System.out.println(“user1:” + user1);
//通过多个ID批量查询
List users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
users.forEach(System.out::println);
//简单的条件查询
HashMap<String, Object> map = new HashMap<>();
map.put(“name”, “onestar”);
map.put(“age”, 18);
List users2 = userMapper.selectByMap(map);
users2.forEach(System.out::println);
}
//添加User
@Test
void addUser(){
User user = new User();
user.setName(“sixstar”);
user.setAge(18);
user.setEmail(“sixstar@136.com”);
int insert = userMapper.insert(user);
System.out.println(insert);
}
//修改User
@Test
void updateUser(){
User user = new User();
user.setId(1L);
user.setAge(12);
int result = userMapper.updateById(user);
System.out.println(result);
}
//删除User
@Test
void deleteUser(){
//根据ID删除
int result = userMapper.deleteById(5L);
System.out.println(result);
//批量删除
int result2 = userMapper.deleteBatchIds(Arrays.asList(1,2,3));
System.out.println(result2);
//简单的条件删除
HashMap<String,Object> map = new HashMap<>();
map.put(“name”,“fourstar”);
map.put(“age”,18);
int result3 = userMapper.deleteByMap(map);
System.out.println(result3);
}
分析:
这里基本上都是直接调用mybatisplus封装好了的方法,有一些基本的方法:
- 查询列表:selectList
- 根据ID查询:selectById
- 根据ID批量查询:selectBatchIds
- 条件查询:selectByMap
- 添加:insert
- 根据ID修改:updateById
- 根据ID删除:deleteById
- 根据ID批量删除:deleteBatchIds
- 条件删除:deleteByMap
2. 提升案例
进阶案例主要讲以下几个知识点:
-
分页查询
-
自动填充
-
mybatisplus实现乐观锁
-
逻辑删除
-
性能分析
-
复杂条件查询
2.1 分页查询
Mybatis-Plus是自带了分页查询功能的,直接使用自集成的插件进行分页查询,在使用之前要配置插件,可以专门创建一个配置类来配置插件
2.1.1 配置插件
在com.star包下创建config包,创建MpConfig配置类,添加分页插件
package com.star.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
-
@Description: 配置类
-
@Date: Created in 10:26 2020/7/29
-
@Author: ONESTAR
-
@QQ群: 530311074
-
@URL: https://onestar.newstar.net.cn/
*/
@Configuration
public class MpConfig {
/**
- 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
2.1.2 测试分页
//分页查询
@Test
void selectPage(){
//创建page对象(1:当前页;3:每页显示记录数)
Page page = new Page<>(1,3);
//调用分页查询方法,将分页所有数据封装到page对象里面
userMapper.selectPage(page,null);
//通过page对象获取分页数据
System.out.println(page.getCurrent()); //当前页
System.out.println(page.getRecords()); //每页数据list集合
System.out.println(page.getPages()); //总页数
System.out.println(page.getSize()); //每页显示记录数
System.out.println(page.getTotal()); //总记录数
System.out.println(page.hasNext()); //是否有下一页
System.out.println(page.hasPrevious()); //是否有上一页
}
分析:
- 创建page对象:new Page<>(1,3); 参数表示当前页和每页显示记录数
- 调用分页查询方法,将分页所有数据封装到page对象里面:selectPage(page,null);
- 通过调用Mybatisplus插件提供的方法实现分页功能
* page.getCurrent():当前页
* page.getRecords():每页数据list集合
* page.getPages():总页数
* page.getSize():每页显示记录数
* page.getTotal():总记录数
* page.hasNext():是否有下一页
* page.hasPrevious():是否有上一页
2.2 自动填充
在平时开发中,会有些数据需要自动填充,比如创建时间、更新时间等,这就可以使用MybatisPlus的自动填充功能,这里就以创建时间和更新时间为例进行演示
2.2.1 添加字段
User表中添加字段:
-
创建时间:create_time
-
更新时间:update_time
实体类添加属性和注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
2.2.2 实现元对象处理器接口
这里专门创建一个hander包来访处理器接口,在com.star包下创建hander包,创建MyMetaObjectHandler接口
package com.star.hander;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
-
@Description: 元对象处理器
-
@Date: Created in 14:03 2020/7/29
-
@Author: ONESTAR
-
@QQ群: 530311074
-
@URL: https://onestar.newstar.net.cn/
*/
@Component //交给spring管理
public class MyMetaObjectHandler implements MetaObjectHandler {
//使用MybatisPlus实现添加操作,执行该方法
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName(“createTime”,new Date(),metaObject);
this.setFieldValByName(“updateTime”,new Date(),metaObject);
}
//使用MybatisPlus实现修改操作,执行该方法
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName(“updateTime”,new Date(),metaObject);
}
}
分析:
- @Component:将该类交给spring管理
- metaObject:元数据对象
Ending
Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下
如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)
吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。
{
//使用MybatisPlus实现添加操作,执行该方法
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName(“createTime”,new Date(),metaObject);
this.setFieldValByName(“updateTime”,new Date(),metaObject);
}
//使用MybatisPlus实现修改操作,执行该方法
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName(“updateTime”,new Date(),metaObject);
}
}
分析:
- @Component:将该类交给spring管理
- metaObject:元数据对象
Ending
Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下
如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)
[外链图片转存中…(img-PxaWJ6n6-1714419408276)]
[外链图片转存中…(img-Y4RsRIot-1714419408277)]
吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。