1. 程式人生 > 程式設計 >Spring boot2基於Mybatis實現多表關聯查詢

Spring boot2基於Mybatis實現多表關聯查詢

模擬業務關係:

一個使用者user有對應的一個公司company,每個使用者有多個賬戶account。

spring boot 2的環境搭建見上文:spring boot 2整合mybatis

一、mysql創表和模擬資料sql

CREATE TABLE IF NOT EXISTS `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(50) NOT NULL,`company_id` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `company` (
 `id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(200) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `account` (
 `id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO
  `user`
VALUES
  (1,'aa',1),(2,'bb',2);

INSERT INTO
  `company`
VALUES
  (1,'xx公司'),'yy公司');

INSERT INTO
  `account`
VALUES
  (1,'中行','工行',(3,2);

二、建立實體

public class User {    
  private Integer id;
  private String name;
  private Company company;
  private List<Account> accounts;  
  //getter/setter 這裡省略...
}

public class Company {
  private Integer id;
  private String companyName;
    //getter/setter 這裡省略...
}

public class Account {
  private Integer id;
  private String accountName;
  //getter/setter 這裡省略...

}

三、開發Mapper

方法一:使用註解

1、AccountMapper.java

package com.example.demo.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.example.demo.entity.Account;
public interface AccountMapper {
  /*
   * 根據使用者id查詢賬戶資訊
   */
  @Select("SELECT * FROM `account` WHERE user_id = #{userId}")
  @Results({
    @Result(property = "accountName",column = "name")
  })
  List<Account> getAccountByUserId(Long userId);
}

2、CompanyMapper.java

package com.example.demo.mapper;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.example.demo.entity.Company;

public interface CompanyMapper {
  /*
   * 根據公司id查詢公司資訊
   */
  @Select("SELECT * FROM company WHERE id = #{id}")
  @Results({
    @Result(property = "companyName",column = "name")
  })
  Company getCompanyById(Long id);
}

3、UserMapper.java

package com.example.demo.mapper;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Many;

import com.example.demo.entity.User;

public interface UserMapper {
  
  /*
   * 一對一查詢
   * property:查詢結果賦值給此實體屬性
   * column:對應資料庫的表字段,做為下面@One(select方法的查詢引數
   * one:一對一的查詢
   * @One(select = 方法全路徑) :呼叫的方法
   */
  @Select("SELECT * FROM user WHERE id = #{id}")
  @Results({
    @Result(property = "company",column = "company_id",one = @One(select = "com.example.demo.mapper.CompanyMapper.getCompanyById"))    
  })
  User getUserWithCompany(Long id);
  
  /*
   * 一對多查詢
   * property:查詢結果賦值給此實體屬性
   * column:對應資料庫的表字段,可做為下面@One(select方法)的查詢引數
   * many:一對多的查詢
   * @Many(select = 方法全路徑) :呼叫的方法
   */
  @Select("SELECT * FROM user WHERE id = #{id}")
  @Results({ 
    @Result(property = "id",column = "id"),//加此行,否則id值為空
    @Result(property = "accounts",column = "id",many = @Many(select = "com.example.demo.mapper.AccountMapper.getAccountByUserId"))
  })
  User getUserWithAccount(Long id);
  
  /*
   * 同時用一對一、一對多查詢
   */
  @Select("SELECT * FROM user")
  @Results({
    @Result(property = "id",@Result(property = "company",one = @One(select = "com.example.demo.mapper.CompanyMapper.getCompanyById")),@Result(property = "accounts",many = @Many(select = "com.example.demo.mapper.AccountMapper.getAccountByUserId"))
  })
  List<User> getAll();  
}

方法二:使用XML

參考上文spring boot 2整合mybatis配置application.properties和mybatis-config.xml等後,
以上面的getAll()方法為例,UserMapper.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.example.demo.mapper.UserMapper" >
  <resultMap id="UserMap" type="com.example.demo.entity.User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result property="name" column="name" 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.example.demo.entity.Company" column="company_id">
      <id property="id" column="companyid"></id>
      <result property="companyName" column="companyname"></result>      
    </association>
    <!--配置1對多關係對映
      property:在user裡面的List<Account>的屬性名      
      ofType:當前account表的java型別
      column:外來鍵
    -->
    <collection property="accounts" ofType="com.example.demo.entity.Account" column="user_id">
      <id property="id" column="accountid"></id>
      <result property="accountName" column="accountname"></result>      
    </collection>    
   </resultMap>

  <select id="getAll" resultMap="UserMap" >
    SELECT 
    u.id,u.name,c.id companyid,c.name companyname,a.id accountid,a.name accountname 
    FROM user u 
    LEFT JOIN company c on u.company_id=c.id
    LEFT JOIN account a on u.id=a.user_id
  </select>
</mapper>

四、控制層

package com.example.demo.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;

@RestController
public class UserController {
  @Autowired
  private UserMapper userMapper;
  
  //請求例子:http://localhost:9001/getUserWithCompany/1
  /*請求結果:{"id":1,"name":"aa","company":{"id":1,"companyName":"xx公司"},"accounts":null}*/
  @RequestMapping("/getUserWithCompany/{id}")
  public User getUserWithCompany(@PathVariable("id") Long id) {
    User user = userMapper.getUserWithCompany(id);
    return user;
  }
  

  //請求例子:http://localhost:9001/getUserWithAccount/1
  /*請求結果:{"id":1,"company":null,"accounts":[{"id":1,"accountName":"中行"},{"id":2,"accountName":"工行"}]}*/
  @RequestMapping("/getUserWithAccount/{id}")
  public User getUserWithAccount(@PathVariable("id") Long id) {
    User user = userMapper.getUserWithAccount(id);
    return user;
  }
  

  //請求例子:http://localhost:9001/getUserWithAccount/1
  /*請求結果:[{"id":1,"accountName":"工行"}]},"name":"bb","company":{"id":2,"companyName":"yy公司"},"accounts":[{"id":3,"accountName":"中行"}]}]*/
  @RequestMapping("/getUsers")
  public List<User> getUsers() {
    List<User> users=userMapper.getAll();
    return users;
  }  
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。