MyBatis进阶(一)—映射

来源:互联网 发布:linux怎么发送arp请求 编辑:程序博客网 时间:2024/05/17 00:05

  • 一对一查询
    • resultType实现
    • resultMap实现
  • 一对多查询
  • 延迟加载
    • 配置mybatis支持延迟加载
    • 一对一延迟加载
    • 一对多延迟加载
  • resultTyperesultMap延迟加载使用场景总结

一对一查询

resultType实现

Orders类中添加关联用户信息

public class Orders implements Serializable {    private Integer id;    private Integer userId;    private String number;    private Date createtime;    private String note;    //关联用户信息    private User user;    //省略getter和setter}

xml中配置:

<!-- 一对一查询使用reusltType完成        查询订单关联查询用户信息     -->     <select id="findOrderUserList" resultType="orderCustom">        SELECT            orders.*, USER .username,            USER .sex        FROM            orders,            USER        WHERE            orders.user_id = USER .id     </select>

只要在查询的类中关联需要的信息即可。

resultMap实现

xml中配置:

<!-- 一对一查询resultMap 查询订单关联查询用户信息-->    <resultMap type="orders" id="ordersUserResultMap">        <id column="id" property="id"/>        <result column="user_id" property="userId"/>        <result column="number" property="number"/>        <result column="createtime" property="createtime"/>        <result column="note" property="note"/>        <association property="user" javaType="user">            <id column="user_id" property="id"/>            <result column="username" property="username"/>            <result column="sex" property="sex"/>        </association>    </resultMap><!-- 一对一查询使用reusltMap完成        查询订单关联查询用户信息     -->     <select id="findOrderUserListResultMap" resultMap="ordersUserResultMap" >          SELECT               orders.*,              user.username,              user.sex           FROM              orders,              USER           WHERE orders.user_id = user.id      </select>

association:用于对关联信息映射到单个pojo
property:要将关联信息映射到orders的哪个属性中
javaType:关联信息映射到orders的属性的类型,是user的类型

一对多查询

xml中配置

<!-- 一对多    查询订单、用户及订单明细 -->    <resultMap type="orders" id="orderAndOrderDetails" extends="ordersUserResultMap">        <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">            <id column="orderdetail_id" property="id"/>            <result column="items_num" property="itemsNum"/>            <result column="items_id" property="itemsId"/>        </collection>    </resultMap>

映射订单信息,和用户信息,这里使用继承ordersUserResultMap
映射订单明细信息
property:要将关联信息映射到orders的哪个属性中
ofType:集合中pojo的类型

复杂一对多

<!-- 一对多查询    查询用户及订单明细和商品信息 -->    <resultMap type="user" id="userOrderDetailResultMap">        <!-- 用户信息映射 -->        <id column="user_id" property="id"/>        <result column="username" property="username"/>        <result column="sex" property="sex"/>        <!-- 订单信息 -->        <collection property="orderlist" ofType="cn.itcast.mybatis.po.Orders">                <id column="id" property="id"/>                <result column="user_id" property="userId"/>                <result column="number" property="number"/>                <result column="createtime" property="createtime"/>                <result column="note" property="note"/>                <!-- 订单明细映射 -->                <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">                    <id column="orderdetail_id" property="id"/>                    <result column="items_num" property="itemsNum"/>                    <result column="items_id" property="itemsId"/>                    <!-- 商品信息 -->                    <association property="items" javaType="cn.itcast.mybatis.po.Items">                        <id column="item_id" property="id"/>                        <result column="items_name" property="name"/>                        <result column="items_detail" property="detail"/>                    </association>                </collection>        </collection>    </resultMap>

延迟加载

配置mybatis支持延迟加载

<!-- 全局配置参数 -->    <settings>        <!-- 延迟加载总开关 -->        <setting name="lazyLoadingEnabled" value="true" />          <!-- 设置按需加载 -->        <setting name="aggressiveLazyLoading" value="false" />    </settings>

一对一延迟加载

<!-- 一对一查询延迟加载 的配置 -->    <resultMap type="orders" id="orderCustomLazyLoading">        <!-- 完成了订单信息的映射配置 -->        <!-- id:订单关联用户查询的唯 一 标识 -->        <id column="id" property="id" />        <result column="user_id" property="userId" />        <result column="number" property="number" />        <result column="createtime" property="createtime" />        <result column="note" property="note" />        <association property="user" select="cn.itcast.mybatis.mapper.UserMapper.findUserById" column="user_id">        </association>    </resultMap><!-- 一对一查询延迟加载    开始只查询订单,对用户信息进行延迟加载 -->     <select id="findOrderUserListLazyLoading" resultMap="orderCustomLazyLoading">         SELECT             orders.*         FROM            orders     </select>

一对多延迟加载

一对多延迟加载的方法同一对一延迟加载,在collection标签中配置select内容。

resultType、resultMap、延迟加载使用场景总结

延迟加载:
延迟加载实现的方法多种多样,在只查询单表就可以满足需求,为了提高数据库查询性能使用延迟加载,再查询关联信息。

mybatis提供延迟加载的功能用于service层。

  • resultType:
    作用:
    将查询结果按照SQL列名POJO属性名一致性映射到POJO中。
    场合:
    常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

  • resultMap:
    使用association和collection完成一对一和一对多高级映射。
    association:
    作用:
    将关联查询信息映射到一个pojo类中。
    场合:
    为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。
    collection:
    作用:
    将关联查询信息映射到一个list集合中。
    场合:
    为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list中。

0 0
原创粉丝点击