快速入门
第一步:导入依赖
<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
① 普通查询:
@Testvoid 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);}
② 分页查询:
@Testvoid 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 {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {//定义MybatisplusMybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//添加具体的分页查询的拦截器interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
③条件查询以及多条件查询(LambdaQueryWrapper<User>):
@Testvoid 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 betweenwrapper.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.StdOutImplglobal-config:banner: falsedb-config:id-type: assign_idtable-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.StdOutImplglobal-config:banner: falsedb-config:id-type: assign_id//逻辑删除logic-not-delete-value: 0logic-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 操作智能分析阻断,也可自定义拦截规则,预防误操作