zoukankan      html  css  js  c++  java
  • Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类、mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能。mybatis 插件自动生成的mapper 实现了大部分基本、通用的方法,如:insert、update、delete、select 等大概20个左右方法,都是比较基础的增删改查,这些通用Mapper提供的方法基本都能满足各种单表操作需求。但是,在实际工作中通用Mapper并不能满足所有的工作,或是某个业务需要手写 sql 语句、或是多表关联时,该怎么办呢? 这就需要额外的一些自定义的mapper 实现一些特定的功能。下面就来介绍自定义mapper 的实现。

    Spring Boot入门系列文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html

    一、快速实现

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

     

    三、多表关联查询

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

  • 相关阅读:
    D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
    Vijos P1389婚礼上的小杉
    AIM Tech Round (Div. 2) C. Graph and String
    HDU 5627Clarke and MST
    bzoj 3332 旧试题
    codeforces 842C Ilya And The Tree
    codesforces 671D Roads in Yusland
    Travelling
    codeforces 606C Sorting Railway Cars
    codeforces 651C Watchmen
  • 原文地址:https://www.cnblogs.com/zhangweizhong/p/13045759.html
Copyright © 2011-2022 走看看