MyBatis 多表联合查询及优化
   
这篇文章我打算来简单的谈谈 mybatis 的多表联合查询。起初是觉得挺简单的,没必要拿出来写,毕竟 mybatis 这东西现在是个开发的都会用,而且网上的文章也是一搜罗一大堆,根本就用不着我来重复。但是吧,就我前几天在做一个多表联合查询的时候,竟然出了很多意想不到的问题,而且这些问题的出现,并不是对 mybatis 不了解,而是在用的过程中会或多或少的忽略一些东西,导致提示各种错误。背景
老规矩,开始之前,还是要先说说这件事的背景。也就是最近几天,公司要做一个后台的管理平台,由于之前的一些限制,这次要做成单独的项目进行部署,因此就要重新考虑很多东西。索性这几天有时间,就做了一个小 Demo ,实现 mybatis 的多表联合查询的,由于之前用的是 Hibernate 做的联合查询,众所周知,Hibernate 是全自动的数据库持久层框架,它可以通过实体来映射数据库,通过设置一对多、多对一、一对一、多对多的关联来实现联合查询。正文
sql left join 多表连接下面就来说一下 mybatis 是通过什么来实现多表联合查询的。首先看一下表关系,如图:这里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了简单期间,你可以不用搭前端的框架,只使用 Spring + MyBatis 就可以,外加 junit 测试即可。环境我就不带大家搭了,这里只说涉及到联合查询的操作。
设计好表之后,我用到了 mybatis 的自动生成工具 mybatis generator 生成的实体类、mapper 接口、以及 mapper xml 文件。由于是测试多表联合查询,因此需要自己稍加改动。
下面是 User Role 的实体类代码:
User
[java] view plain copy <span >package com.sica.domain;    import java.io.Serializable;  import java.util.List;    public class User implements Serializable {      private String id;        private String username;        private String password;        private List<Role> roles;        private static final long serialVersionUI
D = 1L;        public String getId() {          return id;      }        public void setId(String id) {          this.id = id == null ? null : id.trim();      }        public String getUsername() {          return username;      }        public void setUsername(String username) {          this.username = username == null ? null : im();      }        public String getPassword() {          return password;      }        public void setPassword(String password) {          this.password = password == null ? null : im();      }        public List<Role> getRoles() {          return roles;      }        public void setRoles(List<Role> roles) {          les = roles;      }        @Override      public boolean equals(Object that) {          if (this == that) {              return true;          }          if (that == null) {              return false;          }          if (getClass() != Class()) {              return false;          }          User other = (User) that;          return (Id() == null ? Id() == null : Id().Id()))              && (Username() == null ? Username() == null : Username().Username()))              && (Password() == null ? Password() == null : Password().Password()));      }        @Override      public int hashC
ode() {          final int prime = 31;          int result = 1;          result = prime * result + ((getId() == null) ? 0 : getId().hashCode());          result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode());          result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());          return result;      }  }</span> 
Role
[java] view plain copy <span >package com.sica.domain;    import java.io.Serializable;    public class Role implements Serializable {      private String id;        private String name;        private String jsms;        private String bz;        private Integer jlzt;        private String glbm;        private String userid;        private static final long serialVersionUID = 1L;        public String getId() {          return id;      }        public void setId(String id) {          this.id = id == null ? null : id.trim();      }        public String getName() {          return name;      }        public void setName(String name) {          this.name = name == null ? null : im();      }        public String getJsms() {          return jsms;      }        public void setJsms(String jsms) {          this.jsms =
jsms == null ? null : im();      }        public String getBz() {          return bz;      }        public void setBz(String bz) {          this.bz = bz == null ? null : bz.trim();      }        public Integer getJlzt() {          return jlzt;      }        public void setJlzt(Integer jlzt) {          this.jlzt = jlzt;      }        public String getGlbm() {          return glbm;      }        public void setGlbm(String glbm) {          this.glbm = glbm == null ? null : im();      }        public String getUserid() {          return userid;      }        public void setUserid(String userid) {          this.userid = userid == null ? null : im();      }        @Override      public boolean equals(Object that) {          if (this == that) {              return true;          }          if (that == null) {              return false;          }          if (getClass() != Class()) {              return false;          }          Role other = (Role) that;          return (Id() == null ? Id() == null : Id().Id()))              && (Name() == null ? Name() == null : Name().Name()))              && (Jsms() == null ? Jsms() == null : Jsms().Jsms()))              && (Bz() == null ? Bz() == null : Bz().Bz()))              && (Jlzt() == null ? Jlzt() == nu
ll : Jlzt().Jlzt()))              && (Glbm() == null ? Glbm() == null : Glbm().Glbm()))              && (Userid() == null ? Userid() == null : Userid().Userid()));      }        @Override      public int hashCode() {          final int prime = 31;          int result = 1;          result = prime * result + ((getId() == null) ? 0 : getId().hashCode());          result = prime * result + ((getName() == null) ? 0 : getName().hashCode());          result = prime * result + ((getJsms() == null) ? 0 : getJsms().hashCode());          result = prime * result + ((getBz() == null) ? 0 : getBz().hashCode());          result = prime * result + ((getJlzt() == null) ? 0 : getJlzt().hashCode());          result = prime * result + ((getGlbm() == null) ? 0 : getGlbm().hashCode());          result = prime * result + ((getUserid() == null) ? 0 : getUserid().hashCode());          return result;      }  }</span>