MyBatis -- 多表查询

时间:2023-01-18 17:50:45

一、准备工作

博客系统场景。

创建库、表:

-- 创建数据库
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 表中的信息了。
(查询文章时也需要显示用户信息)

MyBatis -- 多表查询

MyBatis -- 多表查询

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);
        }
    }
}

这样就能成功查询出所有文章 (带有文章作者名信息) !
想查询用户表其他字段的话,按照相同的方式加上就行了 ~

属性名与字段名不匹配

MyBatis -- 多表查询

我们把 username 修改为 name,此时实体类属性名就与数据库表字段名不匹配了。

方案一:使用 resultMap

博客链接:https://blog.csdn.net/yyhgo_/article/details/128713697?spm=1001.2014.3001.5501

方案二:sql 中起别名

MyBatis -- 多表查询

单元测试:
MyBatis -- 多表查询
同样能够查询出 ~