目录
--mybatisplus的一对多映射,多个对象映射成一对一的原因
--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关键字的使用
-
union关键字的使用:在使用union操作符时,需要确保两个SELECT语句返回的列数、列名和数据类型是匹配的。请确保第一个SELECT语句和第二个SELECT语句返回的列数和列的类型是一致的。
-
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条来映射,得出的结果就只有两条了。