oracle数据库中的表结构:
create table grade(gid number primary key,
gname varchar2(20)
);
create table student(
sid number primary key,
sname varchar2(20),
gid number references grade(gid)
);
建立对应的实体类,类属性名中有和数据库表中的列名不同(忽略类属性名的大小写)
public class Grade {
private int gid;
private String gnamed; //这里的属性名和表中的类名不一致,是为了演示结果集映射
private List<Student> students=new ArrayList<>();
}
public class Student {
private int sid;
private String sname;
private Grade grade;
}
//grade表的接口
public interface GradeMapper {
Grade queryGrade(int gid);
}
//student表的接口public interface StudentMapper {
Student queryStudent(int sid);
}
<!-- 配置变量类型设置别名 -->
<typeAliases>
<!-- <typeAlias type="cn.et.lesson2.Food" alias="food"/> -->
<package name="cn.et.lesson3.resultMap" />
</typeAliases>
gradeMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xml.GradeMapper">
<!-- 映射实体类中属性名和表中列名不同的属性
autoMapping="true" 自动映射属性名和列名相同的属性 默认值是true
autoMapping="false" 关闭自动映射
association:映射类属性
collection:映射集合(类属性)
property:实体类中的属性
column:数据库表中的列名 -->
<resultMap type="grade" id="gradeMap" autoMapping="true">
<!-- 映射主键列 -->
<id column="gid" property="gid" />
<!-- 映射非主键列 -->
<result column="gname" property="gnamed"/>
</resultMap>
<!-- 映射一对多:一个班级下有多个学生 -->
<resultMap type="grade" id="gradeOne" autoMapping="true"><!-- 映射主键列 -->
<id column="gid" property="gid" />
<!-- 映射非主键列 -->
<result column="gname" property="gnamed"/>
<!-- 类属性是个集合 -->
<collection property="students" column="gid" javaType="list" select="xml.StudentMapper.queryStudentByGid"></collection>
</resultMap>
<select id="queryGrade" resultMap="gradeOne">
select * from grade where gid=#{0}
</select>
<!-- 根据查询学生获取其班级信息 -->
<select id="queryGradeByGid" resultMap="gradeMap">
select * from grade where gid=#{0}
</select>
</mapper>
studentMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xml.StudentMapper">
<!-- 映射多对一关系 :多个学生属于同一个班级-->
<resultMap type="student" id="studentMap" autoMapping="true">
<!-- 映射主键 -->
<id column="sid" property="sid"/>
<!-- 类属性是个对象 -->
<association property="grade" column="gid" select="xml.GradeMapper.queryGradeByGid"></association>
</resultMap>
<select id="queryStudent" resultMap="studentMap">
select * from student where sid=#{0}
</select>
<!-- 根据班级来查询学生信息 -->
<select id="queryStudentByGid" resultType="student">
select * from student where gid=#{0}
</select>
</mapper>
测试方法:
private SqlSession getSession() throws IOException {
// mybatis核心配置文件路径
String resource = "cn/et/resultMap/xml/mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
// session操作的是指向sql语句的一个唯一标识符
SqlSession openSession = sqlSessionFactory.openSession();
return openSession;
}
@Test
public void testManytoOne() throws IOException {
SqlSession openSession = getSession();
StudentMapper mapper = openSession.getMapper(StudentMapper.class);
Student queryStudent = mapper.queryStudent(1);
System.out.println(queryStudent.getSname()+"----"+queryStudent.getGrade().getGid());
}
@Test
public void testOnetoMany() throws IOException {
SqlSession openSession = getSession();
GradeMapper mapper = openSession.getMapper(GradeMapper.class);
Grade queryGrade = mapper.queryGrade(2);
System.out.println(queryGrade.getGid()+"---"+queryGrade.getGnamed());
for(Student tmp: queryGrade.getList()){
System.out.println(tmp.getSname());
}
}