mybatis系列-tkmybatis-07-使用动态SQL方式扩展接口,进行多表关联查询

本文主要是介绍mybatis系列-tkmybatis-07-使用动态SQL方式扩展接口,进行多表关联查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        实际项目中,除了使用一些常用的增删改查的方法之外,有些复杂的需求,可能还需要执行一些自定义的动态sql。mybatis 除了提供了@Insert、@Delete 这些常用的注解,还提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,用来建立动态sql 和让 mybatis 执行这些sql 的注解。这些注解在Mybatis Spring和tkMybatis中都能使用。像我们在tkMybatis源码分析章节中介绍的,tkMybatis就是采用这种方式来实现接口方法,它提供的默认接口,每一个接口方法的SQL都是由一个对应的Provider类来实现的。

下面就来实现多表关联查询的功能。

1、首先创建 MydefineProvider类,并定义两个方法selectAllUsersOrdersByProvider和selectOneUsersOrdersByProvider分别用来 查询所有用户订单及某一个用户订单

package com.example.demotkmybatisgeneralsecond.providers;/*** CreateDate: 2021-4-30 <br/>* Description:* Version: 1.0**/public class MydefineProvider {/*返回的SQL和XML配置里面返回的SQL语法是一致的*/public String selectAllUsersOrdersByProvider(){String SQL = "SELECT a.*, b.id as order_id, b.receiver_name, b.total_amount, b.real_pay_amount\n" +"    FROM users a LEFT JOIN orders b on a.id = b.user_id\n" +"    WHERE b.id is not NULL";return SQL;}public String selectOneUsersOrdersByProvider(String userId){String SQL = "SELECT a.*, b.id as order_id, b.receiver_name, b.total_amount, b.real_pay_amount\n" +"    FROM users a LEFT JOIN orders b on a.id = b.user_id\n" +"    WHERE b.id is not NULL AND a.id = #{userId,jdbcType=VARCHAR}";return SQL;}}

 

2、Mapper 中新增接口selectAllUsersOrdersByProvider方法和selectAllUsersOrdersByAnnotation

        通过SelectProvider注解来指定用哪一个类的什么方法创建SQL,Results注解与上一章通过注解方法扩展接口是一致的,用来处理返回结果到POJO类的映射。

@SelectProvider(type = MydefineProvider.class, method = "selectAllUsersOrdersByProvider")@Results({@Result(column="id", jdbcType= JdbcType.VARCHAR, property="id",id=true),@Result(column="username",jdbcType=JdbcType.VARCHAR,property="username"),@Result(column="password",jdbcType=JdbcType.VARCHAR,property="password"),@Result(column="nickname",jdbcType=JdbcType.VARCHAR,property="nickname"),@Result(column="realname",jdbcType=JdbcType.VARCHAR,property="realname"),@Result(column="face",jdbcType=JdbcType.VARCHAR,property="face"),@Result(column="mobile",jdbcType=JdbcType.VARCHAR,property="mobile"),@Result(column="email",jdbcType=JdbcType.VARCHAR,property="email"),@Result(column="sex",jdbcType=JdbcType.INTEGER,property="sex"),@Result(column="birthday",jdbcType=JdbcType.DATE,property="birthday"),@Result(column="created_time",jdbcType=JdbcType.TIMESTAMP,property="createdTime"),@Result(column="updated_time",jdbcType=JdbcType.TIMESTAMP,property="updatedTime"),@Result(column="order_id",jdbcType=JdbcType.VARCHAR,property="orderId"),@Result(column="receiver_name",jdbcType=JdbcType.VARCHAR,property="receiverName"),@Result(column="total_amount",jdbcType=JdbcType.INTEGER,property="totalAmount"),@Result(column="real_pay_amount",jdbcType=JdbcType.INTEGER,property="realPayAmount")})List<UserOrders> selectAllUsersOrdersByProvider();@SelectProvider(type = MydefineProvider.class, method = "selectOneUsersOrdersByProvider")@Results({@Result(column="id", jdbcType= JdbcType.VARCHAR, property="id",id=true),@Result(column="username",jdbcType=JdbcType.VARCHAR,property="username"),@Result(column="password",jdbcType=JdbcType.VARCHAR,property="password"),@Result(column="nickname",jdbcType=JdbcType.VARCHAR,property="nickname"),@Result(column="realname",jdbcType=JdbcType.VARCHAR,property="realname"),@Result(column="face",jdbcType=JdbcType.VARCHAR,property="face"),@Result(column="mobile",jdbcType=JdbcType.VARCHAR,property="mobile"),@Result(column="email",jdbcType=JdbcType.VARCHAR,property="email"),@Result(column="sex",jdbcType=JdbcType.INTEGER,property="sex"),@Result(column="birthday",jdbcType=JdbcType.DATE,property="birthday"),@Result(column="created_time",jdbcType=JdbcType.TIMESTAMP,property="createdTime"),@Result(column="updated_time",jdbcType=JdbcType.TIMESTAMP,property="updatedTime"),@Result(column="order_id",jdbcType=JdbcType.VARCHAR,property="orderId"),@Result(column="receiver_name",jdbcType=JdbcType.VARCHAR,property="receiverName"),@Result(column="total_amount",jdbcType=JdbcType.INTEGER,property="totalAmount"),@Result(column="real_pay_amount",jdbcType=JdbcType.INTEGER,property="realPayAmount")})List<UserOrders> selectOneUsersOrdersByProvider(String userId);

说明:

  type:动态生成 SQL 的类。

  method:类中具体的方法名。

      以上,就是使用sqlprovider 动态创建sql,除了示例中的 @SelectProvider ,还有 @InsertProvider、UpdateProvider、 @SelectProvider 、@DeleteProvider 提供给插入、更新、删除的时使用。 

 

这篇关于mybatis系列-tkmybatis-07-使用动态SQL方式扩展接口,进行多表关联查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075811

相关文章

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame