比如丈夫表和妻子表,丈夫表里面含有妻子的外键,那么我们在做查询的时候,我们就在想我们只需要丈夫信息不需要妻子信息的时候,就只查询丈夫的基本信息,而不用连妻子信息一起查询出来,当我们需要的时候,再查询丈夫的时候一起把妻子的信息一起查出来。
那么这里我们就需要用到懒加载,去解决这种一对一,多对多等这种关系。不过在这种关系中需要注意的是:不能循环调用彼此的方法,意思就是我在结果集中调用另外一个方法,那么这个方法的结果集不能反过来再调用我,说起来很抽象。
举个简单例子:假设丈夫有妻子外键,妻子有丈夫外键,查找丈夫信息时把妻子信息查出来,查妻子时把丈夫信息查出来(下面就进行了相互调用,是错误的方式)
解决办法就是去掉妻子中的
查询丈夫就用getHusbandBeanById,查询妻子就用getWifeBeanById2,这样就分离了,避免循环套用
这里用妻子对象和丈夫对象(分别对应表妻子表,丈夫表,丈夫表中有妻子的外键)
HusbandBean:(对应表属性:id,hus_name,age,fk_wife_id)
private Integer id;
private String husbandName;
private Integer age;
private WifeBean wife;
WifeBean:(对应表属性:id,wife_name,age)
private Integer id;
private String wifeName;
private Integer age;
丈夫接口的方法:
HusbandBean getHusbandBeanById(@Param("id")int id);
丈夫xml映射对应的查询方法:
对于表中我们需要查询的列,需要和对象的属性进行映射,在xml的映射配置中的结果集映射中我们就该使用
妻子接口方法:
WifeBean getWifeBeanById(@Param("id") int id);
妻子xml映射对应的查询方法:
妻子的通过id查询的方法:(返回用resultType的话,并且用对象去接收返回结果那么必须取别名,和类的属性一致,才能接受到数据)resultType接受数据可以是对象、Map、基本数据类型,引用数据类型。
比如老师和学生的关系,一个老师可以有多个学生,那么老师就含有学生的一个集合,那么情况与上述情况类似,那么这些学生中就会含有这个老师的外键,那么我们在查询老师信息的时候也要实现懒加载,当我们需要学生信息才查询,不需要学生信息就只去查询老师自身的信息。
这里就举例老师和学生(学生表中含有老师表的外键)
TeacherBean:(表属性 id,teacher_name,age)
private Integer id;
private String teacherName;
private Integer age;
/**
* 站在老师的角度上来说,一个老师对应多个学生
*/
private List stus;
StudentBean:(表属性 id,student_name,age,fk_teacher_id)
private Integer id;
private String studentName;
private Integer age;
/**
* 一个学生只对应一个老师
*/
private TeacherBean teacher;
老师接口方法:
TeacherBean getTeacherBeanById(@Param("id") int id);
在xml的映射配置中的结果集映射中我们就该使用
在上面的关联关系中已经说了,不管是关联association还是集合collection,它们在调用方法的时候,如果在同一篇文件中,select属性可直接写方法名(方法的id名),如果调用其他xml映射配置的方法,要写全路径名。
对于学生而言,在我这个例子里面,一个学生对应一个老师,那么,要想在查询学生信息时,对老师的信息,也实现懒加载,就用第一种association方式,细节不多讲了,上面已经写了,直接看代码。
学生接口方法:
StudentBean getStudentBeanById(@Param("id") int id);
学生xml的映射配置:
在上面的collecton介绍中,它用于了一对多的关系,同时他也用于多对多的关系,存在多对多关系的话,那么双方都不可能去写具体的外键了,那么就需要一个中间表来将双方的关系进行串联起来。
这里我就用玩家和游戏的例子来进行,一个玩家可以选择多个游戏,一个游戏可以对应多个玩家。那么要实现查询玩家时同时查询出游戏,查询游戏时查出玩家,看下面代码。
PlayerBean:(表属性:id,player_name)
private long id;
private String playerName;
private List games;
GameBean:(表属性:id,game_name)
private long id;
private String gameName;
private List palyers;
中间表t_player_game属性:id,fk_player_id,fk_game_id
玩家接口方法:
List findPlayerBeanListByObject(@Param("p") PlayerBean player);
玩家xml映射配置:
同样的,查询游戏的时候也是这种方法,只需要修改一部分代码。