• mybatis 查询一对一


    官方文档

    Mapper接口

    public interface UserMapper {
        User getUser(int userId);
    }
    public interface ArticleMapper {
        List<Article> getArticleByUserId(int userId);
    }

    第一种方法

    ArticleMapper.xml

    
    
    <resultMap id="article" type="com.mybatis.model.Article">
            <id property="articleId" column="article_id" ></id>
            <result property="title" column="title"></result>
            <result property="content" column="content"></result>
            <result property="createDate" column="create_date" jdbcType="TIMESTAMP"></result>
            <association property="user" column="user_id" select="com.mybatis.mapper.UserMapper.getUser"></association>
        </resultMap>
    <select id="getArticleByUserId" parameterType="int" resultMap="article">
    SELECT
    a.article_id,
    a.user_id,
    a.title,
    a.content,
    a.create_date
    FROM
    t_artile a
    where a.user_id = #{id}
    </select>

    UserMapper.xml

        <select id="getUser" parameterType="int" resultType="com.mybatis.model.User">
            select user_id as userId,
                    username,
                    password,
                    age
             from t_user where user_id=#{id}
        </select>

    ArticleMapper.xml 中使用的是UserMapper的查询方法的接口,这样有两个查询语句,一个查询文章,一个查询用户。

    这种方式很简单, 但是对于大型数据集合和列表将不会表现很好。 问题就是我们熟知的 “N+1 查询问题”。概括地讲,N+1 查询问题可以是这样引起的:

    • 你执行了一个单独的 SQL 语句来获取结果列表(就是“+1”)。
    • 对返回的每条记录,你执行了一个查询语句来为每个加载细节(就是“N”)。

    这个问题会导致成百上千的 SQL 语句被执行。这通常不是期望的。

    MyBatis 能延迟加载这样的查询就是一个好处,因此你可以分散这些语句同时运行的消 耗。然而,如果你加载一个列表,之后迅速迭代来访问嵌套的数据,你会调用所有的延迟加 载,这样的行为可能是很糟糕的。

    第二种方法

    ArticleMapper.xml

    <resultMap id="article" type="com.mybatis.model.Article">
    <id property="articleId" column="article_id" ></id>
    <result property="title" column="title"></result>
    <result property="content" column="content"></result>
    <result property="createDate" column="create_date" jdbcType="TIMESTAMP"></result>
    <association property="user" column="user_id" resultMap="user"></association>
    </resultMap>

    <resultMap id="user" type="com.mybatis.model.User">
    <id property="userId" column="user_id"></id>
    <result property="username" column="username"></result>
    <result property="password" column="password"></result>
    <result property="age" column="age"></result>
    </resultMap>
    --------------OR-------------------------
    <resultMap id="article" type="com.mybatis.model.Article">
    <id property="articleId" column="article_id" ></id>
    <result property="title" column="title"></result>
    <result property="content" column="content"></result>
    <result property="createDate" column="create_date" jdbcType="TIMESTAMP"></result>
    <association property="user" javaType="com.mybatis.model.User" >
    <id property="userId" column="user_id"></id>
    <result property="username" column="username"></result>
    <result property="password" column="password"></result>
    <result property="age" column="age"></result>
    </association>
    </resultMap>

    <select id="getArticleByUserId" parameterType="int" resultMap="article">
    SELECT
    a.article_id,
    a.user_id,
    a.title,
    a.content,
    a.create_date,
    b.username,
    b.password,
    b.age
    FROM
    t_artile a
    INNER JOIN t_user b ON a.user_id = b.user_id
    where a.user_id = #{id}
    </select>

    这样写sql时就要关联user表了。

  • 相关阅读:
    CCF-CSP201703-3 Markdown
    HDU1008 Elevator
    Java使用Preconditions.checkNotNull(.....)优雅地判空对象, 并处理可能的NullPointerException异常
    StringUtils的isBlank()方法
    java.math.RoundingMode 几个参数详解
    把String集合数据去"[ ]" 转成list和把String集合数据去除[ "" ,""] 转成list 工具类
    BeanUtils.copyProperties(复制对象属性方法)
    关于 mybatis 中 in 写法,<foreach collection="xxx" item="xxx" index="index" open="(" separator="," close=")"> 参数详解
    JAVA_collection_集合相关知识点(二、获取集合对象中某个属性的集合——CollectionUtils.collect()方法)
    @AllArgsConstructor @NoArgsConstructor
  • 原文地址:https://www.cnblogs.com/alway-july/p/6673736.html
Copyright © 2020-2023  润新知