2018-04-02 15:06:29 519浏览
在现实的项目中进行数据库建模时,我们要遵循数据库设计范式的要求,会对现实中的业务模型进行拆分,封装在不同的数据表中,表与表之间存在着一对多或是多对多的对应关系。进而,我们对数据库的增删改查操作的主体,也就从单表变成了多表。那么Mybatis中是如何实现这种多表关系的映射呢?
CREATETABLE`users`(
`uid`bigint(20)NOTNULLAUTO_INCREMENT,
`uname_uu`varchar(255)DEFAULTNULL,
`upwd`varchar(255)DEFAULTNULL,
`sex`varchar(255)DEFAULTNULL,
`birthday`dateDEFAULTNULL,
PRIMARYKEY(`uid`)
)ENGINE=InnoDBAUTO_INCREMENT=20DEFAULTCHARSET=utf8;
CREATETABLE`orders`(
`oid`bigint(255)NOTNULLAUTO_INCREMENT,
`oprice`doubleDEFAULTNULL,
`createtime`datetimeDEFAULTNULL,
`flag`varchar(255)DEFAULTNULLCOMMENT'订单的状态',
`uid`bigint(20)DEFAULTNULLCOMMENT'外键',
PRIMARYKEY(`oid`),
KEY`uid`(`uid`),
CONSTRAINT`orders_ibfk_1`FOREIGNKEY(`uid`)REFERENCES`users`(`uid`)
)ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8;
UserMapper配置文件如下:
<!--关联查询出一方-->
<!--查询订单的时候去关联查询用户-->
<!--a.嵌套查询映射只查询一个表-->
<selectid="queryOrderWithUser"resultMap="OrderAndUserMap">
select*fromorders
</select>
<!--定义一个resultMap-->
<!--type:pojo类id:resultMap的唯一标志-->
<resultMaptype="order"id="OrderAndUserMap">
<!--如果column和pojo属性名(property)一致可以不写-->
<idcolumn="oid"property="oid"/>
<!--关联查询出一方
column:外键字段
property:关联对象的属性名
javaType:写pojo类的类型
select:写statement对象的id值
-->
<associationcolumn="uid"property="user"javaType="user"select="queryUserByUid">
<!--<resultcolumn="uname_uu"property="uname"/>-->
</association>
</resultMap>
<selectid="queryUserByUid"parameterType="long"resultMap="myUserMap1">
select*fromuserswhereuid=#{uid}
</select>
<!--配置resultMap-->
<!--需要配置需要的所有属性不管列明和属性名是否一致-->
<resultMaptype="order"id="OrderAndUserMap2">
<idcolumn="oid"property="oid"/>
<resultcolumn="oprice"property="oprice"/>
<resultcolumn="flag"property="flag"/>
<resultcolumn="createtime"property="createtime"/>
<!--
property:属性名
javaType:pojo的类型也可以通过resulteMap指定返回的结果集
-->
<associationproperty="user"resultMap="myUserMap1"/>
</resultMap>
UserMapper.java接口方法如下:
//查询订单去关联查询用户
List<Order>queryOrderWithUser();
测试代码:
////14.查询订单去关联查询用户嵌套查询映射
@Test
publicvoidrun14()throwsIOException{
UserMappermapper=sqlSession.getMapper(UserMapper.class);
List<Order>c=mapper.queryOrderWithUser();
System.out.println(c);
}
UserMapper.xml
<selectid="queryUserWithOrder2"resultMap="OrderAndUserMap2">
<!--sql左外连接查询-->
select*fromordersasoleftouterjoinusersasuono.uid=u.uid;
</select>
<!--配置resultMap-->
<!--需要配置需要的所有属性不管列明和属性名是否一致-->
<resultMaptype="order"id="OrderAndUserMap2">
<idcolumn="oid"property="oid"/>
<resultcolumn="oprice"property="oprice"/>
<resultcolumn="flag"property="flag"/>
<resultcolumn="createtime"property="createtime"/>
<!--
property:属性名
javaType:pojo的类型也可以通过resulteMap指定返回的结果集
-->
<associationproperty="user"resultMap="myUserMap1"/>
</resultMap>
<resultMaptype="user"id="myUserMap1">
<!--配置主键映射
column:表的字段
property:pojo的属性
-->
<idcolumn="uid"property="uid"/>
<!--配置普通属性-->
<resultcolumn="uname_uu"property="uname"/>
<resultcolumn="sex"property="sex"/>
<resultcolumn="birthday"property="birthday"/>
</resultMap>
UserMapper.java接口方法如下:
//查询订单去关联查询用户
List<Order>queryOrderWithUser2();
测试代码:
////14.查询订单去关联查询用户嵌套查询映射
@Test
publicvoidrun14()throwsIOException{
UserMappermapper=sqlSession.getMapper(UserMapper.class);
List<Order>c=mapper.queryOrderWithUser2();
System.out.println(c);
}
3、查询2个表
自己整一个pojo类把需要用到的user表的字段和order表的字段全都写进去直接用resultType
<selectid="queryUserWithOrder2"resultType="UserOrder"> <!--sql左外连接查询--> select*fromordersasoleftouterjoinusersasuono.uid=u.uid; </select>
最后想要了解更多Java信息的同学可以前往扣丁学堂官网咨询,扣丁学堂Java培训深受学员的喜爱。扣丁学堂不仅有专业的老师和与时俱进的课程体系,还有大量的Java视频教程供学员观看学习哦。Java技术交流群:670348138。
【关注微信公众号获取更多学习资料】