编写代码常见的问题(遇到更新)

本文讨论了在Mybatis中ResultMap和ResultType的使用,强调了在字段不规范时使用ResultMap的重要性。还提到了'Invalid bound statement (not found)'错误的常见解决方案。在MybatisPlus中,解释了分页查询返回count而非list的问题。此外,文章还涉及了PageHelper分页查询的注意事项,以及在使用MapStruct时遇到的ClassNotFoundException和list转换的限制。最后,简单介绍了String的isBlank()和isEmpty()方法的区别,并提及了@RequestBody注解在POST请求中的应用和Stream流的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis

ResultMap和ResultType

在select标签中,这两个属性不可能同时存在,但是也不可以都不存在,需要存在一个
ResultType一般表示的是方法返回元素的数据类型
ResultMap一般用于多表中,数据的映射(主要是因为sql中的字段和pojo实体类的属性不一致情况下)

pojo实体类属性和表中字段自动的映射

比如:
表中字段:id,name,avatar,author_idnick_name,deleted,description
对应pojo实体类中的属性应该为:id,name,avatar,authorIdnickName,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语句的使用

  1. 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流进行插入数据的话,要注意的是记得判空校验,防止报空指针异常
比如:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值