005Mybatis返回值(ResultMap 一对多,多对多)

属性

   id 

应该总是指定一个或多个可以唯一标识结果的属性。 虽然,即使不指定这个属性,MyBatis 仍然可以工作,但是会产生严重的性能问题。 只需要指定可以唯一标识结果的最少属性。显然,你可以选择主键(复合主键也可以)

result 

    注入到字段或 JavaBean 属性的普通结果

id/result 内部属性

  Property   映射到列结果的字段或属性 bean

  Column    据表的列名

<resultMap type="com.itheima.domain.User" id="userMap">

    <id column="id" property="userId"/>
    <result column="username" property="userName"/>

</resultMap>

javaType

      一个Java类的完全限定名,或一个类型别名。如果映射到一个JavaBean,myBatis通常可以断定类型

typeHandler

   类型处理器。使用这个属性,可以覆盖默认的类型处理器。这个属性值是类的完全限定名或者是一个类型处理器的实现,或者是类型别名。

constructor 

类在实例化时, 用来注入结果到构造方法中

idArg - ID 参数; 标记结果作为 ID 可以帮助提高整体效能

arg - 注入到构造方法的一个普通结果

 

public class User {
        public User(Integer id, String username, int age) {

        }
    }

<constructor>

    <idArg column="id" javaType="int"/>
    <arg column="username" javaType="String"/>
    <arg column="age" javaType="_int"/>

</constructor>

一对一查询

@Data
public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    private User user;
}

List<Account> findAll1();

<resultMap type="account" id="accountMap">
    <id column="aid" property="id"/>
    <result column="uid" property="uid"/>
    <result column="money" property="money"/>

    <association property="user" javaType="user">
        <id column="id" property="userId"/>
        <result column="username" property="userName"/>
        <result column="sex" property="userSex"/>
        <result column="birthday" property="userBirthday"/>
        <result column="address" property="userAddress"/>
    </association>

</resultMap>
<select id="findAll1" resultMap="accountMap">
    select u.*,a.id as aid,a.uid,a.money from account a,user u where a.uid =u.id;
</select>


<resultMap id="blogResult" type="Blog">
    <id property="id" column="blog_id" />
    <result property="title" column="blog_title"/>
    <association property="author" column="blog_author_id" javaType="Author" resultMap="authorResult"/>
</resultMap>

<resultMap id="authorResult" type="Author">
    <id property="id" column="author_id"/>
    <result property="username" column="author_username"/>
</resultMap>

一对多

@Data
public class User implements Serializable {
    private Integer userId;
    private String userName;
    private String userAddress;
    private String userSex;
    private Date userBirthday;
    private List<Account> accounts;
}

List<User> findAllAccount();

<resultMap type="user" id="userMap1">
    <id column="id" property="userId"></id>
    <result column="username" property="userName"/>
    <result column="address" property="userAddress"/>
    <result column="sex" property="userSex"/>
    <result column="birthday" property="userBirthday"/>
    <!-- collection 是用于建立一对多中集合属性的对应关系
          ofType 用于指定集合元素的数据类型
    -->
    <collection property="accounts" ofType="account">
        <id column="aid" property="id"/>
        <result column="uid" property="uid"/>
        <result column="money" property="money"/>
    </collection>
</resultMap>

<select id="findAllAccount" resultMap="userMap1">
    select u.*, a.id as aid, a.uid, a.money
    from user u
            left outer join account a on u.id = a.uid
</select>

多对多

多对多关系其实我们看成是双向的一对多关系。

中间表用户角色

 

@Data
public class Role {
    private Integer roleId;
    private String roleName;
    private String roleDesc;

    //多对多的关系映射:一个角色可以赋予多个用户
    private List<User> users;
}

List<Role> findAll();

<!--定义 role 表的 ResultMap-->
<resultMap id="roleMap" type="role">
    <id property="roleId" column="rid"></id>
    <result property="roleName" column="role_name"></result>
    <result property="roleDesc" column="role_desc"></result>
    <collection property="users" ofType="user">
        <id column="id" property="userId"></id>
        <result column="username" property="userName"/>
        <result column="address" property="userAddress"/>
        <result column="sex" property="userSex"/>
        <result column="birthday" property="userBirthday"/>
    </collection>
</resultMap>
<!--查询所有-->
<select id="findAll" resultMap="roleMap">
    select u.*, r.id as rid, r.role_name, r.role_desc
    from role r
             left outer join user_role ur on r.id = ur.rid
             left outer join user u on u.id = ur.uid
</select>

鉴别器

switch 语句

<resultMap id="vehicleResult" type="Vehicle">

    <id property="id" column="id" />
    <result property="vin" column="vin"/>
    <discriminator javaType="int" column="vehicle_type">
        <case value="1" resultMap="carResult"/>
        <case value="2" resultMap="truckResult"/>
    </discriminator>

</resultMap>

<resultMap id="vehicleResult" type="Vehicle">

    <id property="id" column="id" />
    <result property="vin" column="vin"/>

    <discriminator javaType="int" column="vehicle_type">

        <case value="1" resultType="carResult">
            <result property="doorCount" column="door_count" />
        </case>

        <case value="2" resultType="truckResult">
            <result property="boxSize" column="box_size" />
            <result property="extendedCab" column="extended_cab" />
        </case>

        <case value="3" resultType="vanResult">
            <result property="powerSlidingDoor" column="power_sliding_door" />
        </case>

        <case value="4" resultType="suvResult">
            <result property="allWheelDrive" column="all_wheel_drive" />
        </case>

    </discriminator>

</resultMap>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis中的ResultMap可以用来映射一对多的关系。在ResultMap中,可以使用collection标签来定义一个集合属性,用来表示一对多的关系。在集合属性中,可以使用result标签来定义子对象的映射规则。例如: <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="orders" ofType="Order"> <id property="id" column="order_id"/> <result property="name" column="order_name"/> </collection> </resultMap> 在上面的例子中,User对象包含一个orders属性,用来表示一个用户可以有多个订单。使用collection标签来定义orders属性,并使用ofType属性来指定子对象的类型为Order。在集合属性中,使用id和result标签来定义子对象的映射规则。这样,在查询结果中,就可以将多个订单映射到一个User对象中的orders属性中。 ### 回答2: 在MyBatis中,ResultMap是一种用于将查询到的结果集映射成Java对象的机制。当查询结果集中包含多个对象的属性时,就需要使用ResultMap一对多映射。 一对多映射的实现,需要在ResultMap中定义一个collection元素来表示将多个对象映射成一个集合。collection元素中需要设置property、ofType和select等属性。 property属性表示映射到结果集中的查询条件,也就是查询多个对象时需要根据哪个属性进行关联。 ofType属性表示集合元素的类型,这里表示集合中元素的类型为哪个Java类。 select属性表示查询的语句,对应于查询结果集的collection列。 例如,以下是一段使用ResultMap实现一对多映射的示例代码: <resultMap id="UserMap" type="User"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> <collection property="books" ofType="Book" select="selectBooksByUser" column="id"/> </resultMap> 在上面的代码中,UserMap是一个ResultMap配置,books是User类中的一个List<Book>类型属性。通过collection元素的配置,表示User对象与多个Book对象之间存在一对多关系。 需要注意的是,以上的示例代码中,还需要在mapper文件中定义selectBooksByUser语句,用于查询对应的Book对象。同时,需要配置查询语句中的查询条件,也就是column属性,与User对象的id属性关联起来。 通过以上的配置,如果查询结果集中包含了User对象与多个Book对象,MyBatis就会根据配置进行自动映射,将查询结果集中的数据转化为Java对象的形式,方便我们进行业务逻辑的处理。 ### 回答3: MyBatis是一种轻量级的ORM框架,支持复杂的SQL查询。其中,ResultMapMyBatis非常重要的一种映射规则,可以将查询结果映射到Java对象中。 在MyBatis中,使用ResultMap进行一对多的映射时,可以通过以下步骤完成: 1. 定义主实体类和从实体类 在一对多映射中,主实体类代表一端,从实体类代表多端。例如,在一个学校的管理系统中,Student代表主实体类,Grade代表从实体类。一名学生可以拥有多个成绩单。 2. 在主实体类中增加从实体类的集合 在主实体类中增加从实体类的集合属性,如下所示: public class Student { private int id; private String name; private List<Grade> grades; } 3. 定义ResultMap 定义ResultMap时,需要使用collection标签来映射从实体类的集合属性。注意,collection标签的属性property应该指向主实体类中的集合属性,同时需要指定从实体类的ResultMap,如下所示: <resultMap id="studentResultMap" type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="grades" ofType="Grade" resultMap="gradeResultMap"/> </resultMap> 4. 定义从实体类的ResultMap 在从实体类的ResultMap中,需要定义每一列的映射关系。同样地,需要定义id标签,指向主实体类的外键列,如下所示: <resultMap id="gradeResultMap" type="Grade"> <id property="id" column="id"/> <result property="subject" column="subject"/> <result property="score" column="score"/> <association property="student" javaType="Student"> <id property="id" column="student_id"/> <result property="name" column="student_name"/> </association> </resultMap> 5. 编写查询语句 最后,编写查询语句时,需要使用select标签,并在其中指定ResultMap,如下所示: <select id="getStudent" resultMap="studentResultMap"> SELECT s.id, s.name, g.id, g.subject, g.score, g.student_id, s2.name as student_name FROM student s LEFT JOIN grade g on s.id = g.student_id LEFT JOIN student s2 on g.student_id = s2.id </select> 这样,就完成了从数据库中查询学生及其所拥有的成绩单,并将结果映射为Student的对象。其中,每个Student对象的grades属性是一个List,其中包含多个Grade的对象。 以上就是使用ResultMap实现MyBatis一对多映射的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值