mybatis3.x复杂sql查询

mybatis3.x的resultmap

1.mybatis的sql语句返回的结果有两种

  • resulttype
  • 查询出的字段在相应的pojo中必须有和它相同的字段对应,或者基本数据类型
  • 适合简单查询
  • resultmap

需要自定义字段,或者多表查询,一对多等关系,比resulttype更强大
适合复杂查询

<resultmap id="videoresultmap" type="video">
	<!--
	id 指定查询列列的唯⼀一标示
	column 数据库字段的名称
	property pojo类的名称
	-->
	<id column="id" property="id" jdbctype="integer" />
	<result column="video_tile" property="title" jdbctype="varchar" />
	<result column="summary" property="summary" jdbctype="varchar" />
	<result column="cover_img" property="coverimg" jdbctype="varchar" />
</resultmap>
<select id="selectbasefieldbyidwithresultmap" resultmap="videoresultmap">
	select id , title as video_tile, summary, cover_img from video where id = #{video_id}
</select>

resultmap复杂对象一对一查询结果映射之association

association:映射到pojo的某个复杂类型属性,比如订单order对象里面包含user对象

<!-- 名称空间,需要保存全局唯一,最好是和dao层的java接口一致
   可以映射sql语句到对应的方法名参数和返回值
   mybatis是使用接口动态代理
 -->
<mapper namespace="net.xiaotiancai.online_class.dao.videoordermapper">
  <resultmap id="videoorderresultmap" type="videoorder">
    <id column="id" property="id"></id>
    <result column="user_id" property="userid"></result>
    <result column="out_trade_no" property="outtradeno"></result>
    <result column="state" property="state"></result>
    <result column="total_fee" property="totalfee"></result>
    <result column="video_id" property="videoid"></result>
    <result column="video_title" property="videotitle"></result>
    <!--
    配置属性一对一
    property对应videoorder里面的user
    javatype对应这个属性的类型
    -->
    <association property="user" javatype="user">
      <id column="user_id" property="id"></id>
      <result column="name" property="name"></result>
      <result column="head_img" property="headimg"></result>
      <result column="phone" property="phone"></result>

    </association>
  </resultmap>
  <!--一对一订单查询,订单内部包含用户属性-->
  <select id="queryvideoorderlist" resultmap="videoorderresultmap">
    select
    o.id id,
    o.user_id,
    o.out_trade_no,
    o.state,
    o.total_fee,
    o.video_id,
    o.video_title,
    u.name,
    u.head_img,
    u.phone
    from video_order o left join user u on o.user_id = u.id
  </select>
</mapper>

代码

// resultmap association关联查询
videoordermapper videoordermapper =sqlsession.getmapper(videoordermapper.class);
list<videoorder> videoorderlist = videoordermapper.queryvideoorderlist();
system.out.println(videoorderlist.tostring());

resultmap复杂对象一对多查询结果映射之collection

collection: 一对多查询结果查询映射,比如user有多个订单

 <resultmap id="userorderresultmap" type="user">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="headimg" column="head_img"/>
    <result property="phone" column="phone"/>
    <!--
    property 填写pojo类中集合类属性的名称
    oftype 集合⾥里里⾯面的pojo对象
    -->
    <collection property="videoorderlist" oftype="videoorder">
      <!--配置主键,管理理order的唯⼀一标识-->
      <id column="order_id" property="id"/>
      <result column="user_id" property="userid"/>
      <result column="out_trade_no" property="outtradeno"/>
      <result column="state" property="state"/>
      <result column="total_fee" property="totalfee"/>
      <result column="video_id" property="videoid"/>
      <result column="video_title" property="videotitle"/>
      <result column="video_img" property="videoimg"/>
    </collection>
  </resultmap>
  <select id="queryuserorder" resultmap="userorderresultmap">
    select
    u.id,
    u.name,
    u.head_img,
    u.phone,
    o.id order_id,
    o.out_trade_no,
    o.user_id,
    o.state,
    o.total_fee,
    o.video_id,
    o.video_title
    from user u left join video_order o on u.id = o.user_id
  </select>

代码

// resultmap association关联查询
videoordermapper videoordermapper =sqlsession.getmapper(videoordermapper.class);
//resultmap collection测试
list<user> userlist = videoordermapper.queryuserorder();
system.out.println(userlist.tostring());

mybatis3.x resultmap复杂对象查询总结

总结resultmap的复杂对象查询

  • association映射的是一个pojo类,处理一对一的关联关系。
  • collection映射的一个集合列表,处理的是一对多的关联关系。
  • 模板
<!--column不做限制,可以为任意表的字段,而property须为type定义的pojo属性-->
<resultmap id=“唯一的标识”type=“映射的pojo对象">
	<id column="表的主键字段,或查询语句中的别名字段”jdbcrype="字段类型”property=“映射pojo对象的主键属性"/>
	<result column="表的一个字段”jdbcrype="字段类型”property=“映射到pojo对象的一个属性"/>
	<association property="pojo的一个对象属性”javarype="pojo关联的pojo对象">
  <id column="关联pojo对象对应表的主键字段”jdbcrype="字段类型”property="关联pojo对象的属性"/>
	<result column="表的字段”jdbcrype="字段类型”property="关联pojo对象的属性"/>
</association>
<!--集合中的property 需要为oftype定义的pojo对象的属性-->
<collection property="pojo的集合属性名称”oftype="集合中单个的pojo对象类型">
 	<id column="集合中pojo对象对应在表的主键字段”jdbcrype="字段类型”property=“集合中pojo对象的主键属性”/>
	<result column="任意表的字段”jdbcrype="字段类型”property="集合中的pojo对象的属性”/>
</collection>
</resultmap>

到此这篇关于mybatis3.x复杂sql查询的文章就介绍到这了,更多相关mybatis复杂sql查询内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!