目录
一、Mybatis-Plus概述
二、特性
三、快速搭建Mybatis-Plus框架
3.1 创建数据库以及表结构和数据
3.2创建一个springboot工程并引入相关的依赖
3.3 修改配置文件
3.4 创建实体类
3.5 创建dao接口
3.6为dao接口生成带来实现类
3.7 测试
四、使用mp完成crud操作
4.1 添加操作
4.2 删除操作
4.3 修改操作
4.4 查询操作
4.5 分页查询
五、零散的说明
一、Mybatis-Plus概述
Mybatis-Plus的简介https://baomidou.com/pages/24112f/
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
mp是对mybatis的增加 【对于单表的操作】,都可以不用自己写Sql语句了
愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
二、特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
三、快速搭建Mybatis-Plus框架
3.1 创建数据库以及表结构和数据
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));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.2创建一个springboot工程并引入相关的依赖
com.baomidou mybatis-plus-boot-starter 3.5.0 org.springframework.boot spring-boot-starter-web mysql mysql-connector-java org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
3.3 修改配置文件
#数据源spring.datasource.password=rootspring.datasource.username=wjk351066spring.datasource.driver-classname=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mydb" /> 3.7 测试
@SpringBootTestclass SpringbootMybatisplusApplicationTests { @Resource private UserDao userDao; /** * 根据id查询信息 */ @Test void testById() { User user = userDao.selectById(1); System.out.println(user); }
四、使用mp完成crud操作
4.1 添加操作
/** * 添加操作 */ @Test public void testInsert(){ User user=new User(); user.setName("姚远"); user.setAge(24); user.setEmail("850551147.@qqcom"); userDao.insert(user); }
观察: id不是地址 mp帮你生成了ip的值,并封装到实体类中 发生sql语句并为sql中的占位符赋值
mp存在主键的生成策略
AUTO(0),递增策略---按照数据库表的递增完成的。要求数据库该主键必须设置递增。
NONE(1),
INPUT(2), 人为输入主键值
ASSIGN_ID(3), 使用雪花算法帮你生成一个唯一的id。长整型, 默认为该策略
ASSIGN_UUID(4); 使用UUID帮你生成一个唯一的id, 字符串类型。
4.2 删除操作
/** * 删除操作 */ @Test public void testDelete(){ //根据主键删除 int delete = userDao.deleteById(1593824504754245634L); System.out.println("删除影响的行数:"+delete); //根据主键批量删除 List ids= Arrays.asList(1593817503689134083l,5l); int row = userDao.deleteBatchIds(ids); System.out.println("影响的行数:"+row); /** * 上面的操作都是根据id删除 */ //该方法需要一个Wrapper抽象对象 mp把所有的条件封装到该抽象类中了 //子类有updateWrapper--->针对修改封装的子类 //子类有queryWrapper-->针对查询封装的子类 //子类有LambdaQueryWrapper和LambdaUpdateWrapper /** * UpdateWrapper wrapper=new UpdateWrapper(); * wrapper.eq("name","姚远"); * wrapper.or(); //添加wrapper.or就是或 不添加就是且 * wrapper.ge("age",30); * userDao.delete(wrapper); */ /** * LambdaUpdateWrapper的操作 必须得用类名 */ LambdaUpdateWrapper lambdaUpdateWrapper=new LambdaUpdateWrapper(); lambdaUpdateWrapper.like(User::getName,"姚栎晗"); userDao.delete(lambdaUpdateWrapper); }
4.3 修改操作
/** * 修改操作 */ @Test public void testUpdate(){ //根据主键修改 User user=new User(); user.setId(5l); user.setName("卜佩园"); user.setAge(18); user.setEmail("13213213210"); userDao.updateById(user); /** * 根据条件修改 */ User user=new User(); user.setName("王俊凯"); LambdaUpdateWrapper lambdaUpdateWrapper=new LambdaUpdateWrapper(); //根据年龄大于23的修改 lambdaUpdateWrapper.ge(User::getAge,23); userDao.update(user,lambdaUpdateWrapper); }
4.4 查询操作
/** * 查询操作 */ @Test public void testFind(){ /** * 查询多条记录 如果没有条件可以直接传入一个null 就是查询所有 */ List users = userDao.selectList(null); System.out.println(users); /** * 条件查询 */ QueryWrapper wrapper=new QueryWrapper(); wrapper.like("name", "卜佩园"); List list = userDao.selectList(wrapper); System.out.println(list); /** * 根据条件查询一条记录 */ QueryWrapper wrapper=new QueryWrapper(); wrapper.like("name", "卜佩园"); wrapper.eq("age",18); User user = userDao.selectOne(wrapper); System.out.println(user); }
4.5 分页查询
/** * 分页查询 * 这里的分页需要配置分页拦截器 */ @Test public void testFindPage(){ //需要两个参数Page接口对象 第二个条件对象 Page page=new Page(1,3); //把查询的结果封装到page类中 Page selectPage = userDao.selectPage(page, null); System.out.println("总条数:"+selectPage.getTotal()); System.out.println("总页数:"+selectPage.getPages()); System.out.println("当前页的记录:"+selectPage.getRecords()); }
注意:一定要添加分页拦截器
/** * Created by Intellij IDEA * * @author 王俊凯 * @Date: 2022/11/19 13:34 * @Version 1.0 */package com.wjk.config;import com.baomidou.mybatisplus.annotation.DbType;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;@Configurationpublic class MpConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; }}
五、零散的说明
@Data@NoArgsConstructor@AllArgsConstructor@TableName(value = "user") //标记表名和实体明的对应关系public class User { @TableId(type = IdType.ASSIGN_ID) private Long id; @TableField(value = "name") private String name; private Integer age; private String email; @TableField(exist = false) //表示该属性不在数据库 private Integer status; public User(String name, Integer age, String email) { this.name = name; this.age = age; this.email = email; }}