一、表结构
所有表:
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是查询的表中的字段名,两者相同的时候可以不写。
只要来日可期,今天就值得欣喜