JavaEE MyBatis关联映射之一对多(教材学习笔记)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40788630/article/details/83648800

在实际应用中,应用更多的是一对多,例如每一个用户可以有多个订单,在使用MyBatis中是怎样处理一对多的关系呢,在MyBatis映射文件中有一个resultMap元素,此元素包含一个<collection>子元素,MyBatis就是通过他来处理一对多关系的,

下面通过一个案例了解一下如何处理

1.在mybatis数据库中创建两个数据表,分别为tb_user tb_orders,同时在表中预先插入几条数据,执行的SQL语句如下所示:

create table tb_user(
    id int(32) primary key auto_increment,
    username varchar(32),
    address varchar(256)
);

insert into tb_user values('1','詹姆斯','克利夫兰');
insert into tb_user values('2','科比','洛杉矶');
insert into tb_user values('3','保罗','洛杉矶');

create table tb_orders(
    id int(32) primary key auto_increment,
    number varchar(32) not null,
    user_id int(32) not null,
    foreign key(user_id) references tb_user(id)
);

insert into tb_orders values('1','1000011','1');
insert into tb_orders values('2','1000012','2');
insert into tb_orders values('3','1000013','3');
insert into tb_orders values('4','1000014','1');

2.在com.itheima.po包中,创建持久化类Orders和User,并在两个类中定义相关属性和方法,如下所示

package com.itheima.po;

public class Orders {
	private Integer id;
	private String number;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	@Override
	public String toString() {
		return "IdCard [id="+id+",number="+number+"]";
	}

}
package com.itheima.po;

import java.util.List;

public class User {
	private Integer id;
	private String username;
	private String address;
	private List<Orders> ordersList;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public List<Orders> getOrders() {
		return ordersList;
	}
	public void setOrders(List<Orders> ordersList) {
		this.ordersList = ordersList;
	}
	@Override
	public String toString() {
		return "Customer [id="+id+",username="+username+",address="+address+",ordersList="+ordersList+"]";
	}

}

3.在com.itheima.mapper包中,创建用户实体映射文件UserMapper.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="com.itheima.mapper.UserMapper">
   
    <select id="findUserWithOrders" parameterType="Integer" resultMap="UserWithOrdersResult">
        select u.*,o.id as orders_id,o.number
        from tb_user u,tb_orders o
        where u.id=o.user_id
        and u.id=#{id}
    </select>
    <resultMap type="User" id="UserWithOrdersResult">
      <id property="id" column="id"/>
      <result property="username" column="username"/>
      <result property="address" column="address"/> 
      <collection property="ordersList" ofType="Orders">
          <id property="id" column="orders_id"/>
          <result property="number" column="number"/>
      </collection> 
    </resultMap>
</mapper>

4.将映射文件UserMapper.xml的路径配置到核心配置文件mybatis—config.xml中

<mapper resource="com/itheima/mapper/UserMapper.xml"/>

5.编写测试方法,

@Test
	public void findUserTest() {
		SqlSession session = MybatisUtils.getSession();
		User user = session.selectOne("com.itheima.mapper.UserMapper.findUserWithOrders",1);
		System.out.println(user);
		//关闭SqlSession
	    session.close();
	}

6.查看结果

可以看到SQL语句已经拼接完成了,但是查询结果中username显示???还有address显示为空,这可能是mysql的中文乱码问题,但是我现在还不会处理(尴尬,,以后一定处理)

猜你喜欢

转载自blog.csdn.net/qq_40788630/article/details/83648800