Spring Boot入門系列(十七)整合Mybatis,建立自定義mapper 實現多表關聯查詢!

章為忠發表於2020-07-02

之前講了Springboot整合Mybatis,介紹瞭如何自動生成pojo實體類、mapper類和對應的mapper.xml 檔案,並實現最基本的增刪改查功能。mybatis 外掛自動生成的mapper 實現了大部分基本、通用的方法,如:insert、update、delete、select 等大概20個左右方法,都是比較基礎的增刪改查,這些通用Mapper提供的方法基本都能滿足各種單表操作需求。但是,在實際工作中通用Mapper並不能滿足所有的工作,或是某個業務需要手寫 sql 語句、或是多表關聯時,該怎麼辦呢? 這就需要額外的一些自定義的mapper 實現一些特定的功能。下面就來介紹自定義mapper 的實現。

Spring Boot入門系列文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html

 

一、快速實現

首先需要建立一個專案並整合mybatis等相關框架,這個之前介紹過這裡不再細說。直接在原來的基礎上實現。《Spring Boot入門系列(六)Spring Boot如何使用Mybatis XML 配置版【附詳細步驟】

1、建立自定義 mapper

com.weiz.mapper 包中,建立 SysUserMapperCustom 介面

package com.weiz.mapper;

import com.weiz.pojo.SysUser;

import java.util.List;

public interface SysUserMapperCustom {
    List<SysUser> queryUserSimplyInfoById(String userId);
}

SysUserMapperCustom 是一個介面,這裡只定義了一個方法:queryUserSimplyInfoById 。

 

2、建立mapper 配置檔案

建立完mapper類之後,需要建立SysuserMapperCustom 類對應的xml 配置檔案:SysuserMapperCustom.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="com.weiz.mapper.SysUserMapperCustom" >
  <!-- 查詢使用者資訊 -->
  <select id="queryUserSimplyInfoById" resultType="com.weiz.pojo.SysUser"
                             parameterType="java.lang.String" >
        select
            *
        from
            sys_user
        where
            id = #{id,jdbcType=VARCHAR}
    </select>
</mapper>

說明:

  id:對應的就是 介面名,

  resultType:返回的是結果型別,

  parameterType:引數的型別,

 

3、Service呼叫

首先在UserService介面中增加queryUserByIdCustom方法,然後在對應的 UserServiceImpl 實現類中,注入SysUserMapperCustom 。最後實現queryUserByIdCustom 方法,在方法中呼叫前面自定義的mapper 類中方法即可。具體程式碼如下:

// 1. 在UserServiceImpl 中注入SysUserMapperCustom 
@Autowired
private SysUserMapperCustom userMapperCustom;


// 2. 實現介面方法,呼叫
@Override
public SysUser queryUserByIdCustom(String userId) {
    List<SysUser> userList = userMapperCustom.queryUserSimplyInfoById(userId);

    if (userList != null && !userList.isEmpty()) {
        return (SysUser)userList.get(0);
    }

    return null;
}

 

二、測試

首先在原先的MybatisController 建立一個測試方法。

@RequestMapping("/queryUserByIdCustom")
public JSONResult queryUserByIdCustom(String userId) {
    return JSONResult.ok(userService.queryUserByIdCustom(userId));
}

 

啟動專案,並在瀏覽器中輸入地址:http://localhost:8080/mybatis/queryUserByIdCustom?userId=200425AYXA733M5P

 

三、多表關聯查詢

上面講的是,建立一個自定義的mapper,實現自定義的查詢。多表的關聯查詢跟這個類似。

1、自定義mapper類 SysUserMapperCustom 類中,增加一個新的方法

public interface SysUserMapperCustom {
    List<SysUser> queryUserSimplyInfoById(String userId);
    List<SysUser> queryAllUserListCustom();     
}

方法 queryAllUserListCustom() 為新加的關聯查詢的方法。

 

2、在之前的SysuserMapperCustom配置檔案:SysuserMapperCustom.xml 增加新方法對應的配置。

<resultMap id="UserMap" type="com.weiz.pojo.SysUser">
        <id column="id" jdbcType="VARCHAR" property="id" />
        <result property="username" column="username" jdbcType="VARCHAR" />
        <!--封裝對映company表資料,user表與company表1對1關係,配置1對1的對映
            association:用於配置1對1的對映
                        屬性property:company物件在user物件中的屬性名
                        屬性javaType:company屬性的java物件 型別
                        屬性column:user表中的外來鍵引用company表
        -->
        <association property="company" javaType="com.weiz.pojo.SysCompany" column="company_id">
            <id property="id" jdbcType="VARCHAR" column="companyid"></id>
            <result property="name" jdbcType="VARCHAR" column="companyname"></result>
        </association>
        <!--配置1對多關係對映
            property:在user裡面的List<Account>的屬性名
            ofType:當前account表的java型別
            column:外來鍵
        -->
    </resultMap>
    <select id="queryAllUserListCustom" resultMap="UserMap"  >
       SELECT
       u.id,u.username,c.id companyid, c.name companyname
       FROM sys_user u
       LEFT JOIN sys_company c on u.company_id=c.id
    </select>

上面配置的sql ,可以看到使用者表sys_user 關聯 sys_company 表,查詢完整的人員公司資訊。

說明:

  1、association:用於配置1對1的對映

    屬性property:company物件在user物件中的屬性名

    屬性javaType:company屬性的java物件 型別

    屬性column:user表中的外來鍵引用company表。

  2、collection:用於配置1對多關係對映

    property:在user裡面的List<Account>的屬性名

      ofType:當前account表的java型別

     column:外來鍵

以上就是在自定義的mapper 中實現多表關聯查詢的方法,這裡就不寫測試程式碼了,大家仔細去測試實驗。

 

最後

以上,就把Spring Boot 中mybatis 如何通過自定義mapper 實現多表關聯查詢介紹完了,實現起來比較簡單。上面的例子比較簡單,沒有做多表關聯,大家自己寫的時候,可以試試複雜的多表關聯。

這個系列課程的完整原始碼,也會提供給大家。大家關注我的微信公眾號(架構師精進),回覆:springboot原始碼。獲取這個系列課程的完整原始碼。

 

相關文章