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把数据取出来放在对应的 对象属性里