MyBatisPuls中注解开发一对多和多对多开发

在使用MyBatisPlus的时候,相信很多小伙伴也很不喜欢一大堆的配置文件,看起来眼花缭乱的,一点的不舒服,而且巧了,我也是不喜欢配置文件的编程。如果你是学习使用MyBatis,我不建议你使用MyBatisPlus的自动封装的操作,虽然很方便,但是会让人变的懒惰,从而对SQL的陌生成度也会大大增加,彻底的变为工具人。学习,就是在不断的踩坑,然后再不断的填坑,让及非常的抗揍,这才是学习的乐趣与意义。
扯远了,接下来我们看一下注解式开发中一对一的情况:
one=@One(select("namespace")),这句的意思是一对多或者一对一(MyBatis官方将其称作一对一),它的大概意思就是一个对象中的属性或者JavaBean对应其他多个对象,如下

@NoArgsConstructor
@Data
@ToString
@TableName("t_bolg")
public class Bolg implements Serializable {

    @TableId("id")
    private Long id;//id
    private String title;//标题
    private String content;//内容
    private String firstPicture;//首图
    private String classType;//分类
    private Integer views;//浏览次数
    private String appreciation;//赞赏开启
    private String shareInfo;//分享
    private String commentable;//评论开启
    private String published;//发布或者保存
    private String recommend;//是否推荐
    private String createDateTime;//发布时间
    private String updateDateTime;//更新时间
    private String username;//用户名
    private String original;//是否原创
    private String tTagList;//博客标签
    @TableField(exist = false)
    private List<String> tagList;//获得所有标签
    @TableField(exist = false)
    private List<String> typeList;//获得所有分类
    @TableField(exist = false)
    private Admin admin;//管理员
    @TableField(exist = false)
    private List<Comment> commentList;
}

这是一个实体类,对应数据库中的一个表,其中@TableField(exist = false)表示这个属性不是数据库字段,我们看一下具体的操作

@Select("select id,title,content,first_picture,username,class_type from t_bolg where id = #{id}")
    @Results(value = {
//            这里的colum可以传上面结果不需要的值,否则下面的值为空,必要的值不用传入,否则上面结果传入的值需要定义
            @Result(property = "tagList",column = "username",one = @One(select = "cn.edu.gues.mapper.AdminBolgMapper.selectTagList")),
            @Result(property = "typeList",column = "class_type",one = @One(select = "cn.edu.gues.mapper.AdminBolgMapper.selectTypeList"))
    })
    TagBolg selectByIdBolg(Long id);

    @Select("select * from t_type")
    List<Type> selectTypeList(String id);
    @Select("select * from t_tag")
    List<Tag> selectTagList(String id);

最上面的select是总的查询语句,也就是selectByIdBolg(Long id)的最后结果,@Results的意思是对上面的select结果进行处理,对于字段和属性一致的我们不需要指定,MyBatis会自动帮我们完成,我们需要关心的就是就@Results里面的语句(这里讲一下一个小坑,看下图)
在这里插入图片描述
上面的username其实是我不需要,但是有要作为参数传进去做的一个演示,比如我们需要的是id,那就将上面的username改为id传递进去即可,再看一下数据库中对应的两个表(这里使用的是lombok,就不介绍了)
Type类

@TableName("t_type")
public class Type implements Serializable {
    private Long id;
    @TableId("name")
    private String name;
    @TableField(exist = false)
    private Integer size;
}

Tag类

@TableName("t_tag")
public class Tag implements Serializable {
    private String tType;
    private String name;
}

看一下运行的结果,由于数据过多,我们使用两张进行观看
在这里插入图片描述
在这里插入图片描述
这里得到的结果和我们预想的一样,但是这样的SQL语句并没有优化,会导致性能下降,可以使用条件和需要的字段进行删选即可
接下来我们看一下多对多的情况,其实和上面的差不多many=@Many(select(namespace)),这就是多对多的语句,其实jpa就比较操作这些,但是jpa可能会让一个人变懒,不爱探究。

 @Select("select id,substr(content,1,300) as content,title,update_date_time,views,type,first_picture,username from t_tag where class_type=#{type} limit #{page},#{size}")
    @Results(value = {
            @Result(property = "typeList",column = "type", many = @Many(select = "cn.edu.gues.mapper.AdminBolgMapper.queryBolg"))
    })
    Integer size();
    @Select("select * from t_bolg where type = #{type}")
    List<Type>queryType(String type);

上面的 语句就是一个集合对应另一个集合,也就是我们说的多对多的情况,由于这里没有数据,就不进行演示了,最上面的@Select是查询博客的信息,但是一个博客可能有多个分类,我们查询出的博客可能又很多,每个分类又对应多个标签,这就是多对多的应用。其中result就是我们要操作的属性,其中和我们分别查询出的数据进行整理是一个意思的,刚开始用的时候,可能理解不了,但是使用多了就掌握了。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值