在现实的项目中进行数据库建模时,我们要遵循数据库设计范式的要求,会对现实中的业务模型进行拆分,封装在不同的数据表中,表与表之间存在着一对多或是多对多的对应关系。进而,我们对数据库的增删改查操作的主体,也就从单表变成了多表。那么Mybatis中是如何实现这种多表关系的映射呢?
请输入图片描述
查询结果集ResultMap
resultMap元素是MyBatis中最重要最强大的元素。它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那个东西,而且在一些情形下允许你做一些JDBC不支持的事情。事实上,编写相似于对复杂语句联合映射这些等同的代码,也许可以跨过上千行的代码。
有朋友会问,之前的示例中我们没有用到结果集,不是也可以正确地将数据表中的数据映射到Java对象的属性中吗?是的。这正是resultMap元素设计的初衷,就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
?resultMap元素中,允许有以下直接子元素:
?constructor-类在实例化时,用来注入结果到构造方法中(本文中暂不讲解)
?id-作用与result相同,同时可以标识出用这个字段值可以区分其他对象实例。可以理解为数据表中的主键,可以定位数据表中唯一一笔记录
?result-将数据表中的字段注入到Java对象属性中
?association-关联,简单的讲,就是“有一个”关系,如“用户”有一个“帐号”
?collection-集合,顾名思议,就是“有很多”关系,如“客户”有很多“订单”
?discriminator-使用结果集决定使用哪个个结果映射(暂不涉及)
1.嵌套查询映射
嵌套查询映射:通过执行另外一个SQL映射语句来返回预期的复杂类型。
想查询出订单的时候去给我关联查询出该订单所属于的用户信息。(查询一张表)
users表和orders表两张表如下:
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配置文件如下:
select*fromorders
column:外键字段
property:关联对象的属性名
javaType:写pojo类的类型
select:写statement对象的id值
-->
select*fromuserswhereuid=#{uid}
property:属性名
javaType:pojo的类型也可以通过resulteMap指定返回的结果集
-->
UserMapper.java接口方法如下:
//查询订单去关联查询用户
ListqueryOrderWithUser();
测试代码:
////14.查询订单去关联查询用户嵌套查询映射
@Test
publicvoidrun14()throwsIOException{
UserMappermapper=sqlSession.getMapper(UserMapper.class);
Listc=mapper.queryOrderWithUser();
System.out.println(c);
}
2.嵌套结映射
嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集。
UserMapper.xml
select*fromordersasoleftouterjoinusersasuono.uid=u.uid;
property:属性名
javaType:pojo的类型也可以通过resulteMap指定返回的结果集
-->
column:表的字段
property:pojo的属性
-->
UserMapper.java接口方法如下:
//查询订单去关联查询用户
ListqueryOrderWithUser2();
测试代码:
////14.查询订单去关联查询用户嵌套查询映射
@Test
publicvoidrun14()throwsIOException{
UserMappermapper=sqlSession.getMapper(UserMapper.class);
Listc=mapper.queryOrderWithUser2();
System.out.println(c);
}
3查询2个表自己整一个pojo类把需要用到的user表的字段和order表的字段全都写进去直接用resultType
select*fromordersasoleftouterjoinusersasuono.uid=u.uid;
网友评论