SpringBoot从入门到精通(十七)MyBatis系列之——创建自定义mapper 实现多表关联查询!

简介: 在实际工作中通用Mapper并不能满足所有的工作,或是某个业务需要手写 sql 语句、或是多表关联时,该怎么办呢? 这就需要额外的一些自定义的mapper 实现一些特定的功能。

之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类、mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能。mybatis 插件自动生成的mapper 实现了大部分基本、通用的方法,如:insert、update、delete、select 等大概20个左右方法,都是比较基础的增删改查,这些通用Mapper提供的方法基本都能满足各种单表操作需求。

但是,在实际工作中通用Mapper并不能满足所有的工作,或是某个业务需要手写 sql 语句、或是多表关联时,该怎么办呢? 这就需要额外的一些自定义的mapper 实现一些特定的功能。下面就来介绍自定义mapper 的实现。


 

一、创建Mapper

首先需要创建一个项目并整合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

image.png


三、多表关联查询

上面讲的是,创建一个自定义的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源码。获取这个系列课程的完整源码。




推荐阅读:

SpringBoot从小白到精通(十六)使用pagehelper实现分页查询功能

SpringBoot从小白到精通(十五)实现开发环境热部署

SpringBoot从小白到精通(十四)使用JdbcTemplate操作数据库,配置多数据源!

SpringBoot从小白到精通(十三)如何实现事务保存

SpringBoot从小白到精通(十二)logback日志配置

SpringBoot从小白到精通(十一)统一异常处理

SpringBoot从小白到精通(十)使用Interceptor拦截器,一学就会!

SpringBoot从小白到精通(九)使用@Async实现异步执行任务

SpringBoot从小白到精通(八)熟悉@EnableScheduling,一秒搞定定时任务

SpringBoot从小白到精通(七)使用Redis实现高速缓存架构

SpringBoot从小白到精通(六)使用Mybatis实现增删改查【附详细步骤】

SpringBoot从小白到精通(五)Thymeleaf的语法及常用标签

SpringBoot从小白到精通(四)Thymeleaf页面模板引擎

SpringBoot从小白到精通(三)系统配置及自定义配置

SpringBoot从小白到精通(二)如何返回统一的数据格式

SpringBoot从小白到精通(一)如何快速创建SpringBoot项目


相关文章
|
8月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
453 0
|
4月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
455 13
|
5月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1011 1
Spring boot 使用mybatis generator 自动生成代码插件
|
6月前
|
SQL XML Java
菜鸟之路Day33一一Mybatis入门
本文是《菜鸟之路Day33——Mybatis入门》的教程,作者blue于2025年5月18日撰写。文章介绍了MyBatis作为一款优秀的持久层框架,如何简化JDBC开发。通过创建SpringBoot工程、数据库表`user`及实体类`User`,引入MyBatis依赖并配置数据库连接信息,使用注解方式编写SQL语句实现查询所有用户数据的功能。此外,还展示了如何通过Lombok优化实体类代码,减少冗余的getter/setter等方法,提高开发效率。最后通过单元测试验证功能的正确性。
262 19
|
5月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
235 1
|
8月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
689 0
|
1月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
1月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
1月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
下一篇
oss云网关配置