|
n+1问题对系统的性能影响是不言而喻的,ibatis和hibernate一样也存在n+1问题,比如一个学生所属的班级,
在查询学生的时候同时把班级信息也查询出来,如果按照ibatis普通的多对一映射方法配置的话,就会出现n+1问题。
其实ibatis有种方法可以避免的,代码如下。
ibatis配置文件:
<resultMap class="student" id="studentResultMap">
<result property="id" column="stuId" />
<result property="name" column="stuName" />
<result property="classes.id" column="id" />
<result property="classes.name" column="name" />
</resultMap>
<select id="findAllStudents" resultMap="Classes.studentResultMap">
SELECT c.id,c.name,s.id stuId,s.name stuName
FROM student s
JOIN classes c
ON c.id=s.classid
</select>
类:
public class Classes {
private Integer id;
private String name;
private List<Student> studentList;
private List<Teacher> teacherList;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
public List<Teacher> getTeacherList() {
return teacherList;
}
public void setTeacherList(List<Teacher> teacherList) {
this.teacherList = teacherList;
}
}
public class Student {
private Integer id;
private String name;
private Classes classes;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
}
}
以上代码的实现方式,是采用一条sql join查询出所有的数据,然后使用resultMap进行映射,resultMap确实是个好东西啊。
更新
:
上传了mybatis的例子代码,使用hsqldb做数据库,直接运行DbManager类的main方法就行了 |
|
|
|
|
|
|