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

Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!的更多相关文章

  1. Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...

  2. Spring Boot入门系列(十三)如何实现事务

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1 ...

  3. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...

  4. Spring Boot入门系列(十六)使用pagehelper实现分页功能

    之前讲了Springboot整合Mybatis,然后介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.接下来要说一说Mybatis 的分页 ...

  5. Spring Boot 入门系列

    本系列博文版权 简书 面皮大师 所有,转载请标明原文及出处: http://www.jianshu.com/u/062bd8f1299c 项目地址: https://github.com/daleiw ...

  6. Spring Boot入门系列(十八)整合mybatis,使用注解的方式实现增删改查

    之前介绍了Spring Boot 整合mybatis 使用xml配置的方式实现增删改查,还介绍了自定义mapper 实现复杂多表关联查询.虽然目前 mybatis 使用xml 配置的方式 已经极大减轻 ...

  7. Spring Boot入门系列(十四)使用JdbcTemplate操作数据库,配置多数据源!

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.如何实现事物控制.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/c ...

  8. Spring Boot入门系列(六)如何整合Mybatis实现增删改查

    前面介绍了Spring Boot 中的整合Thymeleaf前端html框架,同时也介绍了Thymeleaf 的用法.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/z ...

  9. Spring Boot入门系列(十九)整合mybatis,使用注解实现动态Sql、参数传递等常用操作!

    前面介绍了Spring Boot 整合mybatis 使用注解的方式实现数据库操作,介绍了如何自动生成注解版的mapper 和pojo类. 接下来介绍使用mybatis 常用注解以及如何传参数等数据库 ...

随机推荐

  1. 第四届蓝桥杯JavaC组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学. ...

  2. 第三届蓝桥杯JavaC组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1. 填算式 [结果填空] (满分11分) 看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字. ...

  3. java实现Kruskal算法

    1 问题描述 何为Kruskal算法? 该算法功能:求取加权连通图的最小生成树.假设加权连通图有n个顶点,那么其最小生成树有且仅有n - 1条边. 该算法核心思想:从给定加权连通图中,选择当前未被选择 ...

  4. JPA入门及深入

    一:ORM介绍 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数 ...

  5. Oracle RMAN各类压缩算法对比测试

    1.背景概述 2.本次测试环境基本信息 3.测试步骤 3.1. 使用BCO进行压缩备份 3.2. 不使用压缩备份 3.3. 使用ACO中LOW级别进行压缩备份 3.4. 使用ACO中MEDIUM级别进 ...

  6. 测试-spring源码摘取

    首次加载idea是真的慢... 也许是我电脑性能太差... 我分析他内部有一套索引的机制,需要每次打开现建立... 没有固态的话,首次打开还不如eclipse 第一次使用博客园,以前都在csdn混~ ...

  7. Javascript 随机显示数组元素

    $(function(){ var wx_arr = ['gb3055','gb6365']; var storage = window.localStorage; function random_w ...

  8. 问题解决:psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

    错误提示: psql: could not connect to server: No such file or directory Is the server running locally and ...

  9. 用python复制文件夹

    用python复制文件 1. 根据文件夹的名称复制 需要复制的文件夹编号文件中,每一行表示一个编号,如下所示: > cat id.txt 1 2 3 ... > 目标文件的目录结构树如下所 ...

  10. python实现批量文件重命名

    本文实例为大家分享了python批量文件重命名的具体代码,供大家参考,具体内容如下 问题描述 最近遇到朋友求助,如何将大量文件名前面的某些字符删除. 即将图中文件前的编号删除. Python实现 用到 ...