目录
resultType 和 resultMap
多表查询
resultType 和 resultMap
- 在 MyBatis 中二者被用于设置查询后所返回的数据类型
resultType
- 大多数情况下均可使用 resultType 进行设置返回数据类型
实例理解
- 下图为数据库中的一个 user 表,该 user 表包含四个字段
- 为了能够映射该 user 表
- 我们在 Spring boot 项目中创建了一个 User 实体类
- 该 user实体类 的属性名与 user表中的字段名 对应相等
import lombok.Data; @Data public class User { private int id; private String name; private int age; private String password; }
- 所以我们便可以在 XML 中,使用 resultType,设置该 select 语句返回的数据类型为 User
<select id="login" resultType="com.example.demo.entity.User"> select * from user where name = #{user_name} </select>
问题:
- 当 user 表的字段名 与 User实体类的属性名 全部不一致时
- 使用 resultType 就无法将查询到的结果 映射成 一个 User 类型的对象了
- 当然如果为下图情况 ,select 所查询到的返回值,将会得到一个属性 pwd 为 null 的 User 类型对象,其余属性均可映射到返回值
解决方法:
- 在 select 语句中使用 as 进行重命名
<select id="login" resultType="com.example.demo.entity.User"> select id,name,age,password as pwd from user where name = #{user_name} </select>
- 使用 resultMap
resultMap
- 用来 返回字典映射
- 可解决 user 表的字段名 与 User实体类的属性名 全部不一致 问题
实例理解
- 按照下方格式,将 User实体类的属性名 与 user表的字段名 相对应
<resultMap id="BaseMap" type="com.example.demo.entity.User"> <id property="id" column="id"></id> <result property="name" column="name"></result> <result property="age" column="age"></result> <result property="pwd" column="password"></result> </resultMap>
- 且 select 语句中的 resultType 更改为 resultMap
<select id="login" resultMap="BaseMap"> select * from user where name = #{user_name} </select>
- 此时当我们利用单元测试 查询 name = "xiaolin" 的用户信息时
多表查询
实例理解
- 此处我们想通过 用户id 查询到该用户姓名 和 该用户所有文章数据
初始化实体类
- 创建 User 实体类 和 Blog 实体类 与 数据库的 user 表 和 blog 表的字段名相对应
- User 实体类上文有相应代码
import lombok.Data; import java.time.LocalDateTime; @Data public class Blog { private int blogId; private String title; private String content; private LocalDateTime postTime; private int userId; }
- 以该 Blog 类为父类,再创建一个 BlogVO 实体类来满足我们的查询需求
import lombok.Data; @Data public class BlogVO extends Blog { // 映射返回的 用户名 private String name; // 这里由于 lombok 的 toString 方法不会输出父类的属性 // 所以此处我们自己重写 toString 方法 @Override public String toString() { return "BlogVO{" + "name='" + name + '\'' + "} " + super.toString(); } }
初始化 BlogMapper 接口
- 此处我们添加一个 getDetail 方法
import com.example.demo.entity.BlogVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @Mapper public interface BlogMapper { // 根据用户id 查询文章详情 List<BlogVO> getDetail(@Param("user_id") Integer id); }
初始化 BlogMapper XML 文件
- 在与 接口相对应的 XML 文件中
- 添加上与 getDetail 方法 相对应的 sql 语句
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati s.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.BlogMapper"> <select id="getDetail" resultType="com.example.demo.entity.BlogVO"> select b.*,u.name from blog b left join user u on u.id = b.userid where u.id=#{user_id} </select> </mapper>
创建 getDetail 的测试方法
- 此处查询 id = 1 的用户文章数据
@Test void getDetail() { List<BlogVO> blogVOs = blogMapper.getDetail(1); for (BlogVO blogVO: blogVOs) { System.out.println(blogVO); } }
执行测试方法
- 测试方法执行成功