mybatis一对多的mapper写法

本文详细介绍了在MyBatis中如何实现一对多的映射关系,包括XML配置、Mapper接口方法定义以及在Java代码中的使用,旨在帮助读者深入理解MyBatis的一对多数据处理。
package com.stu.manage.demo.entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.validation.constraints.NotNull;

import org.springframework.security.core.authority.SimpleGrantedAuthority;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@TableName(value = "tb_user", resultMap = "BaseResultMap")
@AllArgsConstructor
@NoArgsConstructor
public class TbUser {

    /**
     * 配置主键生成策略
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    @TableField("username")
    @NotNull
    private String userName;

    @TableField("password")
    @NotNull
    private String passWord;

    @NotNull
    private String phone;

    private String email;

    @TableField(value = "created", fill = FieldFill.INSERT)
    @NotNull
    private Date createTime;

    @TableField(value = "updated", fill = FieldFill.INSERT_UPDATE)
    @NotNull
    private Date modifyTime;

    /**
     * 用户表和用户权限中间表是一对多的关系
     */
    private List<TbUserRole> userRoles;

    public List<SimpleGrantedAuthority> getRoles() {
        return null;
    }
}

package com.stu.manage.demo.entity;

import java.util.Date;

import javax.validation.constraints.NotNull;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class TbUserRole {

    /**
     * 配置主键生成策略
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    @TableField("user_id")
    @NotNull
    private Long userId;

    @TableField("role_id")
    @NotNull
    private Long roleId;
}

package com.stu.manage.demo.mapper;

import org.springframework.stereotype.Repository;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.stu.manage.demo.entity.TbRole;
import com.stu.manage.demo.entity.TbUser;

@Repository
public interface TbUserMapper extends BaseMapper<TbUser> {

    Integer findCount();
}

<?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">
<mapper namespace="com.stu.manage.demo.mapper.TbUserMapper">
  <resultMap id="BaseResultMap" type="com.stu.manage.demo.entity.TbUser">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="username" jdbcType="VARCHAR" property="userName" />
    <result column="password" jdbcType="VARCHAR" property="passWord" />
    <result column="phone" jdbcType="VARCHAR" property="phone" />
    <result column="email" jdbcType="VARCHAR" property="email" />
    <result column="created" jdbcType="TIMESTAMP" property="createTime" />
    <result column="updated" jdbcType="TIMESTAMP" property="modifyTime" />
    <collection
        property="userRoles"
        column="id"
        ofType="com.stu.manage.demo.entity.TbUserRole"
        select="selectUserRole"
        autoMapping="true"/>
  </resultMap>

  <select id="selectUserRole" resultType="com.stu.manage.demo.entity.TbUserRole">
        select id, user_id, role_id from tb_user_role where user_id = #{id}
  </select>
  <sql id="Base_Column_List">
    <!--@mbg.generated generated on Thu Apr 04 18:12:35 CST 2019.-->
    id, username, `password`, phone, email, created, updated
  </sql>

  <select id="findCount" resultType="integer">
    select count(1) from tb_user
  </select>
</mapper>

MyBatis 中,一对关系通常是通过嵌套结果集实现的。以下是一对关系的写法示例: 1. 定义实体类(Entity): ```java public class Order { private int id; private String orderNo; // 其他属性 private List<OrderItem> orderItems; // getter 和 setter 方法 } public class OrderItem { private int id; private String itemName; // 其他属性 // getter 和 setter 方法 } ``` 2. 编写映射文件(Mapper XML): ```xml <resultMap id="orderResultMap" type="Order"> <id property="id" column="id" /> <result property="orderNo" column="order_no" /> <!-- 其他属性映射 --> <collection property="orderItems" ofType="OrderItem" resultMap="orderItemResultMap" /> </resultMap> <resultMap id="orderItemResultMap" type="OrderItem"> <id property="id" column="id" /> <result property="itemName" column="item_name" /> <!-- 其他属性映射 --> </resultMap> <select id="getOrderWithItems" resultMap="orderResultMap"> SELECT o.id, o.order_no, oi.id, oi.item_name FROM orders o LEFT JOIN order_items oi ON o.id = oi.order_id WHERE o.id = #{orderId} </select> ``` 3. 编写Mapper接口: ```java public interface OrderMapper { Order getOrderWithItems(int orderId); } ``` 4. 使用Mapper接口进行查询: ```java Order order = orderMapper.getOrderWithItems(1); ``` 以上示例中,通过嵌套结果集的方式,将一对关系的数据映射到了Order对象的orderItems属性中。注意,需要在映射文件中定义两个resultMap,一个用于映射Or
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值