学习目标:
一天掌握MybatisPlus功能,原理,使用
学习内容:
1、 配置MybatisPlus依赖
2、 掌握MybatisPlus使用
3、 掌握MybatisPlus原理
MybatisPlus功能
参考: MybatisPlus官方文档.
一句话:为简化开发而生
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
个人理解:支持多种数据库,自动生成crud语句,消灭crud程序员。
快速上手
1、准备工作
假定数据库中已有如下一张表
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLwUkaOBTWq1kMNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5EzM3ATOyYTMxIDOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2、添加依赖
引入 Spring Boot Starter 父工程:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/>
</parent>
引入 spring-boot-starter、spring-boot-starter-test、mybatis-plus-boot-starter、lombok、h2 依赖:
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
不要同时导入mybatis与mybatisPlus,可能有版本冲突。
连接数据库
spring.datasource.username=root
spring.datasource.password=123456789z
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&useUnicode=true
3、写MVC类
编写po、mapper;
User.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
UserMapper.java
@Mapper
//操作哪张表就把BaseMapper的范型改为该表的po对象,此处为user
public interface UserMapper extends BaseMapper<User> {
}
启动类
@MapperScan("com.example.dao")
@SpringBootApplication
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
此时就已经完成增删改查的全部操作了!!!!
4、编写测试类验证
test.java
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper mus;
@Test
void contextLoads() {
//查询全部用户数据,参数为条件构造器,无条件则传null
List<User> users = mus.selectList(null);
users.forEach(System.out::println);
}
}
运行结果:
User(id=1, name=Jone, age=18, [email protected])
User(id=2, name=Jack, age=20, [email protected])
User(id=3, name=Tom, age=28, [email protected])
User(id=4, name=Sandy, age=21, [email protected])
User(id=5, name=Billie, age=24, [email protected])
结果运行成功
配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
控制台输出日志
功能扩展
插入功能
@Test
void TestInsert(){
User user = new User();
user.setName("zhoulibo");
user.setAge(3);
user.setEmail("[email protected]");
int insert = mus.insert(user);//结果自动生成id
System.out.println(insert);
System.out.println(user);
}
结果:
mybatisPlus自动生成user ID补全数据,插入成功!!!
原因:分布式系统生成唯一主键ID方法汇总
主键生成策略
雪花算法(保证id全球唯一)
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看github雪花算法。
1、在po实体类中字段上添加注解@TableId(type=IdType.AUTO)
表示该属性为自增id
2、在数据库中对应字段也必须为自增类型,否则报错;
此时插入
update
测试插入
@Test
void testUpdate(){
User user = new User();
//通过条件自动拼接动态sql
user.setId(5l);
user.setAge(3);
user.setEmail("修改成功@qq.com");
int insert = mus.updateById(user);
}
通过条件自动拼接动态sql,完成更新;
自动填充字段
方式一:数据库级别
1、在表中新增字段create_time,mod_time,设置默认值dafault=CURRENT_TIMESTAMP;
此时插删改如果不设置这两个属性,数据库将自动修改;
2、代码级别
添加注解
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date modTime;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
编写处理器,处理注解
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start autoInsert fill");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("modTime",new Date(),metaObject);
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start autoUpdate fill");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("modTime",new Date(),metaObject);
}
}
乐观锁与悲观所
乐观锁:十分乐观,总认为不会发生并发冲突,所以做什么都不加锁就执行,等出现问题了再回滚加锁。
悲观锁:十分悲观,认为什么操作都会有冲突,所以都先加上锁再执行。
乐观锁实现方式:
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
使用:
1、数据库设置乐观锁字段version,默认值1,初始版本;
2、在po对象对应属性添加@version注解;
3、向容器添加乐观锁插件,配置类;
@MapperScan("com.example.dao")
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
分页查询
@Test
void testSelectByPage(){
//参数一:当前页
//参数二:页面大小
Page<User> pa = new Page<>(1, 2);
mus.selectPage(pa,null);
pa.getRecords().forEach(System.out::println);
System.out.println(pa.getSize());
}
删除操作
//测试删除操作
@Test
void testDelete(){
mus.deleteById(2);
//批量删除1
mus.deleteBatchIds(Arrays.asList(1,2,3));
//批量删除e2
HashMap<String, Object> map = new HashMap<>();
map.put("name","周立波");
mus.deleteByMap(map);
}
性能分析插件
分析每条sql语句执行时间,如果超过规定时间,mp会停止运行
1、导入插件
2、测试使用
条件构造器
@Test
void testConditionConstructer(){
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper
.isNotNull("name") //名字不为空
.ge("age",12);//年龄大于12
mus.selectList(userQueryWrapper);
}
代码生成器
只能说太牛逼了,基于数据库中的表,自动生成xml,mapper,service,controller,entity,整个后台所有表的插查删改,具体业务逻辑只需修改各自的service即可,详细使用请看官方文档,使用这个可以快速把后台非业务逻辑部分自动生成,包括注释。但封装的这么好,一定有坑,一坑坑所有,不熟悉的情况下还是慎用。