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,
 `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);

二、创建实体

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", 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表数据,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,"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;
  }

  //请求例子:http://localhost:9001/getUserWithAccount/1
  /*请求结果:[{"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;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • springboot快速整合Mybatis组件的方法(推荐)

    Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 原有Spring优缺点分析 Spring的优点分析 Spring是Java企业版(Java Enterprise Edition,

  • springboot集成mybatis-plus遇到的问题及解决方法

    在使用spring boot集成mybatis-plus的过程中遇到的问题 如图, 首先我放xml的包的是没问题的,而是引入的架包和配置问题,问题配置如下 解决方法:请将mybatis-plus改成mybatis,mybatis,mybtis,重要的说三遍,必要的架包如下 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring- boot-start

  • Springboot mybatis常见配置问题解决

    这篇文章主要介绍了Springboot mybatis常见配置问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Invalid bound statement (not found): com.example.blog.dao.DemoMapper.selectByExample" 打包的时候没有打包 mapper.xml 文件 <resource> <directory>src/main/resources<

  • SpringBoot+MybatisPlus+代码生成器整合示例

    项目目录结构: pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.or

  • SpringBoot集成MybatisPlus报错的解决方案

    这篇文章主要介绍了SpringBoot集成MybatisPlus报错的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题 启动的时候总是报如下错误: java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class 解决方案 需要一个mybatis-spring-boot-starter的包,在pom文件加上之后,完

  • SpringBoot 整合jdbc和mybatis的方法

    通用配置# 下面介绍的整合JDBC和整合MyBatis都需要添加的实体类和配置 数据库表# CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_

  • Spring Boot整合tk.mybatis代码实例

    这篇文章主要介绍了Spring Boot整合tk.mybatis代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概述 tk.mybatis 是在 MyBatis 框架的基础上提供了很多工具,让开发更加高效 引入依赖 在 pom.xml 文件中引入 mapper-spring-boot-starter 依赖,该依赖会自动引入 MyBaits 相关依赖 <dependency> <groupId>tk.mybatis</

  • SpringBoot整合MybatisSQL过滤@Intercepts的实现

    场景: 系统模块查询数据库需要根据用户的id去筛选数据.那么如果在 每个sql加user_id的过滤显然不明确.所以要在查询前将sql拼接上条件,做统一管理. 开发环境: spring boot + mybatis 只需一个拦截类即可搞定(在看代码前需要了解注解@Intercepts()): @Component @Intercepts({ @Signature(type = Executor.class, method = "query", args = {MappedStateme

  • 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, PRI

  • MyBatis中的表关联查询实现示例

    Mybatis中的一对多对象关联查询查询 模拟情景,商品与商品详情:一件商品可以对应多个商品详情信息,即从商品➡商品详情方向看,属于一对多. 在一对多关系中,需要在属于一的一方的实体类中添加多的一方的集合,一般为List<>类型 //(省去了get和set的方法) public class Goods { private Integer goodsId ; private String title ; private String subTitle ; private Float origin

  • Mybatis多表关联查询的实现(DEMO)

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入几条测试数据. create table Category ( Id int not null auto_increment, Name varchar(80) null, constraint pk_category primary key (Id) ); INSERT INTO category

  • mybatis主从表关联查询,返回对象带有集合属性解析

    目录 主从表关联查询,返回对象带有集合属性 VersionResult为接收返回数据对象 UpdateRecordEntity为从表数据 mapper.xml写法,这个是关键 sql查询语句 执行sql返回的数据 页面调取接口 mybatis关联查询(对象嵌套对象) 一种是用关联另一个resultMap的形式 一种联合查询(一对一)的实现 主从表关联查询,返回对象带有集合属性 昨天有同事让我帮着看一个问题,mybatis主从表联合查询,返回的对象封装集合属性.我先将出现的问题记录一下,然后再讲处

  • 使用AOP+反射实现自定义Mybatis多表关联查询

    目录 一.需求 二.核心代码 MapTo DoMap IDualMapper DualMapper DoMapAspect 三.使用方法 SysUser SysRole SysPermission SysUserService DoMapTests 测试数据 测试结果 一.需求 目前使用的ORM框架是Mybatis Plus,是Mybatis的增强框架,基础的CRUD的方法都集成了,开发起来很是方便.但是项目中总是需要多表关联查询. Mybatis的多表关联有两种 一.在Mapper中使用@Re

  • 基于mybatis高级映射多对多查询的实现

    1.同以前一样,首先给一个使用多对多的需求, 要查询用户以及用户所购买的商品信息,经过分析用户和商品数据库级别没有任何关系,用户和商品需要建立关系,要通过订单,订单明细建立关系.根据这个需求,可以分析出需要查询的主表为: 查询主表:用户表 查询关联表:由于商品和用户没有关系,通过订单和订单明细进行关联,所以得出关联表是:orders订单表,orderDetail订单明细表,items商品表.这样的话,sql该如何去写?这样写: select orders.*, t_user.id user_id

  • 关于QueryWrapper,实现MybatisPlus多表关联查询方式

    目录 QueryWrapper实现MybatisPlus多表关联查询 1.dao层接口使用Select注解写SQL 2.service层代码示例 3.反射工具类 4.判空工具类 MybatisPlus QueryWrapper简单用法 QueryWrapper实现MybatisPlus多表关联查询 1.dao层接口使用Select注解写SQL 重点:@Param("ew") Wrapper参数是必须,因为${ew.customSqlSegment} 底层其实就是where 条件,所以为

  • Yii2.0表关联查询实例分析

    本文实例讲述了Yii2.0表关联查询的方法.分享给大家供大家参考,具体如下: 你可以使用 ActiveRecord 来进行关联查询(比如,从A表读取数据时把关联的B表数据也一起读出来), 在Active Record中,获取关联数据可以像访问主表ActiveRecord对象的属性(property)一样简单. 比如,通过合适的关系声明,你可以使用 $customer->orders 来获取一个 Order 对象数组,代表该客户下的订单. 要声明一个关系(relation),定义一个getter方

  • Yii2.0框架模型多表关联查询示例

    本文实例讲述了Yii2.0框架模型多表关联查询.分享给大家供大家参考,具体如下: 联表查询--hasMany: use app\models\User; $right = Right::findOne(2); //$user = User::find()->where(['right_id' => $right->attributes['id']])->all(); $user = $right->hasMany(User::className(),['right_id' =

  • mybatis-plus多表关联查询功能的实现

    学习目标: mybatis-plus多表关联查询 学习内容: mybatis-plus多表关联查询 实体类部分代码 @Data @AllArgsConstructor @NoArgsConstructor @TableName("wb_member") public class WbMember implements Serializable { private static final long serialVersionUID=1L; /** * 用户ID */ @ApiModel

随机推荐