• mybatis的一对一和一对多实现


    背景

    温故而知新,说道mybatis的一对多和一对一就要说道两个 标签,collection标签用来实现一对多,association则用来实现一对一,而这两种方式实际上都涉及到两种查询分别是联合查询和嵌套子查询,所谓联合查询的意思就是对数据库进行一次查询,查出所有数据,而嵌套查询则是要先查出前面的‘’一‘’,再根据‘’一‘’中的某个属性去另一张表的一或者多。

    • 关联查询,
    • 子嵌套查询

    表关系

    • 主表:学生表
      其中id,name,sex都是主表(学生表)的数据,而学生和studentCard(学生学号)是一对一的关系,nameShorts代表学生的外号,在这里我们假设学生与外号是一对多的关系
        private Integer id;
        private String name;
        private String sex;
        private StudentCard studentCard;
        private List<NameShort> nameShorts;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 次表 :学号表
      其实的id代表的是学号,studentId代表的是学生表里的id
        private int id;
        private int studentId;
        private Date startDate;
        private Date endDate;
    
    • 1
    • 2
    • 3
    • 4
    • 次表:外号表(nameShort)

    name与学生表里的name一直,是关联的条件

        private String name;
        private String shortName;
    
    • 1
    • 2

    关联查询

    嵌套查询

    • 主表学生表
      association标签用来实现一对一,其中property代表实体类中的属性名字,select代表要调用的某个子查询,如果在不同的xml里,就要像我这样写,否则就直接写对应的id名字即可,column则代表要给子查询传递的参数,具体的名字则是对应的父查询的某一列列名,collection用来实现一对多,这里用来获取某个学生的所有的外号,collection中的标签与association中的意思是一致的。
    <resultMap id="re" type="com.example.mybatisdemo01.demo01.entiry.Student">
         <result column="id" property="id">result>
         <result column="name" property="name">result>
         <result column="sex" property="sex">result>
            <association property="studentCard" select="com.example.mybatisdemo01.demo01.dao.StudentIdMapper.selectOne" column="id">
            association>
            <collection property="nameShorts" select="com.example.mybatisdemo01.demo01.dao.NameShortMapper.listNameShorts" column="name">collection>
        resultMap>
        <select id="listStudents" resultMap="re">
            SELECT * FROM Student
        select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 次表 学号表
    <select id="selectOne" resultType="com.example.mybatisdemo01.demo01.entiry.StudentCard" parameterType="int">
            SELECT * FROM Studentcard where studentId=#{id}
        select>
    
    • 1
    • 2
    • 3
    • 次表 外号表
      这个查询被调用的时候传了name,但是这里没有写parameterType=“String”,也传过来了
    <select id="listNameShorts" resultType="com.example.mybatisdemo01.demo01.entiry.NameShort" >
            SELECT * FROM NameShort where name=#{name}
        select>
    
    • 1
    • 2
    • 3

    关联查询

    意思是一次查询所有的结果

    • 这里我只把一对多进行了关联查询,与嵌套查询的区别就是去掉了select属性,column属性,加上了javaType(代表的这个属性在类中中的java类型,从上面我们可以看到nameShorts在student中是个list),ofType代表的是这个属性本身的java类(尖括号里面的类),也就是NameShort这个类。
    • 这里需要注意,在进行关联查询的时候需要注意列名问题,要避免列名重复,不然就会出现映射错误的问题
     <resultMap id="re02" type="com.example.mybatisdemo01.demo01.entiry.Student">
            <result column="id" property="id">result>
            <result column="name" property="name">result>
            <result column="sex" property="sex">result>
            <association property="studentCard" select="com.example.mybatisdemo01.demo01.dao.StudentIdMapper.selectOne" column="id" >
            association>
            <collection property="nameShorts" javaType="java.util.List" ofType="com.example.mybatisdemo01.demo01.entiry.NameShort"  >
                <result column="a" property="name">result>
                <result column="na" property="shortName">result>
            collection>
        resultMap>
    
        <select id="listStudentsOnce" resultMap="re02">
            SELECT s.* ,n.name a,n.shortName na FROM Student s,nameShort n  where s.name=n.name;
        select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结束语

    初入门径,如有错误,感谢指出。

  • 相关阅读:
    配置防火墙
    递归简化数据处理方式
    R语言使用is.vector函数判断数据对象是否是向量数据类型vector
    Linux——vim简介、配置方案(附带超美观的配置方案)、常用模式的基本操作
    踩坑笔记 NFS坑-2个pod读写文件延迟问题
    JBoss漏洞之反序列化漏洞
    ElasticSearch这些坑记得避开
    线程创建、线程池创建相关理论知识整理
    APISpace IP归属地查询接口案例代码
    API工具类(一)玩转正则表达式等常用SDK
  • 原文地址:https://blog.csdn.net/GDFHGFHGFH/article/details/126008303