MyBatis多对一查询的实现
在这篇文章讲到MyBatis一对多查询的实现
主要就是对结果集映射的使用:resultMap
- association(关联):一个复杂的类型关联;许多结果将包成这种类型(多对一),就好比是多个学生对应一个老师
- collection(集合):复杂类型的集合(一对多),就好比是一个老师对应好多学生
基本实现步骤:
实例:
第一步,创建两个数据库表格,studnet,teacher表
学生student数据库表:
create table student
(
id int(10) not null
primary key,
name varchar(30) not null,
tid int(10) not null,
constraint tid
foreign key (tid) references teacher (id)
);
老师teacher数据库表
create table teacher
(
id int(10) not null
primary key,
name varchar(30) not null
);
第二步:创建Maven工程,导入相关Jar包的坐标
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
第三步:写出student和teacher的实体类
student的实体类
因为是多对一,所以在student的实体类里面是teacher变量。
public class student {
private int id;
private String name;
private teacher teacher;
@Override
public String toString() {
return "student{" +
"id=" + id +
", name='" + name + '\'' +
", teacher=" + teacher +
'}';
}
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 com.mwt.domain.teacher getTeacher() {
return teacher;
}
public void setTeacher(com.mwt.domain.teacher teacher) {
this.teacher = teacher;
}
}
teacher的实体类
public class teacher {
private int id;
private String name;
@Override
public String toString() {
return "teacher{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
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;
}
}
第四步:写dao接口
StudentMapper
public interface StudentMapper {
public List<student> getStudent1();
}
TeacherMapper
public interface TeacherMapper {
public teacher getTeacher(int id);
}
第五步:创建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="com.mwt.dao.StudentMapper">
<!--按照结果嵌套处理-->
<select id="getStudent1" resultMap="studentteacher">
select mybatis.student.id sid,mybatis.student.name sname,mybatis.teacher.name tname
from mybatis.student,mybatis.teacher
where student.tid=teacher.id
</select>
<resultMap id="studentteacher" type="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
</mapper>
第六步:写一个MapperUntil工具类,方便接下来的使用。
public class MybatisUntils {
private static SqlSessionFactory sqlSessionFactory;
private static SqlSession sqlSession;
static {
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*获取sqlSession
*/
public static SqlSession getSqlSession(){
sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
/**
* 释放资源
*/
public static void close(){
if(sqlSession!=null){
sqlSession.close();
}
}
}
第七步:进行测试
public void getStudent1(){
SqlSession sqlSession = MybatisUntils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<student> ListStudent = mapper.getStudent1();
for (student student : ListStudent) {
System.out.println(student);
}
MybatisUntils.close();
}
测试结果为
student{id=1, name='小明', teacher=teacher{id=0, name='孟老师'}}
student{id=2, name='小红', teacher=teacher{id=0, name='孟老师'}}
student{id=3, name='小张', teacher=teacher{id=0, name='孟老师'}}
student{id=4, name='小李', teacher=teacher{id=0, name='孟老师'}}
student{id=5, name='小王', teacher=teacher{id=0, name='孟老师'}}