Mybatis中外键一对一查询
标签(空格分隔): mybatis
- 一对一查询
- 首先创建一个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>