MyBatis -- 多表查询
一、准备工作
博客系统场景。
创建库、表:
-- 创建数据库
drop database if exists mycnblog;
create database mycnblog DEFAULT CHARACTER SET utf8mb4;
-- 使用数据数据
use mycnblog;
-- 创建表[用户表]
drop table if exists userinfo;
create table userinfo(
id int primary key auto_increment,
username varchar(100) not null,
password varchar(32) not null,
photo varchar(500) default '',
createtime datetime default now(),
updatetime datetime default now(),
`state` int default 1
) default charset 'utf8mb4';
-- 创建文章表
drop table if exists articleinfo;
create table articleinfo(
id int primary key auto_increment,
title varchar(100) not null,
content text not null,
createtime datetime default now(),
updatetime datetime default now(),
uid int not null,
rcount int not null default 1,
`state` int default 1
)default charset 'utf8mb4';
用户表实体类:
package com.example.demo.model;
import lombok.Data;
import java.util.Date;
/**
* 普通的实体类,用于 Mybatis 做数据库表(userinfo表)的映射
*/
@Data
public class UserInfo {
private int id;
private String name;
private String password;
private String photo;
private Date createtime;
private Date updatetime;
private int state;
}
文章表实体类:
package com.example.demo.model;
import lombok.Data;
import java.util.Date;
/**
* 文章表的实体类
*/
@Data
public class ArticleInfo {
private int id;
private String title;
private String content;
private Date createtime;
private Date updatetime;
private int uid;
private int rcount; // 访问量
private int state; // 状态(预览字段)
private String username; // 文章作者名
//..
}
- 创建接口 UserMapper 与其对应的 UserMapper.xml 文件
- 创建接口 ArticleInfoMapper 与其对应的 ArticleMapper.xml 文件
二、多表查询
文章表 articleinfo 的 uid 字段是一个外键,关联到 userinfo 表中的信息了。
(查询文章时也需要显示用户信息)
ArticleInfoMapper 接口中创建 getAll 方法:
public List<ArticleInfo> getAll();
单元测试:
package com.example.demo.mapper;
import com.example.demo.model.ArticleInfo;
import com.example.demo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest // 当前测试的上下文环境为 springboot
class ArticleInfoMapperTest {
@Autowired
private ArticleInfoMapper articleInfoMapper;
@Test
void getAll() {
List<ArticleInfo> list = articleInfoMapper.getAll();
for (ArticleInfo item:list){
System.out.println(item);
}
}
}
这样就能成功查询出所有文章 (带有文章作者名信息) !
想查询用户表其他字段的话,按照相同的方式加上就行了 ~
属性名与字段名不匹配
我们把 username 修改为 name,此时实体类属性名就与数据库表字段名不匹配了。
方案一:使用 resultMap
博客链接:https://blog.csdn.net/yyhgo_/article/details/128713697?spm=1001.2014.3001.5501
方案二:sql 中起别名
单元测试:
同样能够查询出 ~