MyBatis关系映射

Posted kula

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis关系映射相关的知识,希望对你有一定的参考价值。

MyBatis关系映射


1.一对一

①嵌套查询

<!--IdCardMapper.xml-->
<mapper namespace="com.itheima.mapper.IdCardMapper">
    <select id="findCodeById" parameterType="Integer" resultType="idCard">
        SELECT * FROM tb_idcard where id=#{id}
    </select>
</mapper>

<!--PersonMapper.xml-->
<mapper namespace="com.itheima.mapper.PersonMapper">
    <select id="findPersonById" parameterType="Integer"
            resultMap="IdCardWithPersonResult">
        SELECT * FROM tb_person where id=#{id}
    </select>
    <resultMap id="IdCardWithPersonResult" type="person">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <association property="card" column="card_id" javaType="IdCard"
                     select="com.itheima.mapper.IdCardMapper.findCodeById"/>
    </resultMap>
</mapper>
  • column:嵌套查询用到的在第一次查询中的字段(传参)
  • select:嵌套执行的SQL语句id
  • javaType:嵌套查询返回对象的类型
  • property:查询后映射的属性
  • fecheType:是否延迟加载 lazy 或者eager(默认不延迟)

column → select → property

注意:主配置文件中要使用 typeAliases 设置类别名


②嵌套结果

只执行一条语句减少消耗数据库性能

<mapper namespace="com.itheima.mapper.PersonMapper">
    <select id="findPersonById2" parameterType="Integer"
            resultMap="IdCardWithPersonResult2">
        SELECT p.*,idcard.code
        from tb_person p, tb_idcard idcard
        where p.card_id=idcard.id
        and p.id=#{id}
    </select>
    <resultMap id="IdCardWithPersonResult2" type="person">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <association property="card" javaType="IdCard">
            <id property="id" column="card_id"/>
            <result property="code" column="code"/>
        </association>
    </resultMap>
</mapper>

③关于延时加载

在主配置文件中进行配置

<settings>
    <!--打开延迟加载开关-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--将积极加载改为延迟加载,按需加载-->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

在映射文件中的<association>和<collection>中设置fetchType="lazy",这样可以一定程度上降低消耗提高查询效率


2.一对多

<mapper namespace="com.itheima.mapper.UserMapper">
    <select id="findUserWithOrders" parameterType="Integer"
            resultMap="UserWithOrdersResult">
        SELECT u.*,o.id as orders_id,o.number
        from tb_user u,tb_orders o
        where u.id=o.user_id
        and u.id=#{id}
    </select>
    <resultMap id="UserWithOrdersResult" type="User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="address" column="address"/>
        <collection property="ordersList" ofType="orders">
            <id property="id" column="orders_id"/>
            <result property="number" column="number"/>
        </collection>
    </resultMap>
</mapper>

ofType为集合中包含类型


3.多对多

①嵌套查询

<!--OrdersMapper.xml-->
<mapper namespace="com.itheima.mapper.OrdersMapper">
    <select id="findOrdersWithProduct" parameterType="Integer"
            resultMap="OrdersWithProductResult">
        select * from tb_orders where id=#{id}
    </select>
    <!--嵌套查询-->
    <resultMap id="OrdersWithProductResult" type="Orders">
        <id property="id" column="id"/>
        <result property="number" column="number"/>
        <collection property="productList" column="id" ofType="product"
                    select="com.itheima.mapper.ProductMapper.findProductById">
        </collection>
    </resultMap>
</mapper>

<!--ProductMapper.xml-->
<mapper namespace="com.itheima.mapper.ProductMapper">
    <select id="findProductById" parameterType="Integer"
            resultType="Product">
        Select * from tb_product where id IN(
            SELECT product_id FROM tb_ordersitem WHERE orders_id=#{id}
        )
    </select>
</mapper>

②嵌套结果

<mapper namespace="com.itheima.mapper.OrdersMapper">
    <select id="findOrdersWithProduct2" parameterType="Integer"
            resultMap="OrdersWithProductResult2">
        select o.*,p.id as pid,p.name,p.price
        from tb_orders o,tb_product p,tb_ordersitem oi
        where oi.orders_id=o.id
        and oi.product_id=p.id
        and o.id=#{id}
    </select>
    <!--嵌套结果-->
    <resultMap id="OrdersWithProductResult2" type="Orders">
        <id property="id" column="id"/>
        <result property="number" column="number"/>
        <collection property="productList" ofType="Product">
            <id property="id" column="pid"/>
            <result property="name" column="name"/>
            <result property="price" column="price"/>
        </collection>
    </resultMap>
</mapper>

以上是关于MyBatis关系映射的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 关系映射

mybatis xml数据层框架应用--Mybatis关系映射之一对多关系映射

mybatis xml数据层框架应用--Mybatis关系映射之一对一关系映射

MyBatis框架

Java 中mybatis 关系映射,比如:一对多

Mybatis之关联关系(一对多多对多)