Mybatis的相关使用
-
resultMap适合复杂的,自定义的结果
<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>
1.1 assocaiation 和 collection的在关联查询中的用法
1.1.1 association 表达的是一对一的关系
<resultMap id="VideoOrderResultMap" type="VideoOrder"> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="out_trade_no" property="outTradeNo"/> <result column="create_time" property="createTime"/> <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"/> <!-- association 配置属性一对一 property 对应videoOrder里面的user属性名 javaType 这个属性的类型 --> <association property="user" javaType="User"> <id property="id" column="user_id"/> <result property="name" column="name"/> <result property="headImg" column="head_img"/> <result property="createTime" column="create_time"/> <result property="phone" column="phone"/> </association> </resultMap> <!--一对一管理查询订单, 订单内部包含用户属性--> <select id="queryVideoOrderList" resultMap="VideoOrderResultMap"> select o.id id, o.user_id , o.out_trade_no, o.create_time, o.state, o.total_fee, o.video_id, o.video_title, o.video_img, u.name, u.head_img, u.create_time, u.phone from video_order o left join user u on o.user_id = u.id </select>
Collection 表达一对多的关联查询,例如同一个用户下面有多个关联的订单
<resultMap id="UserOrderResultMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="headImg" column="head_img"/> <result property="createTime" column="create_time"/> <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="create_time" property="createTime"/> <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.create_time, u.phone, o.id order_id, o.out_trade_no, o.user_id, o.create_time, o.state, o.total_fee, o.video_id, o.video_title, o.video_img from user u left join video_order o on u.id = o.user_id </select>
resultMap的总结:
<!-- column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性--> <resultMap id="唯一的标识" type="映射的pojo对象"> <id column="表的主键字段,或查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" /> <result column="表的一个字段" jdbcType="字段类型" property="映射到pojo对象的一个属性"/> <association property="pojo的一个对象属性" javaType="pojo关联的pojo对象"> <id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的属性"/> <result column="表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/> </association> <!-- 集合中的property 需要为oftype定义的pojo对象的属性--> <collection property="pojo的集合属性名称" ofType="集合中单个的pojo对象类型"> <id column="集合中pojo对象对应在表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" /> <result column="任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" /> </collection> </resultMap>