• 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

    结束语

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

  • 相关阅读:
    实时聊天组合功能,你了解吗?
    重点难点突破——级数与数列综合大题
    DOM 重点核心
    Android Studio中配置jdk版本无效问题
    在 M1/M2 Mac 上,让 Windows 11 免费“跑”起来!
    ES学习笔记
    信钰证券:华为汽车概念股持续活跃 圣龙股份斩获12连板
    红绿正方形染色问题
    记录pytorch实现自定义算子并转onnx文件输出
    css3 布局、flex布局、grid布局的常用属性(笔记)
  • 原文地址:https://blog.csdn.net/GDFHGFHGFH/article/details/126008303