spring boot 2使用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;
	}	
}

 

  • 11
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot项目中使用MyBatis进行多表关联查询的步骤如下: 1. 首先,在pom.xml文件中添加MyBatis的依赖项。可以使用以下代码片段添加依赖项: ``` <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> ``` 2. 创建一个Mapper接口,用于定义多表关联查询的方法。在该接口中,使用@Select注解定义SQL查询语句。例如,可以创建一个名为SysUserPrivilegesMapper的接口,并在其中定义多表关联查询的方法。 3. 创建一个Mapper XML文件,用于编写SQL查询语句。在该文件中,使用<select>标签定义查询语句,并使用<resultType>标签指定返回结果的类型。例如,可以创建一个名为SysUserPrivilegesMapper.xml的文件,并在其中编写多表关联查询的SQL语句。 4. 在Controller类中注入Mapper接口,并在需要进行多表关联查询的方法中调用Mapper接口的方法。例如,可以在SysUserPrivilegesController类中注入SysUserPrivilegesMapper接口,并在selectAll()方法中调用Mapper接口的selectAllColumnRole()方法。 这样,当调用selectAll()方法时,就会执行多表关联查询,并返回查询结果。 请注意,以上步骤仅为示例,实际使用时需要根据具体的项目需求进行相应的修改和调整。 #### 引用[.reference_title] - *1* [SpringBoot结合mybatis实现多表关联查询](https://blog.csdn.net/m0_38004177/article/details/112768314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [SpringBoot+Mybatis关联查询多表数据拼接结果集](https://blog.csdn.net/jike11231/article/details/120566272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值