Mybatis xxxMapper.xml 三表关联,配置文件
VideoMapper.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="net.ybclass.online_ybclass.mapper.VideoMapper"> <resultMap id="videoDetailResultMap" type="Video"> <id column="id" jdbcType="INTEGER" property="id"/> <result column="title" jdbcType="VARCHAR" property="title"/> <result column="summary" jdbcType="VARCHAR" property="summary"/> <result column="cover_img" jdbcType="VARCHAR" property="coverImg"/> <result column="price" jdbcType="INTEGER" property="price"/> <result column="point" jdbcType="DOUBLE" property="point"/> <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/> <collection property="chapterList" ofType="Chapter"> <id column="chapter_id" jdbcType="INTEGER" property="id"/> <result column="chapter_title" jdbcType="VARCHAR" property="title"/> <result column="ordered" jdbcType="INTEGER" property="ordered"/> <result column="chapter_create_time" jdbcType="TIMESTAMP" property="createTime"/> <collection property="episodeList" ofType="Episode"> <id column="episode_id" jdbcType="INTEGER" property="id"/> <result column="episode_title" jdbcType="VARCHAR" property="title"/> <result column="num" jdbcType="INTEGER" property="num"/> <result column="episode_ordered" jdbcType="INTEGER" property="ordered"/> <result column="chapter_id" jdbcType="INTEGER" property="chapterId"/> <result column="video_id" jdbcType="INTEGER" property="videoId"/> <result column="play_url" jdbcType="VARCHAR" property="playUrl"/> <result column="free" jdbcType="INTEGER" property="free"/> <result column="play_create_time" jdbcType="TIMESTAMP" property="createTime"/> </collection> </collection> </resultMap> <select id="findDetailById" resultMap="videoDetailResultMap"> SELECT v.id,v.title,v.summary,v.cover_img,v.price,v.create_time,v.point, c.id chapter_id,c.video_id,c.title chapter_title,c.ordered,c.create_time chapter_create_time, e.id episode_id,e.num,e.chapter_id,e.video_id,e.title episode_title,e.ordered episode_ordered,e.play_url,e.free,e.create_time play_create_time FROM video v LEFT JOIN chapter c ON v.id=c.video_id LEFT JOIN episode e ON c.id=e.chapter_id WHERE v.id=#{video_id} ORDER BY c.ordered,e.num ASC </select> </mapper>
Video.java#
package net.ybclass.online_ybclass.domain; import java.util.Date; import java.util.List; /** * 视频对象 */ public class Video { private Integer id; private String title; private String summary; private String coverImg; private Integer price; private Date createTime; private Double point; private List<Chapter> chapterList; public List<Chapter> getChapterList() { return chapterList; } public void setChapterList(List<Chapter> chapterList) { this.chapterList = chapterList; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; } public String getConverImg() { return coverImg; } public void setConverImg(String converImg) { this.coverImg = converImg; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Double getPoint() { return point; } public void setPoint(Double point) { this.point = point; } @Override public String toString() { return "Video{" + "id=" + id + ", title='" + title + '\'' + ", summary='" + summary + '\'' + ", converImg='" + coverImg + '\'' + ", price=" + price + ", createTime=" + createTime + ", point=" + point + ", chapterList=" + chapterList + '}'; } }
Chapter.java#
package net.ybclass.online_ybclass.domain; import java.util.Date; import java.util.List; /** * 章 */ public class Chapter { private Integer id; private Integer videoId; private String title; private Integer ordered; private Date createTime; private List<Episode> episodeList; public List<Episode> getEpisodeList() { return episodeList; } public void setEpisodeList(List<Episode> episodeList) { this.episodeList = episodeList; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getVideoId() { return videoId; } public void setVideoId(Integer videoId) { this.videoId = videoId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Integer getOrdered() { return ordered; } public void setOrdered(Integer ordered) { this.ordered = ordered; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } @Override public String toString() { return "Chapter{" + "id=" + id + ", videoId=" + videoId + ", title='" + title + '\'' + ", ordered=" + ordered + ", createTime=" + createTime + ", episodeList=" + episodeList + '}'; } }
Episode.java#
package net.ybclass.online_ybclass.domain; import java.util.Date; import java.util.List; /** * 集 */ public class Episode { private Integer id; private String title; private Integer num; private Integer ordered; private String playUrl; private Integer chapterId; private Integer free; private Integer videoId; private Date createTime; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public Integer getOrdered() { return ordered; } public void setOrdered(Integer ordered) { this.ordered = ordered; } public String getPlayUrl() { return playUrl; } public void setPlayUrl(String playUrl) { this.playUrl = playUrl; } public Integer getChapterId() { return chapterId; } public void setChapterId(Integer chapterId) { this.chapterId = chapterId; } public Integer getFree() { return free; } public void setFree(Integer free) { this.free = free; } public Integer getVideoId() { return videoId; } public void setVideoId(Integer videoId) { this.videoId = videoId; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } @Override public String toString() { return "Episode{" + "id=" + id + ", title='" + title + '\'' + ", num=" + num + ", ordered=" + ordered + ", playUrl='" + playUrl + '\'' + ", chapterId=" + chapterId + ", free=" + free + ", videoId=" + videoId + ", createTime=" + createTime + '}'; } }
表结构#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?