广告
返回顶部
首页 > 资讯 > 精选 >怎么使用MyBatis高级映射ResultMap解决属性问题
  • 867
分享到

怎么使用MyBatis高级映射ResultMap解决属性问题

2023-07-05 04:07:59 867人浏览 薄情痞子
摘要

本篇内容介绍了“怎么使用mybatis高级映射ResultMap解决属性问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ResultMap

本篇内容介绍了“怎么使用mybatis高级映射ResultMap解决属性问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

ResultMap结果映射解决复杂属性

之前我们提到了用resultMap解决数据表中字段名与bean属性名不一致的问题,这是resultMap的一种简单实现。下面我们来看如何利用ResultMap来解决更复杂的属性问题

场景:当我们需要联查两张表的时候,通常会在sql层面对两个表进行外键关联。那么设置了外键的从表对应的实体Bean中就需要定义一个对应主表的实例对象。

多对一关系处理

按照查询嵌套

示例:

// 学生表  从表public class Student {    private int id;    private String name;    private Teacher teacher; // 定义主表对应bean实例// 教师表  主表public class Teacher {    private int id;    private String name;  //teacher接口中定义方法  @Select("select name from teacher where id = #{tid}")    Teacher getTeacherById(@Param("tid") int id);  // student接口中定义方法    List<Student>  getStudent();

sql:

-- 可以直接利用多表联查sql  但是最终无法正确输出teacher类信息select * from student s join teacher t on s.tid = t.id;-- 将上面的sql拆开成两句  先查询到学生信息  用学生的tid字段对应教师的id查询教师select * from student;select * from teacher where id = #{tid}

打印日志

Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@79da8dc5]
==>  Preparing: select * from student;
==> Parameters: 
<==    Columns: id, name, tid
<==        Row: 1, 小子三, 1
<==        Row: 2, 小子四, 1
<==        Row: 3, 小子五, 1
<==        Row: 4, 小子六, 1
<==        Row: 5, 小子七, 1
<==        Row: 6, 小子八, 1
<==      Total: 6
Student{id=1, name='小子三', teacher=null}
Student{id=2, name='小子四', teacher=null}
Student{id=3, name='小子五', teacher=null}
Student{id=4, name='小子六', teacher=null}
Student{id=5, name='小子七', teacher=null}
Student{id=6, name='小子八', teacher=null}

可以很清晰的看出sql一共只执行了一条,而根据学生表tid字段查询教师信息的sql根本就没有运行

下面我们对select * from teacher where id = #{tid}这句sql返回的结果配置,利用resultMap为其配置合理的结果集来接收查询到的结果

resultMap及sql配置如下:

<resultMap id="studentTeacher" type="student">  <!--      普通映射  -->  <result column="id" property="id"/>  <result column="name" property="name"/>  <!--      复杂映射 association对象  collection集合 -->  <association property="teacher" column="tid" javaType="teacher" select="getTeacherById"/>  <!--    student表中tid字段对应实体类student中的teacher属性 对应程序中的teacher类型 执行select语句    --></resultMap>

最终打印结果如下:

Setting autocommit to false on JDBC Connection [com.Mysql.cj.jdbc.ConnectionImpl@79da8dc5]
// 执行sql1
==>  Preparing: select * from student;
==> Parameters: 
<==    Columns: id, name, tid
<==        Row: 1, 小子三, 1
// 执行sql1
====>  Preparing: select * from teacher where id = ?
====> Parameters: 1(Integer)
<====    Columns: id, name
<====        Row: 1, 秦老师
<====      Total: 1
<==        Row: 2, 小子四, 1
<==        Row: 3, 小子五, 1
<==        Row: 4, 小子六, 1
<==        Row: 5, 小子七, 1
<==        Row: 6, 小子八, 1
<==      Total: 6
// 最终teacher也以对象的形式打印出来
Student{id=1, name='小子三', teacher=Teacher{id=1, name='秦老师'}}
Student{id=2, name='小子四', teacher=Teacher{id=1, name='秦老师'}}
Student{id=3, name='小子五', teacher=Teacher{id=1, name='秦老师'}}
Student{id=4, name='小子六', teacher=Teacher{id=1, name='秦老师'}}
Student{id=5, name='小子七', teacher=Teacher{id=1, name='秦老师'}}
Student{id=6, name='小子八', teacher=Teacher{id=1, name='秦老师'}}

按照结果嵌套

studentMapper.xml配置resultMap如下:

<!-- 按照结果嵌套 --><select id="getStudent2" resultMap="studentTeacher2">  select s.id sid,s.name sname,t.id tid,t.name tname from student s join teacher t on s.tid = t.id;</select><resultMap id="studentTeacher2" type="student">  <result column="sid" property="id"/>  <result column="sname" property="name"/>  <association property="teacher" javaType="teacher">    <result column="tid" property="id"/>    <result property="name" column="tname"/>  </association></resultMap>

如果采用结果嵌套配置,此时不论bean类属性是否是基本类型都需要用result进行映射,否则输出结果就会采用默认值

一对多关系处理

一对多关系处理,依旧以上述老师和学生为例。但是实体类需要修改,如下:

public class Teacher {  private int id;  private String name;  private List<Student> student;public class Student {  private int id;  private String name;  private int tid;

一个老师下对应多个学生,所以我们定义一个集合用于存储学生

下面尝试获取指定老师下的所有学生信息及该老师信息

按照结果嵌套

程序:

// TeacherMapper// 指定老师下面的所有学生Teacher getTeaById(@Param("teaid") int id);

resultMap配置

<select id="getTeaById" resultMap="TeaStu">  select s.id sid, s.name sname, t.name tname, t.id tpid,s.tid  from student s ,teacher t  where t.id = s.tid and t.id = #{teaId};</select><resultMap id="TeaStu" type="Teacher">  <result column="tpid" property="id"/>  <result column="tname" property="name"/>  <collection property="student" ofType="student">    <result column="sid" property="id"/>    <result column="sname" property="name"/>    <result column="tid" property="tid" />  </collection></resultMap>

因为复杂属性的类型为集合,所以我们在配置resultMap结果集映射时不再使用association对象,换成collection集合。在配置collection与association不同的是将JavaType(Java类型)换成了OfType其他依旧不变

按照查询嵌套

TeacherMapper.xml配置resultMap

<select id="getTeaById" resultMap="TeaStu2">  select id,name from teacher where id = #{teaId}</select><resultMap id="TeaStu2" type="teacher">  <result column="id" property="id"/>  <result column="name" property="name"/>  <collection property="student" javaType="ArrayList" ofType="student" select="getStuList" column="id"/></resultMap><select id="getStuList" resultType="student">  select id,name,tid from student where tid = #{tid}</select>

“怎么使用MyBatis高级映射ResultMap解决属性问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么使用MyBatis高级映射ResultMap解决属性问题

本文链接: https://www.lsjlt.com/news/349466.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MyBatis高级映射ResultMap解决属性问题
    目录ResultMap结果映射解决复杂属性多对一关系处理按照查询嵌套按照结果嵌套一对多关系处理按照结果嵌套按照查询嵌套ResultMap结果映射解决复杂属性 之前我们提到了用resu...
    99+
    2023-02-20
    MyBatis高级映射ResultMap MyBatis ResultMap处理属性
  • 怎么使用MyBatis高级映射ResultMap解决属性问题
    本篇内容介绍了“怎么使用MyBatis高级映射ResultMap解决属性问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ResultMap...
    99+
    2023-07-05
  • MyBatis的SUM映射问题怎么解决
    本文小编为大家详细介绍“MyBatis的SUM映射问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis的SUM映射问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。SUM映射问题当我...
    99+
    2023-06-29
  • mybatis 解决从列名到属性名的自动映射失败问题
    问题背景 从数据库中取出数据映射到实体类时,实体类中只有部分属性映射成功,其余属性值皆为null。 问题描述 如下图AreaDao.xml文件中描述了queryArea()方法从数据...
    99+
    2022-11-12
  • Mybatis中怎么使用ResultMap解决属性名和数据库字段名不一致问题
    本篇内容介绍了“Mybatis中怎么使用ResultMap解决属性名和数据库字段名不一致问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前...
    99+
    2023-06-25
  • mybatis如何解决从列名到属性名的自动映射失败的问题
    本篇内容介绍了“mybatis如何解决从列名到属性名的自动映射失败的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题背景从数据库中取出...
    99+
    2023-06-20
  • 怎么解决mybatis映射和实际类型不一致的问题
    本篇内容主要讲解“怎么解决mybatis映射和实际类型不一致的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决mybatis映射和实际类型不一致的问题”吧!mybatis映射和实际类型...
    99+
    2023-06-21
  • 怎么使用CSS属性border-collapse解决table的边框问题
    小编给大家分享一下怎么使用CSS属性border-collapse解决table的边框问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解...
    99+
    2022-10-19
  • mybatis使用${}时sql注入的问题怎么解决
    这篇文章给大家介绍mybatis使用${}时sql注入的问题怎么解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mybatis使用${}时sql注入的问题最近在上线项目的时候,代码审查没有通过,提示有sql注入的风险...
    99+
    2023-06-22
  • java高级用法之JNA中的回调问题怎么解决
    今天小编给大家分享一下java高级用法之JNA中的回调问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。简介什么是c...
    99+
    2023-06-30
  • mybatis使用Integer类型查询出现的问题怎么解决
    本文小编为大家详细介绍“mybatis使用Integer类型查询出现的问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis使用Integer类型查询出现的问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-29
  • 使用Mybatis遇到的坑之Integer类型参数问题怎么解决
    这篇文章主要讲解了“使用Mybatis遇到的坑之Integer类型参数问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“使用Mybatis遇到的坑之Integer类型参数问题怎么解决...
    99+
    2023-07-05
  • 怎么使用Spring三级缓存解决循环依赖问题
    这篇文章主要介绍了怎么使用Spring三级缓存解决循环依赖问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Spring三级缓存解决循环依赖问题文章都会有所收获,下面我们一起来看看吧。循环依赖什么是循环...
    99+
    2023-07-05
  • vue3使用ref的性能警告问题怎么解决
    markRaw: 标记一个对象,使其永远不会转换为 proxy。返回对象本身。shallowRef: 创建一个跟踪自身 .value 变化的 ref,但不会使其值也变成响应式的。解决我通过将对象标记为shallowRef解决了这个问题因此,...
    99+
    2023-05-14
    Vue3 ref
  • 如何使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
    小编给大家分享一下如何使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了...
    99+
    2022-10-19
  • mybatis使用foreach查询不出结果也不报错的问题怎么解决
    本篇内容介绍了“mybatis使用foreach查询不出结果也不报错的问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!foreac...
    99+
    2023-06-29
  • 旧项目升级新版Unity2021导致Visual Studio无法使用的问题怎么解决
    本篇文章为大家展示了旧项目升级新版Unity2021导致Visual Studio无法使用的问题怎么解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在项目开发过程中,不可避免的会升级开发...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作