mybatisplus笔记

文章讨论了MybatisPlus中实体类时间注解不生效的问题,如何通过自定义MetaObjectHandler处理默认时间字段填充,以及一对多映射中出现一对一的原因和解决方案。还涉及union关键字的使用注意事项和前端数据类型对mybatisplus判断的影响。
摘要由CSDN通过智能技术生成

目录

--实体类时间注解不生效问题

--mybatisplus的一对多映射,多个对象映射成一对一的原因

--union关键字的使用

--mybatisplus,前端传输数据不为空,为什么不能进入不为空的判断标签?


--实体类时间注解不生效问题

public class A{
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    
    //...

    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

        上述代码中两个时间的注解,可以在插入对象时不设置这两个值,但在实际应用中没有生效。原因是没有一个实现MetaObjectHandler接口的类,添加上即可。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MybatisHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //属性名
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //属性名
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

        上述代码在插入数据时,会自动填充createTime和updateTime的值,可以根据需求来选择是否填充updateTime

--mybatisplus的一对多映射,多个对象映射成一对一的原因

场景描述:

        查询订单时,一个订单有多个子订单,但是映射出来却是一对一。

        这是mybatis内部是通过主键id来识别多条数据是否是重复的,而刚好子订单虽然有多个但是它除了id不一致,其他字段信息都一致,导致mybatis无法形成一对多的映射。

        注意:id和其他信息都不一致也许会导致一对一的映射形成,该点还没做过实验

解决方法:

        查询信息时带上id

--union关键字的使用

  1. union关键字的使用:在使用union操作符时,需要确保两个SELECT语句返回的列数、列名和数据类型是匹配的。请确保第一个SELECT语句和第二个SELECT语句返回的列数和列的类型是一致的。

  2. order by子句的使用:在使用union操作符后,对结果集进行排序可能会导致错误。这是因为union操作会对结果进行合并,而合并后的结果集可能无法保持原始的排序顺序。如果你需要对整个结果集进行排序,可以将union操作的结果作为子查询,然后在外部查询中使用order by子句。

    SELECT * FROM (
     SELECT ... 
        -- 第一个SELECT语句 
     UNION
     SELECT ...
        -- 第二个SELECT语句 )
     AS combined_result ORDER BY column_name; 

           将上面的示例代码中的column_name替换为你希望根据其排序的列名。这样,你就可以在order by子句中对整个结果集进行排序。 用union连接的sql,条件需要注意,是否是查询出来的数据都有这个字段,且字段名不能为其中一个select语句的字段名,要以共同的字段名称作为条件。

--mybatisplus,前端传输数据不为空,为什么不能进入不为空的判断标签?

 场景描述:

        前端传输的数据code=0,后端用String接收,且mybatisplus的xml文件中,用的标签也是判断String的语法。明明code不为null也不为空字符串,却不能进入以下判断中。

<if test=“code != null and code != ''”>
	and code = #{code}
</if>

问题分析:

        注意前端是code=0,而不是code="0",而且后端是用的String类型来接收。按照一般情况理解,code既不为null也不为空字符串,会进入此判断,但是却没有。

        这是因为,前端传的数字类型且值为0时(必须为0),后端以字符串的类型来判断,会把0判断成空字符串,这可以说是一个大坑。

        改为不判断空字符串则正常。

<if test=“code != null”>
	and code = #{code}
</if>

总结:

        在遇到这个问题之前,本人在开发时,并不是很在意前后端数据类型是否一致,只要处理好后端接受的类型就好(就像上面的code字段),但是遇到这个问题之后,在前后端传输数据时,建议还是得尽量保证数据类型一致,以免造成不必要的麻烦。

-- Mybatis使用collection分页问题

        使用mybatis的分页时,我们可以发现有个total参数,它表示分页查询的结果的总条数。在查询时,如果没有使用collection来映射一对多,那么没有任何问题,如果是一对多时,total表示的是多的那一方的条数。

        如现有订单表,数据100条,子订单表1000条,一条订单对应十条子订单。使用分页条件:current=1,size = 20来查询,且返回值的映射中用到了<collection>。我们可以先判断正确结果为查出订单表的20条数据,但实际结果只查得出两条,这是因为用left join查出来的结果为子订单的数量,这时选出前20条来映射,得出的结果就只有两条了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值