快速入门
第一步:导入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
第二步:编写mapper层,最最最重要的点: extends BaseMapper<Pojo>,就可以不用再编写Mapper层的方法以及SQL查询语句
package com.example.springboot_learn.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.example.springboot_learn.Pojo.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface usermapper extends BaseMapper<User> {
}
第三步:使用mybatisplus
#mybatis的日志
mybatis-plus:
//日志显示
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
//关掉图标
global-config:
banner: false
① 普通查询:
@Test
void testum(){
//新增数据
User user=new User(6,"zzl",55,"test6baomidou.com");
um.insert(user);
//查询全部
List<User> userslist = um.selectList(null);
System.out.println(userslist);
//参数ID查询
User user1 = um.selectById(2);
System.out.println("user1 = " + user1);
//修改数据,这里有个注意点:只会修改你赋的值,未初始化的值不做修改
User user2=new User();
user2.setId(5);
user2.setName("zzlyyds");
um.updateById(user2);
//删除数据
um.deleteById(6);
}
② 分页查询:
@Test
void tset02(){
//分页查询,要使用拦截器实现该功能
//1:显示第1页 2:一页多少条数据
IPage page = new Page(1,2);
um.selectPage(page,null);
//显示第几页
System.out.println(page.getCurrent());
//显示每页大小
System.out.println(page.getSize());
//显示一共有多少页
System.out.println(page.getPages());
//显示一共用多少条数据
System.out.println(page.getTotal());
//显示该页的数据
System.out.println(page.getRecords());
}
分页查询的拦截器配置:
package com.example.springboot_learn;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class mpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
//定义Mybatisplus
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加具体的分页查询的拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
③条件查询以及多条件查询(LambdaQueryWrapper<User>):
@Test
void tset03(){
//方式一
//按条件查询,由QueryWrapper对象来实现
QueryWrapper wrapper = new QueryWrapper();
wrapper.lt("age",20);
List<User> userslist = um.selectList(wrapper);
System.out.println(userslist);
//方式二
QueryWrapper<User> wrapper1 = new QueryWrapper<User>();
wrapper1.lambda().gt(User::getAge,20);
List<User> userslist1 = um.selectList(wrapper1);
System.out.println(userslist1);
//方式三,主用!!!!
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
lambdaQueryWrapper.gt(User::getAge,25);
List<User> userslist2 = um.selectList(lambdaQueryWrapper);
System.out.println(userslist2);
//链式编程写多条件查询
LambdaQueryWrapper<User> lambdaQueryWrapper1 = new LambdaQueryWrapper<User>();
//and操作
lambdaQueryWrapper1.lt(User::getAge,25).gt(User::getAge,20);
//or操作
lambdaQueryWrapper1.lt(User::getAge,25).or().gt(User::getAge,20);
userslist2 = um.selectList(lambdaQueryWrapper1);
System.out.println(userslist2);
}
④查询投影,分组,排序,范围查询
//字段筛选
wrapper.select("age");
//分组
wrapper.groupBy("age");
//排序
wrapper.orderByAsc("age");
wrapper.orderByDesc("age");
//等值
wrapper.eq("age",18);
//范围查询gt ge lt le eq between
wrapper.gt("age",18);
//模糊匹配
wrapper.likeRight("name","h");
wrapper.likeLeft("name","j");
⑤数据库表名与编程变量名映射,控制字段不投影,添加自定义变量
表名: @TableName("user")
字段匹配以及不做字段投影:@TableField(value = 'pwd' ,select = false)
添加属性:@TableField(exist = false)
⑥ID自增策略
@TableId(type = IdType.AUTO)
@TableId(type = IdType.ASSIGN_ID)
@TableId(type = IdType.INPUT)
@TableId(type = IdType.NONE)
@TableId(type = IdType.UUID)
private Integer id;
雪花ID的组成
表名前缀以及雪花算法的全局配置
#mybatis的配置
mybatis-plus:
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: false
db-config:
id-type: assign_id
table-prefix: tbl_
⑦多数据操作(BatchIds)
List<Long> list = new ArrayList<>();
//多数据删除
um.deleteBatchIds(list);
//多数据查询
um.selectBatchIds(list);
⑧逻辑删除,实现只进行逻辑删除,而不是直接删除数据库中的表数据
添加数据库字段deleted
全局配置
#mybatis的配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: false
db-config:
id-type: assign_id
//逻辑删除
logic-not-delete-value: 0
logic-delete-value: 1
⑨乐观锁:解决多线程并发问题
步骤一:添加数据库字段version
步骤二:添加字段的@version注解
步骤三:添加拦截器
步骤四:实现
⑩代码生成器
Mybatisplus
特点:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作