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源码。获取这个系列课程的完整源码。

  • 相关阅读:
    Struts系列教材 (十九)- 其他
    Struts系列教材 (十八)- 其他
    Struts系列教材 (十七)- 其他
    Struts系列教材 (十六)- 标签
    Struts系列教材 (十五)- 标签
    Struts系列教材 (十四)- 标签
    Struts系列教材 (十三)- 标签
    Struts系列教材 (十二)- 标签
    Struts系列教材 (十一)- 标签
    ios中二维码的使用之二: 二维码的扫描
  • 原文地址:https://www.cnblogs.com/zhangweizhong/p/13045759.html
Copyright © 2011-2022 走看看