mybatisplus笔记

目录

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

--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也不为空字符串,却不能进入以下判断中。


	and code = #{code}

问题分析:

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

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

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


	and code = #{code}

总结:

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

你可能感兴趣的:(开发经验,笔记,java,spring)