文章目录
1. 简述
MyBatis 在查询进行 select 映射的时候,返回类型可以用 resultType
和 resultMap
,resultType
是直接表示返回类型的,resultMap
是对外部的resultMap
的引用,在 select
标签中, resultType
和 resultMap
是不能同时存在的。
在 MyBatis 进行查询映射时,其实每一个查询映射的返回类型都是 resultMap
,只是当提供的返回类型属性是 resultType
的时候,MyBatis 会自动的把对应的值赋给 resultType
所指定对象的属性。
-
resultType
:通常用于简单查询; -
resultMap
:通常用于复杂查询;
2. resultType
-
resultType 是一种“查询结果集 – Java对象“ 数据类型映射关系;
-
使用 resultType 可使 Java对象接收查询结果集;
-
该方法是通过查询结果集中每条记录(属性)的数据类型和 Java对象的数据类型做映射,若两者都相同,则表示匹配成功,Java可以接收到查询结果。
-
换句话说,此处查询结果集到 Java 对象的映射关系是固定的,只有列名和属性名相同,该列才能映射成功。
-
但是此方法有局限性,要求 Java对象字段名和查询结果集的属性名相同(大小写不敏感,可以不同)。
-
一般适用于简单对象类型数据,简单的单表查询。
-
实例:
mybatis-config.xml
<!--包的别名配置--> <typeAliases> <package name="com.su.pojo"/> <!--<typeAlias type="com.kuang.pojo.User" alias="User"/>--> </typeAliases>
-
返回单个实体:
<select id="selectBlog" parameterType="int" resultType="Blog"> select * from blog where id = #{id} </select>
-
返回集合实体:
<select id="selectBlog" resultType="Blog"> select * from blog </select>
-
使用注意:
- SQL 查询的列名要和 resultType 指定 pojo(实体类)的属性名相同,指定相同属性方可映射成功,如果 SQL 查询的列名要和 resultType 指定 pojo 的属性名全部不相同(或是部分不相同),则映射到 pojo 对象中的对应属性为 null。
3. resultMap
-
resultMap 是一种“查询结果集—Java 对象”属性名称映射关系;
-
使用 resultMap 关系可将将查询结果集中的列一一映射到 Java 对象的各个属性(两者属性名可以不同,配置好映射关系即可);
-
适用与复杂一点的查询;
-
ResultMap 标签及其子标签部分属性:
- id:指定查询结果集中的唯一标识,即主键,可配置多个;
- column:查询结果集中的列名;
- property:需要映射到 Java对象中的属性名。
-
实例:
-
简单查询:
mybatis-config.xml
<!--包的别名配置--> <typeAliases> <package name="com.su.pojo"/> <!--<typeAlias type="com.kuang.pojo.User" alias="User"/>--> </typeAliases>
-
简单查询:
<resultMap id="TeacherStudent" type="Teacher"> <result column="id" property="tid"/> <result column="name" property="tname"/> </resultMap> <select id="getTeacher" resultMap="TeacherStudent"> SELECT s.id sid, s.name sname, t.name tname, t.id tid FROM student s, teacher t WHERE s.tid = t.id AND t.id = #{id} </select>
-
复杂查询:
-
表的连接查询:
association
标签<!-- 订单查询关联用户的resultMap将整个查询的结果映射到com.su.mapper.StudentMapper 中 --> <resultMap id="StudentTeacher" type="Student"> <!-- 配置映射的订单信息 --> <!-- id:指定查询列中的唯一标识,订单信息的中的唯一标识,如果有多个列组成唯一标识,配置多个id column:订单信息的唯一标识列 property:订单信息的唯一标识列所映射到 StudenMapper 中哪个属性 --> <id property="id" column="sid"/> <result property="name" column="sname"/> <!-- 配置映射的关联的用户信息 --> <!-- association:用于映射关联查询单个对象的信息 property:要将关联查询的用户信息映射到 StudenMapper 中哪个属性 --> <association property="teacher" javaType="Teacher"> <!-- id:关联查询用户的唯一标识 column:指定唯一标识用户信息的列 javaType:映射到 Teacher 的哪个属性 --> <result property="id" column="tid"/> <result property="name" column="tname"/> </association> </resultMap> <select id="getStudents" resultMap="StudentTeacher"> SELECT s.id sid, s.name sname, t.name tname, t.id tid FROM student s, teacher t WHERE s.tid = t.id </select>
-
用于表的一对多连接查询:
<resultMap id="TeacherStudent" type="Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <collection property="students" ofType="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap> <select id="getTeacher" resultMap="TeacherStudent"> SELECT s.id sid, s.name sname, t.name tname, t.id tid FROM student s, teacher t WHERE s.tid = t.id AND t.id = #{id} </select>
-