mybatis: resultMap 结果集映射和多表查询
mybatis 在进行 select 查询操作的时候,返回类型可以用 resultType,也可以用 resultMap;
resultType 是直接表示返回类型的(一般返回为基本数据类型时使用,当查询的是一条SQL数据时,且这条SQL数据的每个字段都和一个Javabean 中的属性名 与之对应,mybatis 会通过 autoMapping ,将每个字段的值赋给 Javabean),而当字段名和属性名不一致时,这时可以使用 resultMap
resultMap 是对外部的一个 ResultMap 标签的引用,并且 resultType 跟 resultMap 不能同时存在。
一个简单 resultMap 查询
<!-- 单个对象查询第二中写法,手动映射参数 --> <resultMap type="teacher" id="restMap"> <id column="id" property="id"/> <result column="name" property="name"/> </resultMap> <select id="selBy" resultMap="restMap" parameterType="int"> select * from teacher where id=#{id} </select>
当 SQL 中字段名 和 javabeen Teacher 的属性名一致时,自动映射写法如下
<!-- 自动映射参数 --> <select id="selById" resultType="teacher" parameterType="int"> select * from teacher where id=#{id} </select>
resultMap 常用标签属性说明
- id:对应<select>中 resultMap 的名称
- type:type就是指定映射到哪一个实体类中
- column:在数据库中的列名称
- property:在实体类定义的属性名称
- associattion :实体类对象包含另一个对象时,例如:一个学生对应一个老师 student =》teacher
- collection :实体类对象包含的是一个集合时,例如:一个老师对应一群学生 teacher =》List<student>
association(一对一) 和 collection(一对多)
association:一个学生对应一个老师 student =》teacher
<resultMap type="student" id="stuMap"> <!-- column:数据库中的列名称,property 实体类定义的属性名称,id 标签表示表中的主键列,result 标签是除了主键列之外的列 --> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> <result column="tid" property="tid"/> <!--property是给实体类赋值的参数,取值是实体类成员变量的名称,column是到数据库中查询的依据,取值是数据库中的列名 --> <!-- 如果管理一个对象使用 association 调用com.mapper.TeacherMapper.selById 的查询方法,将 column的值传递给selById--> <association property="teacher" column="tid" select="com.mapper.TeacherMapper.selById"></association> </resultMap> <select id="selBy" resultMap="stuMap"> select * from student </select>
collection:一个老师对应一群学生 teacher =》List<student>
<resultMap type="teacher" id="myMap"> <id column="id" property="id"/> <result column="name" property="name"/> <collection property="list" select="com.mapper.StudentMapper.selByTid" column="id"></collection> </resultMap> <select id="selAll" resultMap="myMap"> select * from teacher </select>
参考:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps
select:用于加载复杂类型属性的映射语句的 ID,它会从 column 属性指定的列中检索数据,作为参数传递给目标 select 语句。 具体请参考下面的例子。注意:在使用复合主键的时候,你可以使用 column="{prop1=col1,prop2=col2}" 这样的语法来指定多个传递给嵌套 Select 查询语句的列名。这会使得 prop1 和 prop2 作为参数对象,被设置为对应嵌套 Select 语句的参数。
<resultMap id="blogResult" type="Blog"> <association property="author" column="author_id" javaType="Author" select="selectAuthor"/> </resultMap> <select id="selectBlog" resultMap="blogResult"> SELECT * FROM BLOG WHERE ID = #{id} </select> <select id="selectAuthor" resultType="Author"> SELECT * FROM AUTHOR WHERE ID = #{id} </select>
property:映射到列结果的字段或属性。 -----------------指的是 javaBean 中的属性 类型(一个javaBeen 中的属性可以是基本数据类型也可以是 Object)
javaType:一个 Java 类的完全限定名,或一个类型别名。---------------------指的是一个 JavaBean class类型( A a = new a(); 理解为 A 类型)