首先先来说明一下数据库,数据库有两张表student表和teacher表:
student表如下:
teacher表如下:
两张表的关系:多个学生关联一位老师(多对一)
*其中tid是外键
需要sql语句的朋友可以在这里取:
CREATE TABLE `teacher`( `id` INT(10) 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(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `tid` INT(10) DEFAULT 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'); INSERT INTO `student`(`id`,`name`,`tid`) VALUES ('2','小红','1'); INSERT INTO `student`(`id`,`name`,`tid`) VALUES ('3','小张','1'); INSERT INTO `student`(`id`,`name`,`tid`) VALUES ('4','小李','1'); INSERT INTO `student`(`id`,`name`,`tid`) VALUES ('5','小王','1'); SELECT * FROM student; SELECT * FROM teacher;
下面进入正题:
1.编写pojo类
@Data public class Student { private int id; private String name; //学生需要关联一个老师 private Teacher teacher; }
@Data public class Teacher { private int id; private String name; }
注意:@Data是一个注解,使用这个注解可以自动帮我们引入get()、 set()、 toString()等方法。这个注解来自lombok,要使用这个注解首先要安装lombok插件并导入相关jar包。
2.编写接口类
public interface StudentMapper { public List<Student> getStudent(); }
3.编写映射文件
这里有两种方法,按照查询嵌套处理和按照结果嵌套处理
方式一:按照查询嵌套处理
思路:我们先查询所有的学生,然后根据查询出来的学生的tid再去查询对应的老师的信息,代码如下所示
<?xml version="1.0" encoding="GBK" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.orggetStudent//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.kuang.dao.StudentMapper"> <select id="getStudent" resultMap="StudentTeacher"> SELECT * FROM student </select> <resultMap id="StudentTeacher" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap>
<select id="getTeacher" resultType="Teacher">
SELECT * FROM teacher where id = #{tid}
</select>
</mapper>
注意:
●由于<association>中properties的值是一个对象,所以要给他设置一个类型,javaType就是给peoperty设置类型,teacher的类型是自定义pojo的Teacher类,所以javaType="Teacher"
●在上边代码中<resultMap>标签里简单的属性我们可以用<result>标签去映射,但是复杂的属性就用不了了,那怎么结局复杂属性的映射怎么解决呢?有两种情况:
①.复杂属性是对象:用association
②.复杂属性是集合,用collection
映射过程图解:
方式二:按照结果嵌套处理
这种方法比较简单,只要对比上一种方法你就能明白了,这里就不详细赘述了。
映射文件代码如下:
<!--方式二-->
<select id="getStudent2" resultMap="StudentTeacher2">
SELECT s.id AS sid,s.name AS sname,t.id AS tid,t.name AS tname
FROM student s,teacher t
WHERE s.tid = t.id
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>
注意:
●select语句中给字段区别名那里不能省略,不然查询结果会出错。出错的原因我现在不知道,有知道的朋友欢迎在下边评论,不胜感谢!