Mybatis-plus
...大约 6 分钟
Mybatis-plus
简介
MybatisPlus简称MP,是基于Mybatis框架基础上开发的增强型工具,旨在简化开发,提高效率。是国人开发的。
官网
所需依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
使用方法
在Mapper上继承BaseMapper类
package com.ctg.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ctg.pojo.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserDao extends BaseMapper<User>
{
}
BaseMapper类里面的方法如下图

开启MybatisPlus的输出日志
# 开启mp的日志(输出到控制台,能查看SQL语句)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 关闭MP的banner
global-config:
banner: false
分页查询
第一步需要配置MybatisPlus这个框架为我们准备的分页拦截器
package com.ctg.config;
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 mpInterceptor() {
//定义Mp拦截器
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
//添加具体的拦截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
}
}
第二步使用方法
@Test
void testSelectByPage() {
// Page(1,2) 表示查第一页,每页2条数据
IPage page = new Page(1,2);
userDao.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());
}
条件查询
单条件查询
@Test
void testSelect() {
// 方式一 普通条件查询
QueryWrapper<User> qw = new QueryWrapper<>();
// lt表示小于 查询age字段小于18岁的
qw.lt("age",18);
List<User> list = userDao.selectList(qw);
System.out.println(list);
// 方式二 lambda格式按条件查询
QueryWrapper<User> qw1 = new QueryWrapper<>();
// lt表示小于 查询age字段小于18岁的
qw1.lambda().lt(User::getAge,18);
List<User> list1 = userDao.selectList(qw1);
System.out.println(list1);
// 推荐使用方式三
// 方式三 lambda格式按条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
// lt表示小于 查询age字段小于18岁的
lqw.lt(User::getAge,18);
List<User> list2 = userDao.selectList(lqw);
System.out.println(list2);
}
// lt表示小于 gt表示大于 le小于等于 ge大于等于 eq等于 between在xx之间 like模糊查询 likeLeft%在左边 likeRight%在右边
多条件查询
@Test
void testSelect() {
// lambda格式按条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
// 采用链式编程思想 表示查询年龄大于10并且小于30的
lqw.lt(User::getAge,30).gt(User::getAge,10);
List<User> list2 = userDao.selectList(lqw);
System.out.println(list2);
// lambda格式按条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
// 采用链式编程思想 表示查询年龄大于10或者小于30的
lqw.lt(User::getAge,30).or().gt(User::getAge,10);
List<User> list2 = userDao.selectList(lqw);
System.out.println(list2);
}
null问题
@Test
void testSelect() {
User user = new User();
// lambda格式按条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
// 先判定第一个参数是否为true,如果是则连接当前条件
lqw.lt(null != user.getAge() ,User::getAge,user.getAge());
List<User> list2 = userDao.selectList(lqw);
System.out.println(list2);
}
查询投影
@Test
void testSelect() {
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
// 设置只查询年龄和姓名
lqw.select(User::getAge,User::getName);
List<User> list = userDao.selectList(lqw);
System.out.println(list);
}
字段映射与表名映射
package com.ctg.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
//打上这个注解set和get以及toString方法自动生成
@Data
// 表示这个类与数据库中的user表映射
@TableName("user")
public class User {
private String name;
// value表示此属性与数据库中的passcode字段映射起来
// select=false表示此属性不参与查询
@TableField(value = "passcode", select = false)
private String passcode;
private int age;
private String tel;
// 表示数据库表中没有此字段
@TableField(exist = false)
private String online;
}
Id生成策略
自增
@TableId(type = IdType.AUTO)
private Long id;
不设置id生成策略
@TableId(type = IdType.NONE)
private Long id;
用户手动输入id
@TableId(type = IdType.INPUT)
private Long id;
雪花算法
@TableId(type = IdType.ASSIGN_ID)
private Long id;
UUID
@TableId(type = IdType.ASSIGN_UUID)
private Long id;
全局配置
每个类都要写的话太麻烦,进行全局设置
# 开启mp的日志(输出到控制台)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 关闭MP的banner
global-config:
banner: false
# 设置全局ID生成策略
db-config:
id-type: auto
代码生成器
所需依赖
<dependencies>
<!-- Web核心启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
<!-- <version>5.1.47</version>-->
</dependency>
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 以下是代码生成器的jar依赖 -->
<!-- 代码生成器核心jar依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 使用默认的velocity模板 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!-- sfl4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
工具类源代码
package com.fithub.utils;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
* 1. @ClassDescription: 代码生成器
* 2. @author: TenSoFlow
* 3. @date: 2024年04月21日 16:31
*/
public class GeneratorCode
{
// 作者名称(可改)
private static String author = "tensoflow";
// 生成的位置(一般是必须要改,除非路径和我的一样)
private static String outputDir = "D:\\Desktop\\fithub\\src\\main\\java";
// 驱动,注意版本(MySQL8是com.mysql.cj.jdbc.Driver MySQL5是com.mysql.jdbc.Driver)
private static String driver = "com.mysql.cj.jdbc.Driver";
// 连接路径,注意修改数据库名称(一般是必须要改,除非数据库名称是fithub)
private static String url = "jdbc:mysql://localhost:3306/fithub?serverTimezone=GMT&useUnicode=true&characterEncoding=utf-8";
// 数据库用户名(根据需要改)
private static String username = "root";
// 数据库密码(根据需要改)
private static String password = "123456";
// 数据库表的前缀,如t_user(没有前缀就为"")
private static String tablePrefix = "";
// 生成的表(比较麻烦,需要把生成的表名一个一个添加到数组中去)
private static String[] tables = {"admin", "coach", "collect", "course", "equipment", "message","sign","user","vip"};
// 顶级包结构(不是必改项,根据自己的喜好改)
private static String parentPackage = "com.tensoflow";
// 数据访问层包名称(一般不需要改都是mapper名)
private static String dao = "mapper";
// 业务逻辑层包名称(一般不需要改都是service名)
private static String service = "service";
// 实体层包名称(可根据喜好改 如domain)
private static String entity = "entity";
// 控制器层包名称(一般不需要改都是controller名)
private static String controller = "controller";
// mapper映射文件包名称(一般不需要改都是mapper名)
private static String mapperxml = "mapper";
public static void main(String[] args) {
//1.全局配置
GlobalConfig config = new GlobalConfig();
config.setAuthor(author) // 作者
.setOutputDir(outputDir) // 生成路径
.setFileOverride(true) // 文件覆盖
.setIdType(IdType.AUTO) // 主键策略
.setServiceName("%sService") // 设置生成的service接口的名字的首字母是否为I,加%s则不生成I
.setBaseResultMap(true) // 映射文件中是否生成ResultMap配置
.setBaseColumnList(true); // 生成通用sql字段
//2.数据源配置
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig.setDbType(DbType.MYSQL) // 设置数据库类型
.setDriverName(driver) // 设置驱动
.setUrl(url) // 设置连接路径
.setUsername(username) // 设置用户名
.setPassword(password); // 设置密码
//3.策略配置
StrategyConfig stConfig = new StrategyConfig();
stConfig.setCapitalMode(true) // 全局大写命名
.setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
.setTablePrefix(tablePrefix) // 表前缀
.setInclude(tables) // 生成的表
.setEntityLombokModel(true); // 支持Lombok
//4.包名策略配置
PackageConfig pkConfig = new PackageConfig();
pkConfig.setParent(parentPackage) // 顶级包结构
.setMapper(dao) // 数据访问层
.setService(service) // 业务逻辑层
.setController(controller) // 控制器
.setEntity(entity) // 实体类
.setXml(mapperxml); // mapper映射文件
//5.整合配置
AutoGenerator ag = new AutoGenerator();
ag.setGlobalConfig(config)
.setDataSource(dsConfig)
.setStrategy(stConfig)
.setPackageInfo(pkConfig);
//6.执行
ag.execute();
}
}
Powered by Waline v2.15.8