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 类型)

原文地址:https://www.cnblogs.com/ressso/p/12088799.html

时间: 2024-08-16 11:00:49

mybatis: resultMap 结果集映射和多表查询的相关文章

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB

MyBatis学习总结(五)——实现关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VA

MyBatis学习总结_05_实现关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TABLE class( 6 c_id INT PRIMARY KEY AUTO_INCREMEN

MyBatis学习笔记五——实现关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VA

Mybatis用SQL做自连表查询

1 需求 现在有一个菜单表,菜单里同时保存有一级菜单和二级菜单,一级菜单的父菜单id字段是null,二级菜单的父菜单id字段保存了它的父菜单的id.在Java中,一个菜单对象里有一个List类型的属性保存它的子菜单.现在需要将数据库中的数据转为Java中菜单兑现的结构. 2 方法 本文采用Mybatis,编写SQL语句做自连表查询. 3 数据库表 名 类型 id int description varchar path varchar parent_menu_id int 4 POJO pack

Mybatis多表查询之一对一查询的多种实现-XML配置

Mybatis 中对于多表查询提供了非常强大的实现方式,主要是通过resultMap的结果映射对于多表查询后的返回值进行封装,让我们来看一下官网上对于resultMap的解释:resultMap 元素是 MyBatis 中最重要最强大的元素.它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作.实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长达数千行的代码.R

mybatis之联表查询

今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springMVC+mybatis,所以很自然的就想到了联表查询. 一开始认为mybatis编写语句很简单,但是在编写的时候遇到了一些细节问题,所以发文记录一下. 先说一下背景: 框架:spring+springMVC+mybatis 表结构: 1.主表 2.从表 从表的uid对应主表的id,并将主表的id设为主

mybatis 关联表查询

这段时间由于项目上的需求:需要将数据库中两表关联的数据查询出来展示到前端(包含一对一,一对多): (1)一对一: 在实体类中维护了另一个类的对象: 这里我以用户(User)和产品(Product)为例:其中get和set的方法我就没有生成了,请自行生成: 实体类: public class User { private String id; private String name; private String password; private Product product; } publi

Mybatis实现关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TABLE class( 6 c_id INT PRIMARY KEY AUTO_INCREMEN