1. 程式人生 > >很好的一篇關於MyBatis 多表聯合查詢及優化的文章

很好的一篇關於MyBatis 多表聯合查詢及優化的文章

這篇文章我打算來簡單的談談 mybatis 的多表聯合查詢。起初是覺得挺簡單的,沒必要拿出來寫,畢竟 mybatis 這東西現在是個開發的都會用,而且網上的文章也是一搜羅一大堆,根本就用不著我來重複。但是吧,就我前幾天在做一個多表聯合查詢的時候,竟然出了很多意想不到的問題,而且這些問題的出現,並不是對 mybatis 不瞭解,而是在用的過程中會或多或少的忽略一些東西,導致提示各種錯誤。

背景

老規矩,開始之前,還是要先說說這件事的背景。也就是最近幾天,公司要做一個後臺的管理平臺,由於之前的一些限制,這次要做成單獨的專案進行部署,因此就要重新考慮很多東西。索性這幾天有時間,就做了一個小 Demo ,實現 mybatis 的多表聯合查詢的,由於之前用的是 Hibernate 做的聯合查詢,眾所周知,Hibernate 是全自動的資料庫持久層框架,它可以通過實體來對映資料庫,通過設定一對多、多對一、一對一、多對多的關聯來實現聯合查詢。

正文

下面就來說一下 mybatis 是通過什麼來實現多表聯合查詢的。首先看一下表關係,如圖:
這裡,我已經搭好了開發的環境,用到的是 SpringMVC + Spring + MyBatis,當然,為了簡單期間,你可以不用搭前端的框架,只使用 Spring + MyBatis 就可以,外加 junit 測試即可。環境我就不帶大家搭了,這裡只說涉及到聯合查詢的操作。 設計好表之後,我用到了 mybatis 的自動生成工具 mybatis generator 生成的實體類、mapper 介面、以及 mapper xml 檔案。由於是測試多表聯合查詢,因此需要自己稍加改動。 下面是 User 和 Role 的實體類程式碼: User
  1. <span style=
    "font-family:Comic Sans MS;font-size:12px;">package com.sica.domain;  
  2. import java.io.Serializable;  
  3. import java.util.List;  
  4. publicclass User implements Serializable {  
  5.     private String id;  
  6.     private String username;  
  7.     private String password;  
  8.     private List<Role> roles;  
  9.     privatestaticfinallong serialVersionUID = 1L;  
  10.     public String getId() {  
  11.         return id;  
  12.     }  
  13.     publicvoid setId(String id) {  
  14.         this.id = id == null ? null : id.trim();  
  15.     }  
  16.     public String getUsername() {  
  17.         return username;  
  18.     }  
  19.     publicvoid setUsername(String username) {  
  20.         this.username = username == null ? null : username.trim();  
  21.     }  
  22.     public String getPassword() {  
  23.         return password;  
  24.     }  
  25.     publicvoid setPassword(String password) {  
  26.         this.password = password == null ? null : password.trim();  
  27.     }  
  28.     public List<Role> getRoles() {  
  29.         return roles;  
  30.     }  
  31.     publicvoid setRoles(List<Role> roles) {  
  32.         this.roles = roles;  
  33.     }  
  34.     @Override
  35.     publicboolean equals(Object that) {  
  36.         if (this == that) {  
  37.             returntrue;  
  38.         }  
  39.         if (that == null) {  
  40.             returnfalse;  
  41.         }  
  42.         if (getClass() != that.getClass()) {  
  43.             returnfalse;  
  44.         }  
  45.         User other = (User) that;  
  46.         return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))  
  47.             && (this.getUsername() == null ? other.getUsername() == null : this.getUsername().equals(other.getUsername()))  
  48.             && (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword()));  
  49.     }  
  50.     @Override
  51.     publicint hashCode() {  
  52.         finalint prime = 31;  
  53.         int result = 1;  
  54.         result = prime * result + ((getId() == null) ? 0 : getId().hashCode());  
  55.         result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode());  
  56.         result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());  
  57.         return result;  
  58.     }  
  59. }</span>  
Role
  1. <span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.domain;  
  2. import java.io.Serializable;  
  3. publicclass Role implements Serializable {  
  4.     private String id;  
  5.     private String name;  
  6.     private String jsms;  
  7.     private String bz;  
  8.     private Integer jlzt;  
  9.     private String glbm;  
  10.     private String userid;  
  11.     privatestaticfinallong serialVersionUID = 1L;  
  12.     public String getId() {  
  13.         return id;  
  14.     }  
  15.     publicvoid setId(String id) {  
  16.         this.id = id == null ? null : id.trim();  
  17.     }  
  18.     public String getName() {  
  19.         return name;  
  20.     }  
  21.     publicvoid setName(String name) {  
  22.         this.name = name == null ? null : name.trim();  
  23.     }  
  24.     public String getJsms() {  
  25.         return jsms;  
  26.     }  
  27.     publicvoid setJsms(String jsms) {  
  28.         this.jsms = jsms == null ? null : jsms.trim();  
  29.     }  
  30.     public String getBz() {  
  31. 相關推薦

    關於MyBatis 聯合查詢優化文章

    序 這篇文章我打算來簡單的談談 mybatis 的多表聯合查詢。起初是覺得挺簡單的,沒必要拿出來寫,畢竟 mybatis 這東西現在是個開發的都會用,而且網上的文章也是一搜羅一大堆,根本就用不著我來重複。但是吧,就我前幾天在做一個多表聯合查詢的時候,竟然出了很多

    MyBatis 聯合查詢優化

    序 這篇文章我打算來簡單的談談 mybatis 的多表聯合查詢。起初是覺得挺簡單的,沒必要拿出來寫,畢竟 mybatis 這東西現在是個開發的都會用,而且網上的文章也是一搜羅一大堆,根本就用不著我來重複。但是吧,就我前幾天在做一個多表聯合查詢的時候,竟然出了很多意想不到的

    Mybatis聯合查詢關聯查詢

    有兩張表,一張表為業務賬戶表,一張為資費表,業務賬戶表其中有一個外來鍵為資費型別id,引用了資費表的主鍵id。建表語句:/*資費表*/ create table sys_charge( id int(11) auto_increment, name varchar

    MyBatis 聯合查詢

    最近在做在eclipse + maven搭建SSM框架下做一個簡單的後臺管理系統,因為是第一次搭建SSM專案,在mybatis進行多表連線查詢的時候遇到問題,不知道如何進行處理?在網上搜了一下解決方法是,以實現,記錄下自己的實現方案。 表之間的關係如下圖所示:

    mybatis聯合查詢

    以前東拼西湊來的,不知道都是哪些連結! User 、Role 的對應關係是,一個使用者有多個角色,因此,在 User 的實體中加入一個 Role 的屬性private List<Role> roles;對應一對多的關係。   <select id="q

    最終解決Mybatis聯合查詢中欄位名重複導致的各路問題

    解決欄位名重複導致的問題,簡單直接的方法是設定別名,例如 <id column="id" jdbcType="BIGINT" property="id"/> <result column="name" jd

    MyBatis-Plus聯合查詢並且分頁(3

    這3張表的關係是   模型表Model  ===> 訓練表Training ===》應用表Application(大概的邏輯是:選擇應用,然後訓練,然後成為模型)如有不理解的可加我微信:17625089935 白天問我一般晚上回 首先我們先建立實體Model(我使用的d

    MyBatis學習總結(九)---基於XML聯合查詢(一對一、一對

    1、一對一的關聯  使用association,association元素用於處理“has-one”(一對一)這種型別關係。  作用:針對pojo物件屬性的對映,它的兩個主要引數此時對應的值: javaType對應pojo類名,  property對應pojo的

    史上最簡單MySQL教程詳解(基礎)之聯合查詢

    常用術語 內連線 外連線 左外連線 右外連線 注意事項: 自連線 子查詢 在上篇文章史上最簡單MySQL教程詳解(基礎篇)之資料庫設計正規化及應用舉例我們介紹過,在關係型資料庫中,我們通常為了減少資料的冗餘量將對資料表進行規範,將

    mysql常用語句——聯合查詢

    學習筆記: 學生選課資料庫SCT 學生表(學號,姓名,性別,年齡,院系編號,班級) Student(S# char(8),Sname char(10),Ssex char(2),Sage integer,D# char(2),Sclass char(6) 院系表(院系編號

    利用SSM(springmvc+spring+mybatis)實現聯合查詢

    一、資料庫                           Author表 (authorid主鍵)                                                                    NewsInfo表(newsno主

    SQL聯合查詢(LEFT JOIN)條件差異

    logs 技術分享 .cn where 聯合查詢 uid exist 包含 into 查詢A: select a.*,b.* into Bus605115_ON_Where_And --(642 行受影響) from PositionN a left join szt

    MySQL DML操作--------聯合查詢實戰

    join 聯合查詢 mysql dba 1. 背景 * 多表聯合查詢是把不同表的記錄到一起的一種方式 * 在SQL標準中規劃的聯合(join)大致分內連接,外連接,全連接。其中外連接又分左外連接,右外連接。2. 內連接例子 (inner join) [ 員工 --> 部門 ] 

    MySQL增刪改查之【聯合查詢

    包括 實現 鼠標 thead 黃曉明 eba 字符 order 有時 很多時候在實際的業務中我們不只是查詢一張表。 在電子商務系統中,查詢哪些用戶沒有購買過產品。 銀行中可能查詢違規記錄,同時查詢出用戶的 查詢中獎信息和中獎人員的基本信息。 以上只是列的情況

    thinkphp3.1 聯合查詢代碼

    function table php php代碼 數據集 width pan code 顯示 php代碼 public function info(){ $where[‘openid‘]=session(‘openid‘);////用戶sess

    SharePoint 列表聯合查詢

    int lists esp mco 連接 city .com spf 城市 在SharePoint平臺二次開發中,我們有時需要涉及多表關聯查詢展示多列表中的不同字段信息;SharePoint和Sql數據表一樣,也支持多表聯合查詢,但是不像Sql語句那樣簡單,有一定的局限性,

    Oracle ODI 12c之聯合查詢以及定時任務設置

    Oracle ODI 本文介紹如何通過ODI進行多表聯合查詢並設置定時任務。準備工作如下: 準備物理方案和邏輯方案; 創建模型並通過“逆向工程”同步方案; 創建項目(根據實際情況創建或者使用現有的); 確保源表和目標表都有主鍵存在。以上內容的前三點可以參考我博客中的相關文章。 一、Preparing

    約束條件 ,之間的關系 和聯合查詢***

    特點 左連接 min 想要 關系型數據庫 高效 行數據 人的 單行 一.約束條件 為了確保數據的完整性 可以給列加上約束條件 完整性的分類: 1.實體完整性 2.域完整性 3.引用完整性 1.實體完整性

    Spring Data JPA :實現關聯查詢

    多表查詢在spring data jpa中有兩種實現方式,第一種是利用hibernate的級聯查詢來實現,第二種是建立一個結果集的介面來接收連表查詢後的結果,這裡介紹第二種方式。 一、一對一對映 實體 UserInfo :使用者。 實體 Address:家庭住址。 這裡通過外來鍵的方

    聯合查詢語句

    select dpt.*, info.*, gd.*, mat.* from depart as dpt left join info_sys as info on dpt.id = info.dept_name left join grade as gd on info