欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢

 更新時(shí)間:2020年04月23日 09:59:56   作者:gdjlc  
這篇文章主要介紹了Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

模擬業(yè)務(wù)關(guān)系:

一個(gè)用戶user有對(duì)應(yīng)的一個(gè)公司company,每個(gè)用戶有多個(gè)賬戶account。

spring boot 2的環(huán)境搭建見上文:spring boot 2整合mybatis

一、mysql創(chuàng)表和模擬數(shù)據(jù)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, 
 `name` varchar(200) NOT NULL,
 `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公司'),
  (2, 'yy公司');

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

二、創(chuàng)建實(shí)體

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 這里省略...

}

三、開發(fā)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 {
  /*
   * 根據(jù)用戶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 {
  /*
   * 根據(jù)公司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 {
  
  /*
   * 一對(duì)一查詢
   * property:查詢結(jié)果賦值給此實(shí)體屬性
   * column:對(duì)應(yīng)數(shù)據(jù)庫(kù)的表字段,做為下面@One(select方法的查詢參數(shù)
   * one:一對(duì)一的查詢
   * @One(select = 方法全路徑) :調(diào)用的方法
   */
  @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);
  
  /*
   * 一對(duì)多查詢
   * property:查詢結(jié)果賦值給此實(shí)體屬性
   * column:對(duì)應(yīng)數(shù)據(jù)庫(kù)的表字段,可做為下面@One(select方法)的查詢參數(shù)
   * many:一對(duì)多的查詢
   * @Many(select = 方法全路徑) :調(diào)用的方法
   */
  @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);
  
  /*
   * 同時(shí)用一對(duì)一、一對(duì)多查詢
   */
  @Select("SELECT * FROM user")
  @Results({
    @Result(property = "id", column = "id"),
    @Result(property = "company", column = "company_id", one = @One(select = "com.example.demo.mapper.CompanyMapper.getCompanyById")),
    @Result(property = "accounts", column = "id", 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表數(shù)據(jù),user表與company表1對(duì)1關(guān)系,配置1對(duì)1的映射
      association:用于配置1對(duì)1的映射
            屬性property:company對(duì)象在user對(duì)象中的屬性名
            屬性javaType:company屬性的java對(duì)象 類型
            屬性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對(duì)多關(guān)系映射
      property:在user里面的List<Account>的屬性名      
      ofType:當(dāng)前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;
  
  //請(qǐng)求例子:http://localhost:9001/getUserWithCompany/1
  /*請(qǐng)求結(jié)果:{"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;
  }
  

  //請(qǐng)求例子:http://localhost:9001/getUserWithAccount/1
  /*請(qǐng)求結(jié)果:{"id":1,"name":"aa","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;
  }
  

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis中的擴(kuò)展實(shí)現(xiàn)源碼解析

    mybatis中的擴(kuò)展實(shí)現(xiàn)源碼解析

    這篇文章主要介給大家紹了關(guān)于mybatis中擴(kuò)展實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Java時(shí)間工具類Date的常用處理方法

    Java時(shí)間工具類Date的常用處理方法

    在Java中獲取當(dāng)前時(shí)間,可以使用 java.util.Date 類和 java.util.Calendar 類完成。其中,Date 類主要封裝了系統(tǒng)的日期和時(shí)間的信息,下面將詳細(xì)介紹Date類的常用處理方法,需要的可以參考一下
    2022-05-05
  • PowerShell用戶認(rèn)證Function實(shí)例代碼

    PowerShell用戶認(rèn)證Function實(shí)例代碼

    這篇文章主要介紹了PowerShell用戶認(rèn)證Function的資料,并附實(shí)例代碼,幫助大家學(xué)習(xí)理解,有需要的小伙伴可以參考下
    2016-09-09
  • Java并發(fā)之不可思議的死循環(huán)詳解

    Java并發(fā)之不可思議的死循環(huán)詳解

    下面小編就為大家?guī)?lái)一篇Java并發(fā)之不可思議的死循環(huán)詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Java讀取json數(shù)據(jù)并存入數(shù)據(jù)庫(kù)的操作代碼

    Java讀取json數(shù)據(jù)并存入數(shù)據(jù)庫(kù)的操作代碼

    很多朋友問(wèn)大佬們JAVA怎么把json存入數(shù)據(jù)庫(kù)啊,這一問(wèn)題就把我難倒了,糾結(jié)如何操作呢,下面小編把我的經(jīng)驗(yàn)分享給大家,感興趣的朋友一起看看吧
    2021-08-08
  • java聯(lián)系人管理系統(tǒng)簡(jiǎn)單設(shè)計(jì)

    java聯(lián)系人管理系統(tǒng)簡(jiǎn)單設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了java聯(lián)系人管理系統(tǒng)簡(jiǎn)單設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java中條件運(yùn)算符的嵌套使用技巧總結(jié)

    Java中條件運(yùn)算符的嵌套使用技巧總結(jié)

    在Java中,我們經(jīng)常需要使用條件運(yùn)算符來(lái)進(jìn)行多個(gè)條件的判斷和選擇,條件運(yùn)算符可以簡(jiǎn)化代碼,提高代碼的可讀性和執(zhí)行效率,本文將介紹條件運(yùn)算符的嵌套使用技巧,幫助讀者更好地掌握條件運(yùn)算符的應(yīng)用,需要的朋友可以參考下
    2023-11-11
  • 深入了解Java核心類庫(kù)--Objects類

    深入了解Java核心類庫(kù)--Objects類

    這篇文章主要介紹了Java中的Object類詳細(xì)介紹,本文講解了Object類的作用、Object類的主要方法、Object類中不能被重寫的方法、Object類的equals方法重寫實(shí)例等內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • java lambda表達(dá)式用法總結(jié)

    java lambda表達(dá)式用法總結(jié)

    這篇文章主要介紹了java lamda表達(dá)式用法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java笛卡爾積算法原理與實(shí)現(xiàn)方法詳解

    Java笛卡爾積算法原理與實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Java笛卡爾積算法原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了笛卡爾積算法的原理及java定義與使用笛卡爾積算法的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12

最新評(píng)論