一对多 、多对一、多对多
涉及的两张表及结构如下:
流程Process表

Process实体类
package mybatis.domain; import java.util.Date; import java.util.List; /** * 流程 * */ public class Process { private int id; private int templateId; //模板 private int creator; private Date createTime; private List<Node> nodes; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getTemplateId() { return templateId; } public void setTemplateId(int templateId) { this.templateId = templateId; } public int getCreator() { return creator; } public void setCreator(int creator) { this.creator = creator; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public List<Node> getNodes() { return nodes; } public void setNodes(List<Node> nodes) { this.nodes = nodes; } @Override public String toString() { return "Process{" + "id=" + id + ", templateId=" + templateId + ", creator=" + creator + ", createTime=" + createTime + ", nodes=" + nodes + '}'; } }
流程节点Node

Node实体
package mybatis.domain; /** * 流程节点 * */ public class Node { private int nodeId; private int processId; //流程Id private Process process; //流程实例 private String nodeCode; //节点编号 private String nodeName; public int getNodeId() { return nodeId; } public void setNodeId(int nodeId) { this.nodeId = nodeId; } public int getProcessId() { return processId; } public void setProcessId(int processId) { this.processId = processId; } public Process getProcess() { return process; } public void setProcess(Process process) { this.process = process; } public String getNodeCode() { return nodeCode; } public void setNodeCode(String nodeCode) { this.nodeCode = nodeCode; } public String getNodeName() { return nodeName; } public void setNodeName(String nodeName) { this.nodeName = nodeName; } @Override public String toString() { return "Node{" + "nodeId=" + nodeId + ", processId=" + processId + ", process=" + process + ", nodeCode='" + nodeCode + '\'' + ", nodeName='" + nodeName + '\'' + '}'; } }
OneToMany
通过表的关联查询获取对象的实体信息
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="mybatis.mapper.ProcessMapper"> <resultMap id="OneToManyProcess" type="mybatis.domain.Process"> <id property="id" column="id"/> <result property="templateId" column="template_id"/> <result property="creator" column="creator"/> <result property="createTime" column="create_time"/> <collection property="nodes" ofType="mybatis.domain.Node"> <id property="nodeId" column="node_id"/> <result property="processId" column="process_id"/> <result property="nodeCode" column="node_code"/> <result property="nodeName" column="node_name"/> </collection> </resultMap> <!-- 一条查询Sql查出一对多关系--> <select id="findProcessById" parameterType="Integer" resultMap="OneToManyProcess"> select a.id,a.template_id,a.creator,a.create_time,b.id node_id, b.process_id,b.node_code,b.node_name from process a LEFT JOIN node b on a.id=b.process_id where a.id=#{id} </select> </mapper>
关联的集合属性是通过collection元素来定义的,通过resultMap是直接配置从同一个查询结果集里面进行映射。上面这种配置Mybatis会把结果集里面的每一行的node_id、node_code、node_name和id字段取出根据映射关系构造为一个Node对象。
多对一的关系查询
一条SQL语句在查询一的一方时把多的一方也查出来,我们需要在查询时把所有关联的信息都查询出来,在对应的Mapper.xml文件中添加如下配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="mybatis.mapper.NodeMapper"> <resultMap id="ManyToOneProcess" type="mybatis.domain.Node"> <id property="nodeId" column="node_id"/> <result property="nodeCode" column="node_code"/> <result property="nodeName" column="node_name"/> <result property="processId" column="process_id"/> <association property="process" javaType="mybatis.domain.Process"> <id property="id" column="id"/> <result property="templateId" column="template_id"/> <result property="creator" column="creator"/> <result property="createTime" column="create_time"/> </association> </resultMap> <select id="findNodeById" parameterType="Integer" resultMap="ManyToOneProcess"> select a.id,a.template_id,a.creator,a.create_time,b.id node_id, b.process_id,b.node_code,b.node_name from node b INNER JOIN process a on a.id=b.process_id where b.id=#{id} </select> </mapper>
columnPrefix
部门表的结构是t_dept(id,name,manager_id,vice_manager_id),人员表的结果是t_person(id,no,name),需要查一个部门的信息的时候把这个部门的经理和副经理的信息一起查出来,部门经理和副经理的信息都是存在人员信息表中的,查询语句大概是这样的。
<select id="findById" parameterType="java.lang.Long" resultMap="BaseResultMap"> SELECT id, name, manager_id, vice_manager_id, b.no manager_no, b.name manager_name, c.no vice_manager_no, c.name vice_manager_name FROM t_dept a LEFT JOIN t_person b ON a.manager_id = b.id LEFT JOIN t_person c ON a.vice_manager_id = c.id WHERE a.id=#{id} </select>
基于columnPrefix我们的上述ResultMap应该配置成如下这样
<resultMap type="com.elim.learn.mybatis.model.Department" id="BaseResultMap"> <id column="id" property="id"/> <result column="name" property="name"/> <association property="manager" resultMap="PersonResultMap" columnPrefix="manager_"/> <association property="viceManager" resultMap="PersonResultMap" columnPrefix="vice_manager_"/> </resultMap> <resultMap type="com.elim.learn.mybatis.model.Person" id="PersonResultMap"> <id column="id" property="id"/> <result column="no" property="no"/> <result column="name" property="name"/> </resultMap>
参考:http://elim.iteye.com/blog/2346389
立志如山 静心求实
浙公网安备 33010602011771号