基于白嫖:【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂
目录
1 多对一的情况
假设有老师和学生的两张表,一个老师可以对应多个学生,如何处理查询?
1.1 数据库设计
1.1.1 老师表
+---------+------------+--------+-------+-----------+---------+
| Field | Type | Null | Key | Default | Extra |
|---------+------------+--------+-------+-----------+---------|
| t_id | int(5) | NO | PRI | <null> | |
| t_name | varchar(4) | YES | | <null> | |
+---------+------------+--------+-------+-----------+---------+
两个属性,id
和name
,其中id
是主键;
1.1.2 学生表
+---------+------------+--------+-------+-----------+---------+
| Field | Type | Null | Key | Default | Extra |
|---------+------------+--------+-------+-----------+---------|
| stu_id | int(5) | NO | PRI | <null> | |
| name | varchar(4) | YES | | <null> | |
| city | varchar(5) | YES | | <null> | |
| tea_id | int(5) | YES | MUL | <null> | |
+---------+------------+--------+-------+-----------+---------+
四个属性,其中tea_id
是外键(是老师表的主键)
1.2 实体类设计
1.2.1 老师类
public class Teacher {
private int tId;
private String tName;
}
1.2.2 学生类
public class Stu {
private int id;
private String name;
private String stuCity;
private Teacher teacher;//重点,此处是一个老师对象
}
重点来了!数据库表中的是一个外键,但是在java实体中希望它是一个实体对象(关联关系),所以对象作为一个属性
1.3 子查询解决
<?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">
<!--namespace和接口匹配-->
<mapper namespace="dao.StuMapper">
<!--老师结果集映射-->
<resultMap id="TeacherMap" type="pojo.Teacher">
<result column="t_id" property="tId"/>
<result column="t_name" property="tName"/>
</resultMap>
<!--学生结果集映射-->
<resultMap id="StuMap" type="pojo.Stu">
<result column="stu_id" property="id"/>
<result column="name" property="name"/>
<result column="city" property="stuCity"/>
<!--对于老师复杂属性需要单独处理-->
<association column="tea_id" property="teacher" javaType="pojo.Teacher" select="getTeacher"/>
</resultMap>
<!--查询学生表-->
<select id="getStu" resultType="pojo.Stu" resultMap="StuMap">
select * from Student;
</select>
<!--子任务是查询老师表-->
<select id="getTeacher" resultType="pojo.Teacher" resultMap="TeacherMap">
select * from Teacher where t_id=#{aaa}<!--参数名字随意-->
</select>
</mapper>
重点就在于学生结果集resultMap
映射,前面三个类型的字段stu_id
、name
、city
直接处理,第四个字段tea_id
使用association
标签要映射一个java对象,使用嵌套查询语句,子查询中根据外键的值匹配该表主键返回一个Teacher
对象;
1.4 结果嵌套处理
<?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">
<!--namespace和接口匹配-->
<mapper namespace="dao.StuMapper">
<!--查询全部学生-->
<select id="getStu" resultType="pojo.Stu" resultMap="StuMap">
SELECT stu_id,name,city,tea_id,t_name
FROM `Student` s,`Teacher`t
WHERE s.tea_id=t.t_id
</select>
<!--学生的结果映射-->
<resultMap id="StuMap" type="pojo.Stu">
<result column="stu_id" property="id"/>
<result column="name" property="name"/>
<result property="stuCity" column="city"/>
<association property="teacher" javaType="pojo.Teacher">
<result property="tId" column="tea_id"/>
<result property="tName" column="t_name"/>
</association>
</resultMap>
</mapper>
使用resultMap
正常映射,在映射对象的时候,要映射一个association
包括的对象,然后用对应的值去map它的属性;
2 一对多的情况
场景一个老师教多个学生的情况。
2.1 实体类
2.1.1 学生类
public class Stu {
private int id;
private String name;
private String stuCity;
}
2.1.2 老师类
public class Teacher {
private int tId;
private String tName;
private List<Stu> student;
}
注意,此处的关注点在于老师,一个老师类的成员变量含有多个学生的list集合。
2.2 结果嵌套查询
<?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">
<!--namespace和接口匹配-->
<mapper namespace="dao.TeacherMapper">
<!--结果集映射-->
<resultMap id="TeacherMap" type="pojo.Teacher">
<result property="tId" column="t_id" />
<result property="tName" column="t_name" />
<collection property="student" ofType="pojo.Stu">
<result property="id" column="stu_id"/>
<result property="name" column="name"/>
<result property="stuCity" column="city"/>
</collection>
</resultMap>
<select id="getTeacher" resultType="pojo.Teacher" parameterType="int" resultMap="TeacherMap">
SELECT tea_id,t_name,stu_id,name,city
FROM `Student` s,`Teacher` t
WHERE s.tea_id=t.t_id and t.t_id =1
</select>
</mapper>
使用sql
语句连表查询,把查询结果进行resultMap
结果集映射,普通字段直接映射,List
字段用collection
去映射,其中列表泛型里面的元素用ofType
去表示,里面的元素正常用result
映射就可以。
3 总结
推荐使用结果集映射的方式处理,理解就是把查询到的字段放到对象或者集合里面去,是很好理解的匹配关系。association
映射对象,collection
映射集合。