• Mybatis-07


    Mybatis

      前面,我们学习了Mybatis中的resultMap,那么接下来,我们来合理运用这一项功能。

    一对一

      首先是一对一,我们知道在面对一对一的外键约束时,需要用到resultMap中的association。接下来,我们来进行详细的演示。

    第一步:建表并添加信息。

      我们这里以用户和身份证的一对一关系进行演示。

    首先,搭建一个身份证表

    create table card(
    cardId INT PRIMARY KEY,
    cardNum VARCHAR(100),
    address VARCHAR(100)
    );

    接着,搭建一个用户表,并用户表与身份证表关联起来。

    create table user(
    userId INT PRIMARY KEY,
    userName VARCHAR(100),
    age INT,
    cardId INT,
    CONSTRAINT user_card
    FOREIGN KEY(cardId) REFERENCES card(cardId)
    );

    最后,我们向里面添加一些数据。

    第二步:编写实体类

    package com.charles.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Card {
        private Integer cardId;
        private String cardNum;
        private String address;
    }
    package com.charles.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private Integer userId;
        private String userName;
        private Integer age;
        private Card cardId;
    }

    第三步:编写通过Id查询数据的接口

    package com.charles.dao;
    
    import com.charles.pojo.User;
    
    public interface UserMapper {
    
        User queryUserById(int id);
    }
    package com.charles.dao;
    
    import com.charles.pojo.Card;
    
    public interface CardMapper {
        Card queryCardById(int id);
    }

    第四步:编写SQL语句,并使用association,进行信息的绑定。(这个方法比较复杂,但是方便理解)

    <?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.charles.dao.CardMapper">
    
        <select id="queryCardById" resultType="com.charles.pojo.Card" parameterType="int">
            SELECT * FROM card WHERE cardId=#{cardId};
        </select>
    
    </mapper>
    <?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.charles.dao.UserMapper">
    
        <select id="queryUserById" resultMap="userMap" parameterType="int">
            SELECT u.userName,u.age,c.cardId,c.cardNum,c.address
            FROM user u,card c
            WHERE u.cardId=c.cardId
            AND
                u.userId=#{userId};
        </select>
    
        <resultMap id="userMap" type="com.charles.pojo.User">
         <result property="userName" column="userName"/>
         <result property="age" column="age"/>
         <association property="cardId" javaType="com.charles.pojo.Card"
                      column="cardId" select="com.charles.dao.CardMapper.queryCardById">
    
            </association>
        </resultMap>
    
    </mapper>

      这个方法比较复杂,但是很清晰,从第二个xml中,我们可以看出用户的cardId 已经和 身份证中的cardId进行了绑定。

    第五步:编写完后,进行测试。

      我们或许在面对大量数据时,编写这么复杂的东西会很难受,这个时候,我们可以将其代码进行简化。

      我们不需要Card的接口和SQL语句,取而代之的是在用户的SQL语句中进行resulMap的嵌套。

        <resultMap id="cardMap" type="com.charles.pojo.Card">
            <id property="cardId" column="cardId"/>
            <result property="cardNum" column="cardNum"/>
            <result property="address" column="address"/>
        </resultMap>
    
        <resultMap id="userMap" type="com.charles.pojo.User">
         <result property="userName" column="userName"/>
         <result property="age" column="age"/>
    
         <association property="cardId" javaType="com.charles.pojo.Card" resultMap="cardMap">
         </association>
    
        </resultMap>

      这个方法虽然理解起来比较难,但是简化了代码量,提高了效率。

    一对多

      学完一对一查询后,我们来学习一对多的使用,这个时候我们需要用到Collection。

    第一步:我们的第一步依旧是建表,我们以老师和学生为例。

    create table teacher(
    tid INT PRIMARY KEY,
    tname VARCHAR(100)
    );
    create table student(
    sid INT PRIMARY KEY,
    sname VARCHAR(100),
    tid INT,
    CONSTRAINT stu_tea
    FOREIGN KEY(tid) REFERENCES teacher(tid)
    );

    第二步:编写实体类

    package com.charles.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.List;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Teacher {
        private Integer tid;
        private String tname;
        private List<Student> students;
    }
    package com.charles.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student {
        private Integer sid;
        private String sname;
        private Integer tid;
    }

    第三步:添加接口

    package com.charles.dao;
    
    import com.charles.pojo.Teacher;
    import org.apache.ibatis.annotations.Param;
    
    public interface TeacherMapper {
        Teacher queryTeacherById(@Param("tid") int id);
    }

    第四步:编写SQL语句

    <?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.charles.dao.TeacherMapper">
        <select id="queryTeacherById" resultMap="TeacherMap">
            SELECT t.tid,t.tname,s.sid,s.sname,s.tid
            FROM teacher t,student s
            WHERE t.tid = s.tid
            AND t.tid = #{tid};
        </select>
    
        <resultMap id="TeacherMap" type="com.charles.pojo.Teacher">
            <id property="tid" column="tid"/>
            <result property="tname" column="tname"/>
            <collection property="students" ofType="com.charles.pojo.Student">
                <id property="sid" column="sid"/>
                <result property="sname" column="sname"/>
                <result property="tid" column="tid"/>
            </collection>
        </resultMap>
    </mapper>

    第五步:编写测试类进行测试。

       仔细一看,其实跟一对一没有多大的区别。这就是association和collection的使用演示。

  • 相关阅读:
    解决问题:Jenkins Web 部署任务失败
    微信开发者调试工具官方下载地址
    Android机USB调试功能
    DOMContentLoaded 和 Load 和 Finish
    Json to string, string to Json
    static 和 new对象的区别
    c# Image/Pdf 预览
    在console 中执行异步方法
    c# 压缩zip
    js -- string 转 html
  • 原文地址:https://www.cnblogs.com/Charles-H/p/Mybatis-07.html
Copyright © 2020-2023  润新知