Mybatis中外键一对一查询

Mybatis中外键一对一查询

标签(空格分隔): mybatis


  1. 一对一查询
    • 首先创建一个file表
create table `file`(
  fileId INT NOT NULL PRIMARY KEY,
  fileName VARCHAR(20) NOT NULL
)ENGINE=innodb DEFAULT CHARSET=utf8;

在module层建立实体类

package com.bim.module;

public class File {
    private int fileId;
    private String fileName;


    public int getFileId() {
        return fileId;
    }

    public void setFileId(int fileId) {
        this.fileId = fileId;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}

在mybatis的dao层中建立相应的Mapper

  • FileMapper.java
package com.bim.dao;

import com.bim.module.File;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public interface FileMapper {
    List<File> selectAllFile();//查找所有的file
    File selectFileById(int fileId);//根据id查file
}
  • FileMapper.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="com.bim.dao.FileMapper">
    <resultMap id="FileMap" type="com.bim.module.File">
        <id property="fileId" column="fileId" jdbcType="INTEGER"/>
        <result property="fileName" column="fileName" jdbcType="VARCHAR"/>
    </resultMap>
    <sql id="base_file_list">
        fileId,fileName
    </sql>
    <select id="selectAllFile" resultType="com.bim.module.File">
        SELECT
        <include refid="base_file_list"/>
        FROM file
    </select>
    <select id="selectFileById" parameterType="java.lang.Integer" resultType="com.bim.module.File">
        SELECT
        <include refid="base_file_list"/>
        FROM file WHERE fileId=#{fileId}
    </select>
</mapper>
  • 如果规定一个用户对应一个文件的话,那我们接下来创建一个user table,并将它的一个外键指向一个文件
CREATE TABLE `user`(
  `id` INT NOT NULL PRIMARY KEY,
  `name` VARCHAR(20) NOT NULL,
  `fileId` INT NOT NULL,
  FOREIGN KEY (`fileId`) REFERENCES file(fileId)
)ENGINE=innoDB DEFAULT CHARSET=utf8;
  • 建立实体类
package com.bim.module;

public class User {
    private int id;
    private File file;
    private String name;

    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 File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }
}
  • 建立相应的mapper
    UserMapper.java
package com.bim.dao;

import com.bim.module.User;
import org.springframework.stereotype.Component;

import java.util.List;
@Component
public interface UserMapper {
    List<User> selectAllUser();
}

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">
<mapper namespace="com.bim.dao.UserMapper">
    <resultMap id="userMap" type="com.bim.module.User">
       <id column="id"  property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <association property="file" column="fileId" select="com.bim.dao.FileMapper.selectFileById"/>
    </resultMap>

    <sql id="base_user_list">
        user.id,user.name,user.fileId,file.fileName
    </sql>
    <select id="selectAllUser" resultMap="userMap">
        SELECT
        <include refid="base_user_list"/>
        FROM user,file
    </select>
</mapper>
  • 在这个地方配置resultMap的时候使用association进行一对一映射,实际上就是先通过在数据库中查找到一个user表中的一个fileId外键,然后调用FileMapper的selectFileById接口进行一对一的查找
<association property="file" column="fileId" select="com.bim.dao.FileMapper.selectFileById"/>

刚开始的时候返回类型写成

resultType="com.bim.module.User"

这个时候mybatis是没法将外键的对象给读取出来的,当你直接调用file子成员对象时会发现它是null的,报空指针错误,需要改成我们之前配置好返回结果集
pic

resultMap="userMap"

这样就能正常访问了
第二种方式可以写成这样:

<association property="file" javaType="com.bim.module.File">
            <id column="fileId" property="fileId" jdbcType="INTEGER"/>
            <result column="fileName" property="fileName" jdbcType="VARCHAR"/>
        </association>

但是查询数据的时候需要我们自己手动去判断当前的user的fileId是否和file表的fileId相等,不然会默认读取第一条记录

    <select id="selectAllUser" resultMap="userMap">
        SELECT
        <include refid="base_user_list"/>
        FROM user,file WHERE user.fileId=file.fileId
    </select>
发布了67 篇原创文章 · 获赞 46 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Fouse_/article/details/79042802