一个客户可以有多个订单,而一个订单只能对应一个客户,一对多映射的关键就是在“多”的一方添加“一”的主键为外键
一、项目准备
可以查看我上一篇博客的介绍
目录结构:
![](https://i-blog.csdnimg.cn/blog_migrate/29b70a7f0848652cdbfc621384fa38a7.png)
二、设计数据库
两个表tb_user和tb_orders,其中user_id是tb_orders的外键,并插入部分数据。
![](https://i-blog.csdnimg.cn/blog_migrate/7044c52bcca6f4b714ecd6a3984a8aa6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/24f836728ba66dd65d201b22a563dea9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/864dc6fa093e8409fc3dda6affbb5ddb.png)
三、贴代码
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1/mybatisTest3
jdbc.username=root
jdbc.password=1234
log4j.properties
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.ssm=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
Orders.java
package pojo;
public class Orders {
private Integer id; //订单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.java
package pojo;
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 +
'}';
}
}
OrdersMapper.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="pojo.OrdersMapper">
<!-- 根据id查询证件信息 -->
<select id="findOrdersById" parameterType="Integer" resultType="Orders">
select*from tb_orders where id = #{id}
</select>
</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="pojo.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="pojo.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>
MybatisTest.java
package test;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.User;
import utils.Utils;
public class MybatisTest {
@Test
public void findUserTest() {
// 1、通过工具类生成SqlSession对象
SqlSession session = Utils.getSession();
// 2、查询id为1的用户信息
User user = session.selectOne("pojo"
+ ".UserMapper.findUserWithOrders", 1);
// 3、输出查询结果信息
System.out.println(user);
// 4、关闭SqlSession
session.close();
}
}
Utils.java
package 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 Utils {
private static SqlSessionFactory sqlSessionFactory = null;
// 初始化SqlSessionFactory对象
static {
try {
// 使用MyBatis提供的Resources类加载MyBatis的配置文件
Reader reader =
Resources.getResourceAsReader("mybatis-config.xml");
// 构建SqlSessionFactory工厂
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取SqlSession对象的静态方法
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
mybatis-config.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" />
<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 将积极加载改为消息加载,即按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!--使用扫描包的形式定义别名 -->
<typeAliases>
<package name="pojo" />
</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>
<!--配置Mapper的位置 -->
<mappers>
<mapper resource="pojo/UserMapper.xml" />
<mapper resource="pojo/OrdersMapper.xml" />
</mappers>
</configuration>
运行截图:
![](https://i-blog.csdnimg.cn/blog_migrate/ac5f90ca6172731738053e5a49f07122.png)
我们可以看到,“用户”亚索有两个“订单”,当查询亚索的id时,对应的订单也打印出来了