mybatis一对多
实际业务中会遇到场景关系描述的需求,一个场景会对应多个节点来具体描述整个场景关系,单个节点会有节点属性信息。
业务需求一:根据场景ID查询整个场景信息
业务需求二:根据场景ID删除整个场景信息
业务需求三:根据场景ID更新整个场景信息
以下创建三个model类,Scenario,Node,Prop。
Scenario类我只写三个字段,剩余字段可以有场景描述,场景创建时间,场景创建者,最新一次更新时间,版本,等等字段,废话不多说,上代码:
@Data
public class Scenario{
private String scenarioId;
private String scenarioName;
List<Node> nodes;
}
Node类,我只写三个字段,剩余字段可以是记录该节点在前端显示的横坐标、纵坐标等等。
@Data
public class Node{
private String nodeId;
private String nodeName;
private String scenarioId;
List<Prop> props;
}
Prop类我只写四个字段,剩余字段可以是.......
@Data
public class Prop{
private String varId;
private String varName;
private String varValue;
private String nodeId;
}
创建接口类,ScenarioDao
@Repository
@Mapper
public interface ScenarioDao{
Scenario getScenarioAllInfoById{Scenario scenarioId};
}
然后在Mapper xml文件里该如何书写呢,体现一对多的关系。书写Mapper xml之前要先写sql,一对多的sql。
select a.*,b.*c.*
from scenario a
inner join node b
on a.scenarioId = b.scenarioId
inner join node c
on b.nodeId = c.nodeId
and a.scenarioId = '007'
然后就看看xml文件里的内容改怎么写呢?
ScenarioMapper.xml property="nodes" ,nodes来源于Scenario类中List<Node>。
前两行省略
<mapper namespace="com.xxx.xxx.xxx.xxx.ScenarioDao">
<resultMap id = "BaseResultMap" type= "com.xxx.xxx.xxx.xxx.Scenario">
<result column="SCENARIO_ID" property="scenarioId" jdbcType="VARCHAR"/>
<result column="SCENARIO_Name" property="scenarioName" jdbcType="VARCHAR"/>
<collection property="nodes" ofType="com.xxx.xxx.xxx.xxx.Node" resultMap="com.xxx.xxx.xxx.xxx.Node.BaseResultMap"
</resultMap>
<select id="getScenarioAllInfoById" parameterType="com.xxx.xxx.xxx.xxx.Scenario" resultMap="BaseResultMap">
select a.*,b.*c.*
from scenario a
inner join node b
on a.scenario_id = b.scenario_id
inner join node c
on b.node_id = c.node_id
and a.scenario_id =#{scenarioId}
</select>
</mapper>
NodeMapper.xml
前两行省略
<mapper namespace="com.xxx.xxx.xxx.xxx.NodeDao">
<resultMap id = "BaseResultMap" type= "com.xxx.xxx.xxx.xxx.Scenario">
<result column="NODE_ID" property="nodeId" jdbcType="VARCHAR"/>
<result column="NODE_Name" property="nodeName" jdbcType="VARCHAR"/>
<result column="SCENARIO_ID" property="scenarioId" jdbcType="VARCHAR"/>
<collection property="props" ofType="com.xxx.xxx.xxx.xxx.Prop" resultMap="com.xxx.xxx.xxx.xxx.Prop.BaseResultMap"
</resultMap>
</mapper>
PropMapper.xml
前两行省略
<mapper namespace="com.xxx.xxx.xxx.xxx.PropDao">
<resultMap id = "BaseResultMap" type= "com.xxx.xxx.xxx.xxx.Prop">
<result column="VAR_ID" property="varId" jdbcType="VARCHAR"/>
<result column="VAR_Name" property="varName" jdbcType="VARCHAR"/>
<result column="VAR_VALUE" property="varValue" jdbcType="VARCHAR"/>
<result column="NODE_ID" property="nodeId" jdbcType="VARCHAR"/>
</resultMap>
</mapper>
如何该实现逻辑业务呢,请看下一篇文章《mybatis一对多业务逻辑实现》