8.mybatis 一对多的实现

本文详细介绍了在MyBatis中如何实现一对多的关系映射,通过实例展示了从User表根据名称查询对应的Orders,涉及到Model设计、映射接口配置及测试过程,强调了数据包装设计的重要性。

1.沿用之前的两张表
明显,一个User可以有多个orders
在这里插入图片描述

2需求
根据user.name='王五’查orders
3.在数据库中写出来

SELECT u.`username` u_name, o.id  o_id 
FROM
	orders o,USER u
WHERE
	o.`user_id`=u.`id`
AND
	u.`username`='王五';

4.创建两个model user_2 ,orders(和前面不一样)
(1)user(将orders包装进来)

public class User_2 {
    private int id;
    private String name;
    private String address;
    private List<Orders> ordersList;

    public List<Orders> getOrdersList() {
        return ordersList;
    }


    public void setOrdersList(List<Orders> ordersList) {
        this.ordersList = ordersList;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User_2{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", ordersList=" + ordersList +
                '}';
    }
}

2.orders

public class Orders {
    private int id;
    private int user_id;
    private Date createtime;
    private String number;



    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }



    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", user_id=" + user_id +
                ", createtime=" + createtime +
                ", number='" + number + '\'' +
                '}';
    }
}

5.映射接口(主要是对collection标签的认识)

 public User_2 find_4(String name);

6.映射配置

 <resultMap id="re_5" type="mybatis.model.User_2">
        <result column="u_name" property="name"></result>
        <collection property="ordersList" ofType="mybatis.model.Orders">
            <result column="o_id" property="id"></result>
        </collection>
    </resultMap>
    <select id="find_4" parameterType="String" resultMap="re_5">
        SELECT u.`username` u_name, o.id  o_id
FROM
	orders o,USER u
WHERE
	o.`user_id`=u.`id`
AND
	u.`username`=#{name};

    </select>

7.test

public class test11 {
    @Test
    public void test1() throws IOException {
        //加载配置文件
        InputStream stream = Resources.getResourceAsStream("mybatis/mapper/SqlMapConfig.xml");
        //加载xml到工厂创造者
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);
        //利用build创造会话类
        SqlSession sqlSession = build.openSession();
        //调用sqlsession实现sql语句
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User_2 user = mapper.find_4("王五");
        String name = user.getName();
        List<Orders> ordersList = user.getOrdersList();
        System.out.println("用户名是"+name);
        for(Orders o :ordersList){
            int id = o.getId();
            System.out.println("他的订单号有 "+id);
        };

        //提交事务
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }
}

8.结果

用户名是王五
他的订单号有 3
他的订单号有 4

9.感想
(1)这里我就深切的感受到包装设计的好处了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值