MyBatis的关系映射——一对多
一对多的关系
定义:一个A类类型对应多个B类类型,需要在A类中以集合的方式引入B类类型对象,在B类中定义A类类型的属性a。
1、创建数据库
案例中所需要的数据库如下
create table tb_user(
id int(32) primary key auto_increment,
username varchar(32),
address varchar(256)
);
insert into tb_user values('1','jams','kelifulan');
insert into tb_user values('2','kebi','sanfrancisd');
insert into tb_user values('3','baoluo','huashengt');
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','100011','1');
insert into tb_orders values('2','100012','1');
insert into tb_orders values('3','100013','3');
完整的文件路径如下所示:
2、创建com.po包,创建类Orders和User,并在类中定义相关属性和方法
Orders类如下所示
package com.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 "Orders{" +
"id=" + id +
", number='" + number + '\'' +
'}';
}
}
User类如下所示
package com.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> getOrdersList() {
return ordersList;
}
public void setOrdersList(List<Orders> ordersList) {
this.ordersList = ordersList;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
", ordersList=" + ordersList +
'}';
}
}
3、创建com.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">
<!-- namespace表示命名空间 -->
<mapper namespace="com.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
ofType表示属性集合中元素的类型,List<Orders>属性即Orders类 -->
<collection property="ordersList" ofType="Orders">
<id property="id" column="orders_id"/>
<result property="number" column="number"/>
</collection>
</resultMap>
</mapper>
4、创建mybatis-config.xml文件并将映射文件UserMapper.xml配置到该文件中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入数据库连接配置文件 -->
<properties resource="db.properties" />
<!--使用扫描包的形式定义别名 -->
<typeAliases>
<package name="com.po" />
</typeAliases>
<!--配置环境 ,默认的环境id为mysql -->
<environments default="mysql">
<!-- 配置id为mysql的数据库环境 -->
<environment id="mysql">
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC" />
<!--数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mapper/UserMapper.xml" />
</mappers>
</configuration>
这步的配置过程其实和上一篇博客MyBatis的关系映射——一对一中的配置方法一样。
5、创建com.utils包并编写工具类
package com.utils;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtils {
public static SqlSessionFactory sqlSessionFactory = null;
// 初始化SqlSessionFactory对象
static{
try {
//使用MyBatis提供的Resources类加载mybatis的配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//构建sqlSession的工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取SqlSession对象的静态方法
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
6、创建测试类com.test并编写findUserTest()方法
package com.test;
import com.po.Orders;
import com.po.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.po.Person;
import com.utils.MybatisUtils;
public class MybatisAssociatedTest {
@Test
public void findUserTest(){
SqlSession session=MybatisUtils.getSession();
User user=session.selectOne("com.mapper."+"UserMapper.findUserWithOrders",1);
System.out.println(user);
session.close();
}
}
运行后结果如下
遇到的问题
这次没有遇到
写在最后
MyBatis是通过元素处理一对多的关联关系,子元素的属性大部分与属性相同,除属性ofType,OfType属性用于指定实体对象中集合类属性所包含元素类型。
这篇博客的内容其实也可以直接将所有的文件添加在上一篇博文中所创建的项目文件中,当然重新创建项目也是可以的。