Mybatis一对多查询collection用法

bean实体类代码

@Data
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer userId;
    private String userName;
    private String userTel;
    private Boolean userSex;
    private String userPassword;
    private Integer userPowerId;
    private List<UserAddress> userAddress;
    private String userImg;
    private Integer userMoney;
}




@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserAddress {
    private Integer addressId;
    private Integer userId;
    private String recipientsName;
    private String recipientsTel;
    private String recipientsAddress;

dao层接口类代码

public interface UserDAO {
    User selectUserById(@Param("userId") Integer userId) throws Exception;
}

collection-嵌套结果

xml代码

<?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="dao.UserDAO">


    <resultMap id="UserMP" type="USER">
        <id property="userId" column="user_id"></id>
        <result property="userName" column="user_name"></result>
        <result property="userTel" column="user_Tel" ></result>
        <result property="userSex" column="user_sex"></result>
        <result property="userPassword" column="user_password"></result>
        <result property="userPowerId" column="user_power_id"></result>
        <result property="userImg" column="user_img"></result>
        <result property="userMoney" column="user_money"></result>
        
        // property 是在user实体类中的字段名
        // ofType 是该字段的类型
        <collection property="userAddress"
                    ofType="UserAddress">
            <id column="address_id" property="addressId"></id>
            <result property="userId" column="user_id"></result>
            <result property="recipientsName" column="recipients_name"></result>
            <result property="recipientsTel" column="recipients_Tel"></result>
            <result column="recipients_address" property="recipientsAddress"></result>
        </collection>
/**
		还可以这样写,直接映射userAddressDAO.xml文件,
		这样就不用再写一次userAddress实体类和数据库的映射关系了
        <collection property="userAddress"
                    ofType="UserAddress"
            		resultMap="dao.userAddressDAO.UserAddressMP">
        </collection>
 */
    </resultMap>
    
    
    <select id="selectUserById" parameterType="integer" resultMap="UserMP">
        select * from User,UserAddress where User.user_id = #{userId}
                and User.user_id = UserAddress.user_id
    </select>

</mapper>

collection-嵌套查询

xml文件:

			//UserDAO.xml 文件

<mapper namespace="dao.UserDAO">
    <resultMap id="UserMP" type="USER">
        <id property="userId" column="user_id" javaType="integer"></id>
        <result property="userName" column="user_name" javaType="String"></result>
        <result property="userTel" column="user_Tel" javaType="String"></result>
        <result property="userSex" column="user_sex" javaType="boolean"></result>
        <result property="userPassword" column="user_password" javaType="String"></result>
        <result property="userPowerId" column="user_power_id" javaType="integer"></result>
        <result property="userImg" column="user_img" javaType="String"></result>
        <result property="userMoney" column="user_money" javaType="integer"></result>
        /**
        property 为user实体类中的字段名,数据中此字段可以不存在
        javaType 为查询之后返回的结果为什么Java类型
        ofType 实体类中需要查询的字段为什么类型
        select 需要执行的sql语句 dao.UserAddressDAO接口中的selectAddressByUserId方法
        column (为数据库中的字段名)第一次查询返回的结果中需要将哪一个字段作为第二次查询的参数
        fetchType 是否懒加载,eager 不是  lazy 懒加载
        */
        <collection property="userAddress"
                    javaType="java.util.List"
                    ofType="UserAddress"
                    select="dao.UserAddressDAO.selectAddressByUserId"
                    column="user_id"
                    fetchType="eager">
        </collection>
    </resultMap>
    <select id="selectUserById" parameterType="integer" resultMap="UserMP">
        select * from User where user_id = #{Id}
    </select>


			//UserAddressDAO.xml 文件
<mapper namespace="dao.UserAddressDAO">

<resultMap id="userAddressMp" type="userAddress">
    <id column="address_id" property="addressId" javaType="integer"></id>
    <result property="usersId" column="user_id" javaType="integer"></result>
    <result property="recipientsName" column="recipients_name" javaType="String"></result>
    <result property="recipientsTel" column="recipients_Tel" javaType="String"></result>
    <result column="recipients_address" property="recipientsAddress" javaType="String"></result>
</resultMap>

测试类

    @Test
    public void selectUserById() throws Exception {
        User user = userDAO.selectUserById(5);
        List<UserAddress> userAddress = user.getUserAddress();
        for(UserAddress add:userAddress) {
            String recipientsAddress = add.getRecipientsAddress();
            System.out.println(recipientsAddress);
        }
    }

结果

郑州
中国
河南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值