多对一处理
生成数据
以学生老师为例
CREATE TABLE `teacher` (
`id` INT(11) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO teacher(`id`, `name`) VALUES (1, '李永乐');
CREATE TABLE `student` (
`id` INT(11) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(11) NOT NULL,
PRIMARY KEY(`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY(`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `student`(`id`, `name`, `tid`) VALUES
(1, '小明', 1),(2, '小红', 1),(3, '小张', 1),(4, '小李', 1),(5, '小王', 1)
测试环境搭建
- 导入lombok
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency>
- 新建实体类Teacher,Student
@Data public class Teacher { private Integer id; private String name; }
@Data
public class Student {
private Integer id;
private String name;
private Teacher teacher;
}
- 建立Mapper接口
public interface TeacherMapper { @Select("select * from teacher where id = #{id}") Teacher getTeacher(@Param("id") int id); }
public interface StudentMapper {
}
- 建立Mapper.xml文件
```xml
<?xml version=”1.0” encoding=”UTF-8” ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tassel.dao.StudentMapper">
</mapper>
- 在核心配置文件中绑定注册我们的Mapper接口或者文件
<mappers> <!-- 每一个mapper配置文件都要在mybatis核心配置文件中注册 --> <mapper class="com.tassel.dao.TeacherMapper"/> </mappers>
- 测试
@Test public void test(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); Teacher teacher = mapper.getTeacher(1); System.out.println(teacher); sqlSession.close(); }
环境搭建成功。
多对一实例
案例:查询所有的学生和对应的老师信息,多个学生对应一个老师:关联
- association:关联
- collection:集合
方式一:按照查询嵌套查询
- 接口:StudentMapper.java
// 查询所有的学生和对应的老师信息 List<Student> getStudents();
- mapper文件:StudentMapper.xml
<!-- 思路: 1. 查询所有的学生信息 2. 根据查询出来学生信息的tid,查询对应的老师 (子查询) --> <select id="getStudents" resultMap="StudentTeacher"> select * from student </select> <resultMap id="StudentTeacher" type="student"> <!-- Property:实体属性;column:数据库字段--> <id property="id" column="id"/> <result property="name" column="name"/> <!-- 复杂类型需要单独处理 对象:association 集合:collection --> <association property="teacher" column="tid" javaType="teacher" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="teacher" parameterType="_int"> select * from teacher where id = #{id} </select>
- 核心配置文件中绑定注册StudentMapper
<!-- 给单独的实体类起别名 --> <typeAliases> <package name="com.tassel.pojo"/> </typeAliases> <mappers> <!-- 每一个mapper配置文件都要在mybatis核心配置文件中注册 --> <mapper class="com.tassel.dao.TeacherMapper"/> <mapper class="com.tassel.dao.StudentMapper"/> </mappers>
测试:
@Test public void testStudent(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> students = mapper.getStudents(); for (Student student : students) { System.out.println(student); } sqlSession.close(); }
方式二:按照结果嵌套查询
<!-- 按照结果嵌套查询 -->
<select id="getStudents2" resultMap="StudentTeacher2">
select s.id sid, s.name sname, t.name tname
from student s, teacher t
where s.tid = t.id;
</select>
<resultMap id="StudentTeacher2" type="student">
<id property="id" column="sid"/>
<result property="name" column="sname"/>
<!-- 这里mybatis 自动对应Teacher的属性-->
<association property="teacher" javaType="teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
一对多处理
环境搭建
- 创建实体类
@Data public class Student { private Integer id; private String name; private Integer tid; }
@Data
public class Teacher {
private Integer id;
private String name;
private List<Student> students;
}
一对多实例
案例:获取指定老师下的所有学生及老师的信息:一个老师对应多个学生:集合
- association:关联
- collection:集合
- 接口:TeacherMapper.java
Teacher getTeacher(@Param("id") int id);
- mapper配置文件:TeacherMapper.xml ```xml
3.
测试
```java
@Test
public void test(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher(1);
System.out.println(teacher);
sqlSession.close();
}
Teacher(id=1, name=李永乐, students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小红, tid=1), Student(id=3, name=小张, tid=1), Student(id=4, name=小李, tid=1), Student(id=5, name=小王, tid=1)])
按照查询嵌套处理类似多对一(子查询)。
小结
- association:关联 【多对一】
- collection:集合 【一对多】
- javaType:指定实体类中属性的类型
- ofType:用来映射List或集合中的 pojo 类型 (泛型中的约束类型)