mybatis(plus)进行一对一、一对多、多对多查询
一般步骤:
- 建实体类或者VO类
- 自定义resultMap
- 写sql
resultMap的编写
一对一查询
建实体类或者VO类中没有属性是自定义的类,正常写resultMap
有的话resultMap中需要使用association 标签,如
<resultMap type="Student" id="studentResultMap">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="gender" property="gender" />
<result column="grade" property="grade"/>
<association property="supervisor" javaType="Headmaster">
<id property="id" column="h_id"/>
<result property="name" column="h_name"/>
<result property="gender" column="h_gender"/>
</association>
</resultMap>
一对多查询
resultMap中需要使用collection 标签,如
<resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" >
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="content" property="content" jdbcType="VARCHAR" />
<result column="type" property="type" jdbcType="VARCHAR" />
<collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.xxx.entity.QuestionOption"
select="com.xxx.modules.xxx.mapper.QuestionOptionMapper.selectList" column="{qid=id,sort=sort}" />
<!-- qid/sort是定义的变量名, id/sort是主表的字段id/sort,
先查出主表的结果, 然后主表记录数是几 就执行几次 collection 的select,
javaType和ofType 写不写都行,
select的值: 对应xml的namespace + 对应xml中的代码片段的id,
column作为select语句的参数传入,如果只传一个参数id可以简写: column="id" -->
</resultMap>
或者
<resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" >
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="content" property="content" jdbcType="VARCHAR" />
<result column="type" property="type" jdbcType="VARCHAR" />
<result column="sort" property="sort" jdbcType="INTEGER" />
<collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.data.entity.QuestionOption">
<id column="o_id" property="id" jdbcType="VARCHAR" />
<result column="o_content" property="content" jdbcType="VARCHAR" />
<result column="o_sort" property="sort" jdbcType="INTEGER" />
</collection>
<!-- 列的别名 o_id,o_content,o_sort , 起别名是因为主子表都有这几个字段
这里要写 ofType, javaType还是可以不写 -->
</resultMap>
多对多查询
当前,一个用户可以拥有多个组,一个组也可以拥有多个用户,这样的关系就是多对多,为了解决这个问题,我们需要再用户和组之间建立一张关联的表,用于存储他们之间的对应关系,用户和组都通过这个关联的表,来查询他们之间的关系
现在我我们先来看一看这个关联对象的JavaBean和其Mybatis的Mapper文件是怎么样的
首先是JavaBean
再来看看这个实体对应的Mapper文件,只有两个功能
现在我们开始来看我们的主角Users用户和Group组这两位的JavaBean和Mapper文件时怎么写的
先看Users(用户实体)
Users的Mapper
这样查询到的的User对用户象就是这样的,把这个用户所对应的组都查了出来
Users{id=0, username=‘yiibai’, mobile=‘13838009988’, groups=[Group{groupId=1, groupName=‘Group-1’, users=null}, Group{groupId=2, groupName=‘Group-2’, users=null}]}
再来看看Group(组实体),其实就是和Users实体是一样的哈
还是看Group的JavaBean
再看看看Group的Mapper
这样再查询Group的时候就会把这个组的所有成员都查询出来了
Group{groupId=0, groupName=‘Group-1’, users=[Users{id=1, username=‘yiibai’, mobile=‘13838009988’, groups=null}, Users{id=2, username=‘User-name-1’, mobile=‘13838009988’, groups=null}]}
注意点
1:检查xml文件所在的package名称是否和interface对应的package名称一一对应
2:检查xml文件的namespace是否和xml文件的package名称一一对应
3:检查函数名称能否对应上
4: 检查配置文件中mybatis.mapper-location或者mybatis-plus.mapper-locations有没有写