Mybatis
ResultMap和ResultType
在select标签中,这两个属性不可能同时存在,但是也不可以都不存在,需要存在一个
ResultType一般表示的是方法返回元素的数据类型
ResultMap一般用于多表中,数据的映射(主要是因为sql中的字段和pojo实体类的属性不一致情况下)
pojo实体类属性和表中字段自动的映射
比如:
表中字段:id,name,avatar,author_id,nick_name,deleted,description
对应pojo实体类中的属性应该为:id,name,avatar,authorId,nickName,deleted,description
(如果不符合上面的映射规则,则需要通过ResultMap进行属性和字段之间的映射)
select语句尽量使用参数ResultMap而不是ResultType,特别是实体类和表字段不规范情况下
查询语句返回总数的时候,需要使用resultType
查询语句返回对象的话,需要使用的是ResultMap
Invalid bound statement (not found)
根本的原因是因为mybatis相关的文件没有构建好,也就是没有加载进去
常见的解决办法:
1、观察mapper包,在启动类中是否添加了扫描注解进行扫描
2、在配置文件中是否将mapper.xml的路径是否配置好
3、查看mapper.xml的namespace是否填写正确
3、如果上面的操作都弄好,那就是看下target文件中是否存在xml文件
target文件中没有xml文件的解决办法:
1)在pom文件中添加以下代码,将xml文件构建进去
</build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
2)第一种方法无效的话,重新构建下,先maven clean ,然后build构建(我就是这个方法解决的)
查看是否构建
(构建后看target中是否存在xml文件)
注意的是sql语句的使用
- id列表查询
<select id="getByClaIdList" resultMap="Class">
select
<include refid="colu"/>
from 表
<where>表字段in
<foreach collection="itemList" item="item" open="(" separator="," close=")">#{item}
</foreach>
</where>
</select>
并且传入的列表需要使用参数注解进行标识
2)对象和单个变量对于引用多条件的使用
(这个多条件针对对象,单参数不可以使用(注意))
MybatisPlus
分页查询返回list不执行语句而返回count
使用分页查询的时候,返回一个列表的时候,查询语句返回的是count(0)
原因:
原因内容来自:https://blog.youkuaiyun.com/starryninglong/article/details/124091296
总结原因:是执行语句之前会先进行count查询,如果aftercount=false之后会跳过我们写的list语句,为true的条件为page.getPageNum() > 0 && count > page.getStartRow();必须要返回true,即page.getPageNum()必须要大于0,也就是分页的参数起始页码应该要从1开始而不是0,所以修改分页参数为1后setCurrPage(1)。
解决办法:
除非将page和limit特殊处理传值
注:page和limit特殊处理的条件:count(也就是limit)>第一页的总数 ; page>0
pagehelper分页查询遇到的问题
pagehelper的使用:
- 稍后更新
返回分页数据出错
需要知道的是,pagehelper分页的话,Pagehelper.startPage(xxx),后面紧接着一个sql语句,只会作用到这一个sql语句上面
遇到的问题:我将查询出的list列表转换为返回参数的列表,数据的返回分页出现错误,所以我们需要进行一个转换。
public PageInfo query(Friends friends) {
if (friends != null && friends.getPage() != null) {
PageHelper.startPage(friends.getPage(), friends.getLimit());
}
List friendsList = friendsMapper.queryAll(Maps.build().beanToMap(friends));
这里进行了转换,下面不可以直接输出friendVos
List friendVos = CmsMapper.INSTANCE.convertTofVo(friendsList);
if (!CollectionUtils.isEmpty(friendsList)) {
List uidList = friendsList.stream().map(Friends::getFriendId).collect(Collectors.toList());
System.out.println(uidList);
List userList = userMapper.selectByIds(uidList);
if (!CollectionUtils.isEmpty(userList)) {
Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getId,
Function.identity()));
friendVos.forEach(x -> {
User user = userMap.get(x.getFriendId());
if (Objects.nonNull(user)) {
x = insert(x, user);
}
});
}
}
注意这里不能直接返回new PageInfo<>(friendVos);
因为这样返回的话,分页的相关数据会报错,需要通过下面的转换才可以进行返回,
PageInfo pageResult = new PageInfo<>(friendsList);
pageResult.setList(friendVos);
return pageResult;
}
mapstruct
问题1:如果出现报错:java.lang.ClassNotFoundException
(出现的问题是创建的mapper找不到类)
解决办法:
1、检查是否导入依赖包
2、注解mapper是否使用正确,引用的包是否正确
实际遇到过:
问题描述:
我没有引用mapstruct的依赖,但是使用注解的时候发现其他依赖包中存在mapstruct依赖所以没有引用正确的,导致出现报错java.lang.ClassNotFoundException,然后我放置相关依赖,把其他依赖包中的mapstruct依赖除去,重新导入注解的包,再次运行之后,问题解决
总结:导正确的mapstruct依赖——》将其他依赖中的mapstruct包去除——》重新引用
问题2:list类型的相互转换不要使用@Mapping注解进行映射
如果使用的话会报错,属性获取不到,只有对象之间映射才不报错
String字符串
isBlank()和isEmpty()的使用
使用的依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
两者区别:
1.isEmpty 是以是否为空和是否存在为判断依据。(但是对于空格没有判断)
2.isBlank 是在 isEmpty 的基础上进行了为空(字符串都为空格、制表符、tab 的情况)的判断。(一般更为常用)
@RequestBody
@RequestBody这个注解一般是和post请求进行使用的
如果发送post请求后,参数没有接收到,检查是否使用了这个注解
Stream流
使用stream流进行插入数据的话,要注意的是记得判空校验,防止报空指针异常
比如: