MybatisPlus入门

标签: Springboot 分类: 杂文 创建时间:2020-08-11 01:17:18 更新时间:2025-01-17 10:39:22

算了,简单的记录下使用步骤吧。

1.pom.xml添加依赖

1
2
3
4
5
6
<!--MyBatis Plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>

2.配置application.yml

因为我要去掉自动映射,所以就添加了mybatis-plus配置,默认的话会出现字段名使用下划线线映射的问题。还有就是配置数据库,根据pom.xml中添加的数据库依赖,添加相关的数据库配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring:
datasource:
## default connection pool
hikari:
connection-timeout: 20000
maximum-pool-size: 5
username: xxx
password: xxx
url: jdbc:sqlserver://xxx:5433;databasename=xxx
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
mybatis-plus:
configuration:
mapUnderscoreToCamelCase: false
global-config:
db-config:
tableUnderline: false
capitalMode: true

3.编写实体类

1
2
3
4
5
6
@TableName(value = "WxUser")
public class WxUser {

@TableId
private String WxOpenid; // 微信OpenId
}

4.编写mapper

1
2
public interface WxUserMapper extends BaseMapper<WxUser> {
}

5.添加扫描

在启动类上添加@MapperScan,后面的内容一定要填,并且要定位到你mapper所在的文件夹

1
2
3
4
5
6
7
8
@SpringBootApplication
@MapperScan("com.bibichuan.databases.mapper")
public class Databases{

public static void main(String[] args) {
SpringApplication.run(Databases.class, args);
}
}

接下来就可以直接使用@Autowired注入WxUserMapper了,并调用其中的一些方法。但是还可以进一步的实现IService接口,充分利用MybatisPlus提供的更加丰富的查询方法。

6.定义Service接口

1
2
public interface WxUserService extends IService<WxUser> {
}

7.实现Service接口

1
2
3
@Service
public class WxUserServiceImpl extends ServiceImpl<WxUserMapper, WxUser> implements WxUserService {
}

8.使用Service接口

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private WxUserService wxUserService;

@RequestMapping("/get")
public List<WxUser> getAll(){
List<Object> list=wxUserService.listObjs();

return wxUserService.list();
}
}

这样就算大功告成了。

参考文章:
1.Spring Boot (八): Mybatis 增强工具 MyBatis-Plus (我看重这篇文章,主要是因为这篇文章有相关的IService接口的实现例子)

9.使用mapper.xml接口

10.判断两个字段是否相等

需求:判断数据库字短里面的两个列是否相同。

参考文章:
【1】.使用Mybatis-plus如何对数据库表的内部字段进行比较 首先创造一个查询条件构造器LambdaQueryWrapper,用apply()方法来设定查询条件
【2】.apply 拼接SQL
【3】.mybatis-plus判断表的两个字段相等?
【4】.mybatis plus两字段相减>0 queryWrapper.gt(Entity::getFiled1,Entity::getFiled2) 这个不太对,因为我尝试没有这钟写法

问题

(1) 数据查询不到
我先用save插入了一条记录,然后执行立刻执行查询命令,这个时候查询不到最新的记录。

我尝试了在类上,在方法上进行 @Transactional(isolation = Isolation.READ_UNCOMMITTED) 注解,打开事务,结果不生效。


(2) can not find lambda cache for this property [updateTimestamp] of entity [com.dji.sample.manage.model.entity.DeviceHmsEntity]
我在 entity 里面设置了一个属性,想要在 lambada 查询的时候用上,结果总是报这个错误, 主要就是这个 getUpdateTimestamp 方法。

1
2
3
4
5
6
LambdaQueryWrapper<DeviceHmsEntity> queryWrapper = new LambdaQueryWrapper<DeviceHmsEntity>();
queryWrapper.setEntityClass(DeviceHmsEntity.class);
queryWrapper.and(wrapper -> param.getDeviceSn().forEach(sn -> wrapper.eq(DeviceHmsEntity::getSn, sn).or()))
.between(param.getBeginTime() != null && param.getEndTime() != null,
DeviceHmsEntity::getCreateTime, param.getBeginTime(), param.getEndTime())
.eq(param.getUpdateTime() != null, DeviceHmsEntity::getUpdateTimestamp, param.getUpdateTime())

【尝试方案】
(1)TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), “”), DeviceHmsEntity.class),没有用
(2)增加 lambdaQueryWrapper.setEntityClass(getCaseEntityClass()),结果没有用

【解决方案】
其实最后我也没有解决这个问题,就是换了一种查询方法,就是查询两个列是否相同的方法。

参考文章:
【1】.MybatisPlusException: can not find lambda cache for this entity[]异常 ReflectionKit.getSuperClassGenericType
【2】.mybatis报错:can not find lambda cache for this property 因为MP3.2+之后不会缓存实体类的父类字段信息,所以在使用泛型的Lambda表达式时会报错.TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), “”), FlowDone.class) ;
【3】.简化业务代码开发:看Lambda表达式如何将代码封装为数据
【4】.解决使用LambdaQueryWrapper 报错MybatisPlusException: can not find lambda cache的问题 1.清理缓存;2.使用不同的LambdaQueryWrapper实例;3.检查Lambda表达式;4.升级Mybatis Plus版本;5.检查数据库连接;6.查看日志;7.自定义缓存策略。
【5】.MybatisPlusExcepection: can not find lambda cache for this property [XX] for entity [xxx] 实体类缓存也就没有了,所以我重写了:com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#currentModelClass
【6】.MybatisPlusException: can not find lambda cache for this entity[]异常解决
【7】.解决使用LambdaQueryWrapper时出现MybatisPlusException: can not find lambda cache for this property的错误
【8】.Mybatis Plus报错: can not find lambda cache TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), “”), 条件类名.class)

(3) SpringBoot中@RequestBody不能和Multipart同时传递

【解决方案】
主要解决方案,就是不用 @RequestBody,直接用 实体接受参数

参考文章:
【1】.解决SpringBoot中@RequestBody不能和Multipart同时传递的问题 去掉 @RequestBody 注解就可以
【2】.@RequestBody和 MultipartFile 可以同时使用吗? 1.通过一个对象来接收文件上传和其他参数;2.,你可以使用 @RequestParam 来获取表单字段和 MultipartFile 来获取文件;3.如果你想同时接收 JSON 数据和上传文件,你可以使用 @RequestPart 注解
【3】.解决SpringBoot中@RequestBody不能和Multipart同时传递的问题 使用Map来接收参数
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。