SSM框架学习之(四)Mybatis——高级映射(多表查询)

SSM框架学习之(四)Mybatis——高级映射(多表查询)

使用resultType查询

需求:查询订单表和用户表的信息

对应sql语句:

SELECT 
  orders.*,
  USER.username,
  USER.sex,
  USER.address 
FROM
  orders,
  USER 
WHERE orders.user_id = user.id

使用resultType进行查询,先创建一个对应pojo包装类:

//继承自订单类用于订单类的全部属性,并添加了部分用户属性
public class OrderCustom extends Orders{
    private String username;
    private String sex;
    private String address;

编写相应的mapper接口文件:

public interface OrderMapperCustom {
    //使用resultType方式查询订单用户信息,返回OrderCustom对象集合,
    //OrderCustom继承自Orders并添加了用户信息对应的字段
    List<OrderCustom> findOrderUser() throws Exception;
}

然后编写对应的映射文件:

<mapper namespace="cn.allene.mybatis.threed.mapper.OrderMapperCustom">

    <!-- 使用pojo包装类方式 使用resultType查询订单用户信息 -->
    <select id="findOrderUser" resultType="cn.allene.mybatis.threed.po.OrderCustom">
        SELECT
            orders.*,
            USER.username,
            USER.sex,
            USER.address
        FROM
            orders,
            USER
        WHERE orders.user_id = user.id
    </select>
</mapper>

别忘了在在mybatis配置文件的sqlmapperconfig文件中添加映射文件:

<!--这里采用package标签扫描的方式加载映射文件,会自动扫描相对应的包下所有的映射文件-->
<mappers>
    <package name="cn.allene.mybatis.threed.mapper"/>
</mappers>

最后编写测试文件:创建sqlSessionFactory工厂方法就不给出了

@Test
public void testFindOrderUser() throws Exception {
    SqlSession session = sqlSessionFactory.openSession();

    OrderMapperCustom mapper = session.getMapper(OrderMapperCustom.class);

    List<OrderCustom> list = mapper.findOrderUser();

    System.out.println(list);
    session.close();
}

使用resultMap查询

对应的需求和上面的不变,所以sql语句也不变

首先得在Orders对象中添加User对象:

//这是一对一的查询就添加单个对象,如果是一对多就是添加一个集合
public class Orders {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    private User user;

编写mapper接口文件:

public interface OrderMapperCustom {
    //使用resultType方式查询订单用户信息,返回OrderCustom对象集合,
    //OrderCustom继承自Orders并添加了用户信息对应的字段
    List<OrderCustom> findOrderUser() throws Exception;
    //使用resultMap方式查询订品用户信息,返回Orders对象集合,Orders对象里添加了User对象信息
    List<Orders> findOrderUserResultMap() throws Exception;
}

然后编写相对应的mapper映射文件:

<!-- 使用resultmap方式查询订单用户信息 -->
<!--所有id是指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id-->
<select id="findOrderUserResultMap" resultMap="OrderUserResultMap">
    SELECT
        orders.*,
        USER.username,
        USER.sex,
        USER.address
    FROM
        orders,
        USER
    WHERE orders.user_id = user.id
</select>
<resultMap type="cn.allene.mybatis.threed.po.Orders" id="OrderUserResultMap">
    <id column="id" property="id"/>
    <result column="userId" property="userId"/>
    <result column="number" property="number"/>
    <result column="createtime" property="createtime"/>
    <result column="note" property="note"/>
    <!--一对一使用association标签,javaType使用对应的实体类路径-->
    <!--一对多使用使用collection标签,javaType使用集合里面对应的实体类路径-->
    <association property="user" javaType="cn.allene.mybatis.threed.po.User">
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
    </association>
</resultMap>

由于添加映射文件使用的是扫描的方式,所以不用添加

最后测试:

@Test
public void testFindOrderUserResultMap() throws Exception{
    SqlSession session = sqlSessionFactory.openSession();

    OrderMapperCustom mapper = session.getMapper(OrderMapperCustom.class);

    List<Orders> list = mapper.findOrderUserResultMap();

    System.out.println(list);
    session.close();
}

resultType和resultMap实现查询对比

  1. resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。如果没有查询结果的特殊要求建议使用resultType。

  2. resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。

  3. resultMap可以实现延迟加载,resultType无法实现延迟加载。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值