mybatis一对多、多对多查询(注解版)

一、表结构

所有表:

Books表(书名表):

Class表(年级表):

Class_books表(年级和书多对多关系产生的表):

List表(标题表,储存每本书中的章节题目):

二、实体类

books表的实体类

public class Books {
    private int books_id;
    private String name;
    private String writer;
    private List<Lists> list;
    private List<class_books> class_books;
//省略get,set等方法
}

class表的实体类

public class schoolClass {
    private int class_id;
    private String class_name;
    private List<class_books> class_books;
}

class_books表的实体类

public class class_books {
    private int class_id;
    private int teaching_id;
    private List<Books> books;
    private List<schoolClass> schoolClasses;
}

 list表的实体类

public class Lists {
    private int list_id;
    private String str;
    private int id;
  
}

三、一对多查询

本次一对多查询是查询books表中的每条记录对应的多个list表中的记录,list表的外键是books表的主键

代码:

@Select("select * from books")
    @Results({
            @Result(property = "books_id",column = "books_id"),
            @Result(property = "list",column = "books_id",
                    javaType = List.class,
                    one = @One(select = "li.com.dao.UserMapper.y_d2"))
    })
    public List<Books> y_d1();
    @Select("select * from list where id=#{books_id}")
    public List<Lists> y_d2(@Param("books_id") int books_id);

方法y_d1中,

@Results中的第一个注解@Result中property后填的值为该表实体类的属性名,后面的column后填对应的表中字段名,如果字段名与对应的属性名相同则不需要写。

最后一个@Result中写的是books表的实体类需要传入对应的list表的实体类,column后填books表的主键(list表的外键),javaType后的值表示传入对应表的实体类是单个的还是多个的,多个的就用List.class,单个的就用实体类名.class

li.com.dao.UserMapper.y_d2表示这里的属性list需要传入的值是哪个查询语句的运行结果,代码会调用这个方法。

方法y_d2中,

@Param("books_id")表示传过来的参数名。

运行结果(修改过输出格式):

四、多对多查询

根据一对多的查询方式,先通过class表查找到class_books表中class_id对应的books_id,然后通过这个books_id来找到books表中对应的记录

代码

@Select("select * from class")
    @Results({
            @Result(property = "class_books",column = "class_id",
                    javaType = List.class,
                    one = @One(select = "li.com.dao.UserMapper.d_d2"))
    })
    public List<schoolClass> d_d1();
    @Select("select * from class_books where class_id=#{class_id}")
    @Results({
            @Result(property = "books",column = "teaching_id",
                    javaType = List.class,
                    one = @One(select = ("li.com.dao.UserMapper.d_d3")))
    })
    public List<class_books> d_d2(@Param("class_id") int class_id);

    @Select("select * from books where books_id=#{teaching_id}")
    public List<Books> d_d3(@Param("teaching_id") int teaching_id);

逻辑与一对多查询相同,只是需要中间多一个查询class_books表的过程。

运行结果:

五、部分可能出现的报错 

1,注解中返回数据出错 

Statement returned more than one row, where no more than one was expected.

意为:语句返回多行,其中预期不超过一行。

解决方法:

 多条的返回值需要用List.class

2、查询表的返回值不能存到属性中

可以运行但是该有数据的位置为“null”

解决方法:

查看实体类中属性名是否与表的字段名相同,修改属性名、修改表的字段名或者给表的字段起别名。

3、空指针异常

与第一种错误相同,只是应该传入对象的部分没有传入东西,解决方法也是查看传入对象的类与需要传入的对象的类是否相同 

4、SQL语句错误

修改sql语句 

六、总结 

        这里的多对多查询方法比较繁琐,还有左连接查询等其他查询方法

这两个查询主要是要知道注解@Results中参数表示什么意思,property的值是查询表的实体类中的属性名,column是查询的表中的字段名,两者相同的时候可以不写。

只要来日可期,今天就值得欣喜

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

{春树樱良}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值