Mybatis复杂对象一对多映射配置ResultMap的collection

  • collection:一对多查询结果映射,比如user有多个订单

表结构

项目结构图

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>net.cyb</groupId>
<artifactId>cyb-mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
</project>

mybatis-config.xml

<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入外部配置文件 -->
<properties resource="config/db.properties"></properties>
<!--下划线自动映射驼峰字段-->
<!-- <settings>-->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/>-->
<!-- </settings>-->
<!-- 数据库链接相关 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- 添加映射文件 -->
<mapper resource="mapper/VideoMapper.xml" />
<mapper resource="mapper/VideoOrderMapper.xml" />
</mappers>
</configuration>

db.properties

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1:3306/cybclass
db.username=root
db.password=root

log4j.properties

#dev env [debug] product env [info]
log4j.rootLogger=ERROR, stdout
# Console output...
# 细化到打印某个mapper
# log4j.logger.包名.方法名=TRACE
log4j.logger.net.cybclass.online=TRACE
#log4j.logger.net.cybclass.online.dao.VideoMapper.selectById=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

VideoOrderMapper.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:名称空间,一般需要保持全局唯一,最好是和dao层的java接口一致。可以映射sql语句到对应的方法名称和参数、返回类型
-->
<mapper namespace="net.cybclass.online.dao.VideoOrderMapper">
<resultMap id="UserOrderResultMap" type="net.cybclass.online.domain.User">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="pwd" property="pwd"></result>
<result column="phone" property="phone"></result>
<result column="head_img" property="head_img"></result>
<!--
property:填写POJO类中集合类型属性的名称
-->
<collection property="videoOrderList" ofType="net.cybclass.online.domain.VideoOrder">
<!--配置主键,关联order的唯一标识-->
<id column="idv" property="id"></id>
<result column="out_trade_no" property="out_trade_no"></result>
<result column="create_time" property="create_time"></result>
<result column="state" property="state"></result>
<result column="total_fee" property="total_fee"></result>
<result column="video_id" property="video_id"></result>
<result column="video_title" property="video_title"></result>
<result column="video_img" property="video_img"></result>
</collection>
</resultMap>
<select id="queryUserOrder" resultMap="UserOrderResultMap">
select
u.id,
u.name,
u.pwd,
u.phone,
u.head_img,
v.id idv,
v.out_trade_no,
v.create_time,
v.state,
v.total_fee,
v.video_id,
v.video_title,
v.video_img
from user u left join video_order v on u.id = v.user_id
</select>
</mapper>

VideoOrderMapper.java

package net.cybclass.online.dao;

import net.cybclass.online.domain.User;
import net.cybclass.online.domain.VideoOrder; import java.util.List; public interface VideoOrderMapper {
/**
* 查询全部用户的全部订单
* @return
*/
List<User> queryUserOrder();
}

User.java

package net.cybclass.online.domain;

import java.util.Date;
import java.util.List; public class User {
//内码
private int id;
//用户
private String name;
//密码
private String pwd;
//手机号
private String phone;
//头像
private String head_img;
//创建时间
private Date create_time;
private List<VideoOrder> videoOrderList; public List<VideoOrder> getVideoOrderList() {
return videoOrderList;
} public void setVideoOrderList(List<VideoOrder> videoOrderList) {
this.videoOrderList = videoOrderList;
} 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 getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
} public String getHead_img() {
return head_img;
} public void setHead_img(String head_img) {
this.head_img = head_img;
} public Date getCreate_time() {
return create_time;
} public void setCreate_time(Date create_time) {
this.create_time = create_time;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", phone='" + phone + '\'' +
", head_img='" + head_img + '\'' +
", create_time=" + create_time +
", videoOrderList=" + videoOrderList +
'}';
}
}

VideoOrder.java

package net.cybclass.online.domain;

import java.util.Date;

public class VideoOrder {
private int id;
private String out_trade_no;
private int state;
private int total_fee;
private int video_id;
private String video_title;
private String video_img;
private int user_id;
private Date create_time;
private User user; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getOut_trade_no() {
return out_trade_no;
} public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_no;
} public int getState() {
return state;
} public void setState(int state) {
this.state = state;
} public int getTotal_fee() {
return total_fee;
} public void setTotal_fee(int total_fee) {
this.total_fee = total_fee;
} public int getVideo_id() {
return video_id;
} public void setVideo_id(int video_id) {
this.video_id = video_id;
} public String getVideo_title() {
return video_title;
} public void setVideo_title(String video_title) {
this.video_title = video_title;
} public String getVideo_img() {
return video_img;
} public void setVideo_img(String video_img) {
this.video_img = video_img;
} public int getUser_id() {
return user_id;
} public void setUser_id(int user_id) {
this.user_id = user_id;
} public Date getCreate_time() {
return create_time;
} public void setCreate_time(Date create_time) {
this.create_time = create_time;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} @Override
public String toString() {
return "VideoOrder{" +
"id=" + id +
", out_trade_no='" + out_trade_no + '\'' +
", state=" + state +
", total_fee=" + total_fee +
", video_id=" + video_id +
", video_title='" + video_title + '\'' +
", video_img='" + video_img + '\'' +
", user_id=" + user_id +
", create_time=" + create_time +
", user=" + user +
'}';
}
}

SqlSessionDemo.java

package net.cybclass.online;

import net.cybclass.online.dao.VideoMapper;
import net.cybclass.online.dao.VideoOrderMapper;
import net.cybclass.online.domain.User;
import net.cybclass.online.domain.Video;
import net.cybclass.online.domain.VideoOrder;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.*; public class SqlSessionDemo {
public static void main(String[] args) throws IOException {
String resouce="config/mybatis-config.xml";
InputStream resourceAsStream = Resources.getResourceAsStream(resouce);
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
try(SqlSession session=build.openSession()){
VideoOrderMapper mapper = session.getMapper(VideoOrderMapper.class);
// resultMap collection关联测试
List<User> list=mapper.queryUserOrder();
System.out.println(list);
}catch (Exception e){
e.printStackTrace();
}
}
}

Mybatis ResultMap复杂对象一对多查询结果映射之collection的更多相关文章

  1. mybatis的一对一,一对多查询,延迟加载,缓存介绍

    一对一查询 需求 查询订单信息关联查询用户信息 sql语句 /*通过orders关联查询用户使用user_id一个外键,只能关联查询出一条用户记录就可以使用内连接*/ SELECT orders.*, ...

  2. mybatis 使用resultMap实现关联数据的查询(association 和collection )

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  3. mybatis整合oracle 实现一对多查询 备注?

    <resultMap type="com.asiainfo.channel.model.weeklyNewspaper.WorkReportInfo" id="Wo ...

  4. MyBatis动态条件、一对多、整合spring(二)

    输入映射和输出映射 Mapper.xml映射文件定义了操作数据库的sql,每一个sql是一个statement,映射文件是mybatis的核心. parameterType输入类型 1.传递简单类型 ...

  5. mybatis 一对多查询 集合创建空对象的问题

    在做 mybatis 一对多查询的时候, resultMap 里面用到了集合标签 collection ,后来发现 当该条数据没有子集的时候, collection 会自动创建一个属性都是null的对 ...

  6. myBatis的一对多查询,主要利用resultMap实现一次查询多个结果集

    日常开发中有这中场景,一个用户有多个角色,一个角色又有多个菜单,想查出一个用户的所有菜单.除了常见的关联查询之外,更使用的应该是利用myBatis的resultMap来实现一次查询出多个结果集,缺点: ...

  7. 21Mybatis_订单商品数据模型_一对多查询——resultMap方式

    这篇文章延续订单商品数据模型,这张讲述的是一对多的查询.(用resultMap) 给出几张表的内容: User表:

  8. 19_高级映射:一对多查询(使用resultMap)

    [需求] 查询订单以及订单明细的信息. 确定主查询表:订单表orders 确定关联查询表:订单明细表 orderdetail 在一对一查询的基础上添加订单明细表关联即可. [分析] 使用resultM ...

  9. mybatis由浅入深day02_3一对多查询

    3 一对多查询 3.1 需求(查询订单及订单明细的信息) 查询订单及订单明细的信息. 3.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. ...

  10. mybatis中实现一对一,一对多查询

    在实际的开发中我们经常用到的是一对一查询和一对多查询.而多对多的实现是通过中间来实现,这里就没有给出来了 比如: 订单和用户是一对一的关系(一个订单只能对应一个用户) 订单和订单明细是一对多的关系(一 ...

随机推荐

  1. 推荐几款火爆的Python在线编辑器

    在当今数字化时代,编程已成为一项不可或缺的技能.Python作为一种简单易学且功能强大的编程语言,受到了广大编程爱好者和专业开发人员的青睐.为了方便大家随时随地编写和运行Python代码,市面上涌现了 ...

  2. Go-Zero定义API实战:探索API语法规范与最佳实践(五)

    前言 上一篇文章带你实现了Go-Zero模板定制化,本文将继续分享如何使用GO-ZERO进行业务开发. 通过编写API层,我们能够对外进行接口的暴露,因此学习规范的API层编写姿势是很重要的. 通过本 ...

  3. c++ 记一次把qrencode源码生成动态库的尝试

    在网上搜二维码库:qrencode,源码下载:https://github.com/fukuchi/libqrencode 我的是windows环境,IDE是vs2022. 建立一个动态库的空工程. ...

  4. C# XML转Json Json转XML XML 转对象 对象转XML

    对象转XML对象时,只能是一个JObject对象,不能是一个集合对象.如果对象是一个列表集合,需要定义一个根对象比如这样:var obj =new { Root = ListLogs[ListLogs ...

  5. 源码分析——MyBatis与Spring整合后如何保证SqlSession线程安全

    在MyBatis架构中SqlSession是提供给外层调用的顶层接口,它是MyBatis对外暴露的最重要的接口,用户通过该接口即可完成数据库的全部操作.在上文中我们明白了我们常用的Mybatis动态代 ...

  6. CSS——float浮动属性

    流动布局 流动模型(Flow),即文档流,浏览器打开HTML网页时,从上往下,从左往右,逐一加载. 在正常情况下,HTML元素都会根据文档流来分布网页内容的. 文档流有2大特征: ① 块状元素会随着浏 ...

  7. Django——基于Ajax的登录功能实现

    urlpatterns = [ path('admin/', admin.site.urls), path('login/',views.login), path('get_validCode_img ...

  8. QShop商城-快速开始-前端

    QShop商城-快速开始-前端 工具准备 NodeJs 前端环境为NodeJs,下载地址:http://nodejs.cn/download/current/ . 默认会用版本为Node 16,如找不 ...

  9. H.265码流解析

    这一篇内容旨在对H.265码流中的一些概念做简单了解,部分概念与H.264相同,本篇中将不再重复. 1.NALU H.265(HEVC)码流的NALU结构和AVC有一些不同,属于增强版,HEVC NA ...

  10. Qt-FFmpeg开发-视频播放(4)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-视频播放[软解码 + OpenGL显示YUV420P图像] 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-视频播放[软解码 + Op ...