版权声明:本文为博主原创文章,未经博主允许不得转载。 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的中文乱码问题,但是我现在还不会处理(尴尬,,以后一定处理)