Mybatis Plus 笔记记录
- 1. 代码生成器使用
- 2. BaseMapper方法使用
- 数据库环境准备
- 2.1 insert 实体类插入
- 2.2 deleteById 根据id删除
- 2.3 deleteById 根据id删除 参数为实体类
- 2.4 deleteByMap 参数为Map
- 2.5 delete 根据条件构造器使用
- 2.6 deleteBatchIds 根据id批量删除
- 2.7 updateById 根据id更新 参数为实体类对象
- 2.8 update 使用条件构造器 参数为实体类和 条件构造器对象
- 2.9 selectById 根据单个id查询
- 2.10 selectBatchIds 根据批量id查询
- 2.11 selectByMap 根据Map对应的key value拼接where条件查询
- 2.12 selectOne 使用条件构造器
- 2.13 exists 使用条件构造器 判断是否存在记录
- 2.14 selectCount 使用条件构造器 查询总记录数
- 2.15 selectList 使用条件构造器 查询多条记录
- 2.16 selectMaps 使用条件构造器 查询你需要的字段,根据你的条件构造器传入来确定配合select使用
- 2.17 selectObjs 使用条件构造器 只返回查询条件的第一个字段的值
- 2.18 selectPage 使用条件构造器 查询分页记录
- 2.19 selectMapsPage 使用条件构造器
- 3. 条件选择器使用
- 4. lambda条件构造器使用 好处:防误写 写错数据库字段列
- 5. 自定义sql及分页查询
- 6. AR模式、主键策略和基本配置
- 7. 通用Service 提供的方法
1. 代码生成器使用
1.0 配置
server:
port: 8088
spring:
# 配置数据源信息
datasource:
# 配置连接数据库信息
#本地地址:“127.0.0.1”
#数据库名称:“db2”
url: jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
#数据库账户
username: root
#数据库密码
password: root
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
1.1 引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!--模板引擎-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2 交互式生成
public class CodeGenerator {
private static final String URL = "jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2b8";
private static final String OUTPUT_DIR = "D:/Spring Code Compile Project/demo/src/main/java";
private static final String MAPPER_XML_DIR = "D:/Spring Code Compile Project/demo/src/main/resources/mapper";
public static void main(String[] args) {
FastAutoGenerator.create(URL,"root","root")
// 全局配置
.globalConfig((scanner, builder) -> builder.author(scanner.apply("请输入作者名称?"))
//覆盖已生成文件默认为false
.fileOverride()
//指定输出目录
.outputDir(OUTPUT_DIR)
//开启 swagger 模式 默认为false
)
// 包配置
.packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名?"))
//路径配置信息 Collections.singletonMap(OutputFile.mapperXml, "D://")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml,MAPPER_XML_DIR))
)
// 策略配置
.strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
//增加过滤表前缀
.addTablePrefix("tbl_")
//实体策略配置
.entityBuilder()
//开启链式模型 默认值:false
.enableChainModel()
//开启 lombok 模型 默认值:false
.enableLombok()
//开启生成实体时生成字段注解 默认值:false
.enableTableFieldAnnotation()
//添加表字段填充
.addTableFills()
.addTableFills(
new Column(
"create_time", FieldFill.INSERT
)
)
//controller 策略配置
.controllerBuilder()
//开启驼峰转连字符 默认值:false
.enableHyphenStyle()
//开启生成@RestController 控制器 默认值:false
.enableRestStyle()
//格式化文件名称
.formatFileName("%sController")
//mapper 策略配置
.mapperBuilder()
//启用 BaseResultMap 生成 默认值:false
.enableBaseResultMap()
//格式化 mapper 文件名称
.formatMapperFileName("%sMapper")
//格式化 xml 实现类文件名称
.formatXmlFileName("%sMapper")
//service 策略配置
.serviceBuilder()
//格式化 service 接口文件名称
.formatServiceFileName("%sService")
//格式化 service 实现类文件名称
.formatServiceImplFileName("%sServiceImpl")
.build()
)
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
/**
* 处理所有表的情况
* @param tables
* @return
*/
protected static List<String> getTables(String tables) {
return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}
}
2. BaseMapper方法使用
数据库环境准备
数据库:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
`date_` timestamp NULL DEFAULT NULL COMMENT '出生时间',
`istop` tinyint(4) DEFAULT NULL COMMENT '是否置顶',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1682271009801224197 DEFAULT CHARSET=utf8;
实体类:
@Data
@Accessors(chain = true)
@TableName("user")
public class User extends Model implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/**
* 姓名
*/
@TableField("name")
private String name;
/**
* 年龄
*/
@TableField("age")
private Integer age;
/**
* 邮箱
*/
@TableField("email")
private String email;
/**
* 出生时间
*/
@TableField("date_")
private Date date;
/**
* 是否置顶
*/
@TableField("istop")
private Integer istop;
/**
* 字段排除
*/
@TableField(exist = false)
private String game;
}
Mapper:
public interface UserMapper extends BaseMapper<User> {
List<User> select(Integer pageIndex,Integer pageSize);
}
2.1 insert 实体类插入
插入语句 需要对应实体类
User user = new User();
user.setName("刘佩切");
user.setAge(88);
user.setDate(new Date());
user.setGame("lol");
int insert = userMapper.insert(user);
System.out.println(insert);
2.2 deleteById 根据id删除
int i = userMapper.deleteById(1682271009801224197L);
System.out.println(i);
2.3 deleteById 根据id删除 参数为实体类
int i = userMapper.deleteById(new User().setId(1682271009801224194L));
System.out.println(i);
2.4 deleteByMap 参数为Map
Map<String, Object> map = new HashMap<>();
map.put("name","xiaolong");
map.put("age","19");
int i = userMapper.deleteByMap(map);
System.out.println(i);
2.5 delete 根据条件构造器使用
QueryWrapper<User> query = Wrappers.query();
query.eq("name","ez");
int delete = userMapper.delete(query);
System.out.println(delete);
2.6 deleteBatchIds 根据id批量删除
List<Long> list = Arrays.asList(1682270752224821250l, 1682270797389086721L);
int i = userMapper.deleteBatchIds(list);
System.out.println(i);
2.7 updateById 根据id更新 参数为实体类对象
int i = userMapper.updateById(new User().setId(3l).setName("JIAKESI"));
System.out.println(i);
2.8 update 使用条件构造器 参数为实体类和 条件构造器对象
QueryWrapper<User> query = Wrappers.query();
query.eq("name","张飞");
int update = userMapper.update(new User().setId(1682270611774357505L), query);
System.out.println(update);
可以不传user实体类:
UpdateWrapper<User> updateWrapper=new UpdateWrapper<>();
updateWrapper.eq("name","Jone").set("age",88);
int update = userMapper.update(null, updateWrapper);
System.out.println(update);
2.9 selectById 根据单个id查询
User user = userMapper.selectById(4L);
System.out.println(user);
2.10 selectBatchIds 根据批量id查询
List<Integer> list = Arrays.asList(1, 2, 3, 4);
List<User> list1 = userMapper.selectBatchIds(list);
list1.forEach(item-> System.out.println());
2.11 selectByMap 根据Map对应的key value拼接where条件查询
Map<String,Object> map =new HashMap();
map.put("name","Jack");
map.put("age","19");
List<User> list = userMapper.selectByMap(map);
list.forEach(e-> System.out.println());
2.12 selectOne 使用条件构造器
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
QueryWrapper<User > query = Wrappers.query();
queryWrapper.apply(true,"name Like BINARY '%J%' ").eq("age",18);
User user = userMapper.selectOne(queryWrapper);
System.out.println(user);
2.13 exists 使用条件构造器 判断是否存在记录
QueryWrapper<User> query = Wrappers.query();
query.eq("id",1682270611774357505L);
boolean update = userMapper.exists(query);
System.out.println(update);
2.14 selectCount 使用条件构造器 查询总记录数
QueryWrapper<User> query = Wrappers.query();
query.like("name","j");
Long update = userMapper.selectCount(query);
System.out.println(update);
2.15 selectList 使用条件构造器 查询多条记录
/**
* 名字中包含J并且年龄小于21的
*/
/**
* 两种构造形式
*/
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
QueryWrapper<User > query = Wrappers.query();
queryWrapper.apply(true,"name Like BINARY '%J%' ").lt("age",21);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(e-> System.out.println());
2.16 selectMaps 使用条件构造器 查询你需要的字段,根据你的条件构造器传入来确定配合select使用
QueryWrapper<User> query = Wrappers.query();
query.like("name","j");
List<Map<String, Object>> userMaps = userMapper.selectMaps(query);
for (Map<String, Object> userMap : userMaps) {
for (Map.Entry<String, Object> entry : userMap.entrySet()) {
String columnName = entry.getKey();
Object columnValue = entry.getValue();
System.out.println(columnName + ": " + columnValue);
}
}
2.17 selectObjs 使用条件构造器 只返回查询条件的第一个字段的值
QueryWrapper<User> query = Wrappers.query();
query.like("name","j");
List<Object> objects = userMapper.selectObjs(query);
for (Object obj : objects) {
// 使用 obj 进行进一步的类型转换和处理
Long userId = (Long) obj; // 假设 obj 是 Long 类型
System.out.println("User ID: " + userId);
// 进一步处理...
}
2.18 selectPage 使用条件构造器 查询分页记录
QueryWrapper<User> query = Wrappers.query();
Page<User> userPage = userMapper.selectPage(new Page<>(2, 2), query);
System.out.println(userPage.getRecords());
System.out.println(userPage.getTotal());
2.19 selectMapsPage 使用条件构造器
QueryWrapper<User> query = Wrappers.query();
Page<Map<String, Object>> mapPage = userMapper.selectMapsPage(new Page<>(1, 2), query);
List<Map<String, Object>> records = mapPage.getRecords();
for (Map<String, Object> record : records) {
for (Map.Entry<String, Object> entry : record.entrySet()) {
String columnName = entry.getKey();
Object columnValue = entry.getValue();
System.out.println(columnName + ": " + columnValue);
}
}
3. 条件选择器使用
nested 嵌套使用
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.nested(i->i.gt("age",40).or().isNotNull("email")).likeRight("name","j");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
select 排除 不需要展示的字段or需要展示字段
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.in("age",Arrays.asList(13,18,16,17,28)).last("limit 1")
.select(User.class,info->!info.getColumn().equals("age")&&!info.getColumn().equals("name"));
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
condition作用 是否拼接语句的条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
String name="J";
queryWrapper.likeRight(ObjectUtils.isNotEmpty(name),"name",name);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
实体作为 条件构造器构造方法的参数
User user=new User().setName("Jone").setAge(18);
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
Alleq 用法
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String, Object> map = new HashMap<>();
map.put("name", "Jone");
map.put("age", 18);
queryWrapper.allEq(map);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
/**
* 过滤掉name的参数
*/
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String, Object> map = new HashMap<>();
map.put("name", "Jone");
map.put("age", 18);
queryWrapper.allEq((k,v)->!k.equals("name"),map);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
group by 使用
4. lambda条件构造器使用 好处:防误写 写错数据库字段列
/**
* 创建Lambda构造器的几种方式
*/
//直接new
// LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
//QueryWrapper.lambda
// LambdaQueryWrapper<User> userQueryWrapper=new QueryWrapper<User>().lambda();
//Wrappers工具类
LambdaQueryWrapper<User> query = Wrappers.lambdaQuery();
query.likeRight(User::getName,"j").gt(User::getAge,18);
List<User> list = userMapper.selectList(query);
list.forEach(System.out::println);
LambdaQueryChainWrapper
List<User> userList = new LambdaQueryChainWrapper<User>(userMapper).likeRight(User::getName, "j")
.gt(User::getAge, 18).list();
userList.forEach(System.out::println);
5. 自定义sql及分页查询
5.1 自定义sql
public interface UserMapper extends BaseMapper<User> {
@Select("select * from user ${ew.customSqlSegment}")
List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
}
LambdaQueryWrapper<User> query = Wrappers.lambdaQuery();
query.likeRight(User::getName,"j").gt(User::getAge,18);
List<User> userList = userMapper.selectAll(query);
userList.forEach(System.out::println);
5.2 分页查询
selectPage
LambdaQueryWrapper<User> query = Wrappers.lambdaQuery();
//第三个参数传递false则 不会执行 select count(1) from table 查询总记录数的语句
Page<User> page = new Page<>(2, 2,false);
IPage<User> userPage = userMapper.selectPage(page, query);
System.out.println("总页数 =="+userPage.getPages());
System.out.println("总记录数 =="+userPage.getTotal());
userPage.getRecords().forEach(System.out::println);
selectMapsPage
6. AR模式、主键策略和基本配置
User user=new User();
user.setName("孙悟空");
user.setAge(999);
boolean insert = user.insert();
System.out.println(insert);