mybatis中resultMap

mybatis中resultMap

一、字段映射(result标签)

<select id="getUsers" resultType="User">
	SELECT u.id as uid,u.username,u.password
	FROM USER u
</select>

这里我们把id改为了uid,对象是id与查询的是uid 不对应,在结果集中,我们将会丢失id数据。这时候我们就可以定义一个resultMap,来映射不一样的字段

<resultMap id="getUserByIdMap" type="User">
	<result property="id" column="uid"/>
</resultMap>

把上面的select语句中的resultType修改为resultMap="getUserByIdMap"

column对应的是数据库的列名或别名;property对应的是结果集的字段或属性

二、构造方法(constructor标签)

constructor主要是用来配置构造方法,默认情况下mybatis会调用实体类的无参构造方法创建一个实体类,然后再给各个属性赋值,但是有的时候我们可能为实体类生成了有参的构造方法,并且也没有给该实体类生成无参的构造方法,这个时候如果不做特殊配置,resultMap在生成实体类的时候就会报错,因为它没有找到无参构造方法

比如User类增加了一个构造方法:

public User(String id, String name) {
	this.id = id+"--------";
	this.username = name+"--------";
}

我们需要在resultMap中定义constructor元素:

<resultMap id="getUserByIdMap" type="User">
	<constructor>
		<idArg column="id" name="id" javaType="string"/>
		<arg column="username" name="name" javaType="string"/>
	</constructor>
</resultMap>

其中,column代表数据库字段名称或者别名;javaType指定了参数的类型。

三、一对一与多对一关联(association标签)

<resultMap type="Product" id="productBean">
    <id column="pid" property="id" />
    <result column="pname" property="name" />
    <result column="price" property="price" />
    <!-- 多对一的关系 -->
    <!-- property: 指的是属性名称, javaType:指的是属性的类型 -->
    <association property="category" javaType="Category">
        <id column="cid" property="id"/>
        <result column="cname" property="name"/>
    </association>
</resultMap>

<!-- 根据id查询Product, 关联将Orders查询出来 -->
<select id="listProduct" resultMap="productBean">
    select c.*, p.*, c.id 'cid', p.id 'pid', c.name 'cname', p.name 'pname' 
        from category_ c left join product_ p on c.id = p.cid
</select>

这里的多个产品对应一个分类,通过在resultMap中定义association实现

通过resultMap ,进行字段和属性的对应
使用association 进行多对一关系关联,指定表字段名称与对象属性名称的一一对应关系
注: Category的id 字段 和Product的id字段同名,Mybatis不知道谁是谁的,所以需要通过取别名cid,pid来区分。 name字段同理。

四、一对多(collection标签)

<resultMap type="Category" id="categoryBean">
    <id column="cid" property="id" />
    <result column="cname" property="name" />

    <!-- 一对多的关系 -->
    <!-- property: 指的是集合属性的值, ofType:指的是集合中元素的类型 -->
    <collection property="products" ofType="Product">
        <id column="pid" property="id" />
        <result column="pname" property="name" />
        <result column="price" property="price" />
    </collection>
</resultMap>

<!-- 关联查询分类和产品表 -->
<select id="listCategory" resultMap="categoryBean">
    select c.*, p.*, c.id 'cid', p.id 'pid', c.name 'cname', p.name 'pname' 
        from category_ c left join product_ p on c.id = p.cid
</select>

这里的一个分类定义多个产品,通过在resultMap中定义collection实现

通过left join关联查询,对Category和Product表进行关联查询。
通过resultMap把数据取出来放在对应的 对象属性里

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值