联合查询:association
模拟业务场景:一个学生应该在一个班级里,模拟一对一关系。
改造之前的Student类,增加一个属性Class。
package com.hbk.pojo;
public class Student {
private int id;
private String name;
private int age;
private Class classId;
public Class getClassId() {
return classId;
}
public void setClassId(Class classId) {
this.classId = classId;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Class类就id,name属性,以及get set方法,代码略。
在mybatis-config.xml文件中加入class的别名
<typeAliases>
<typeAlias type="com.hbk.pojo.Student" alias="Student"/>
<typeAlias type="com.hbk.pojo.Class" alias="Class"/>
</typeAliases>
在student.xml文件中加入查询SQL
<resultMap type="Student" id="StudentMapOne">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<association property="classId" javaType="Class" column="classid">
<id column="classId" property="id"/>
<result column="className" property="name"/>
</association>
</resultMap>
<select id="findOneToOne" resultMap="StudentMapOne" >
select stu.id,stu.name,c.id as classId,c.name as className from student stu inner join class c on stu.classid = c.id
</select>
测试及结果:
package com.hbk.test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.hbk.pojo.Student;
public class StudentTest {
public static void main(String[] args) {
String resource = "com/hbk/map/mybatis-config.xml";
try {
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<Student> lists = sqlSession.selectList("findOneToOne");
for(Student stu : lists){
System.out.println(stu.getName()+" 班级名称="+stu.getClassId().getName());
}
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
数据库student表增加classid列,并增加class表。
之前测试的时候踩过一个坑,sql语句里一定要使用别名,要不然会出现问题,因为我设计表当中,student(id,name,age,classid)跟class(id,name)有同名的列。