01、前言

为什么会写这篇文章, 因为在看到 MapperAnnotationBuilder 构造方法初始化时, 发现了四个从未见过的注解

public MapperAnnotationBuilder(Configuration configuration, Class<?> type) {...sqlAnnotationTypes.add(Select.class);sqlAnnotationTypes.add(Insert.class);sqlAnnotationTypes.add(Update.class);sqlAnnotationTypes.add(Delete.class);// 这四个注解眼生的很sqlProviderAnnotationTypes.add(SelectProvider.class);sqlProviderAnnotationTypes.add(InsertProvider.class);sqlProviderAnnotationTypes.add(UpdateProvider.class);sqlProviderAnnotationTypes.add(DeleteProvider.class);
}

@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider

分别是 mybatis 定义的 另类增删改查注解

02、介绍篇

四个注解中分别都有两个属性, 这里以 @SelectProvider举例

可以看到, 两个属性并没有默认值, 证明定义注解的话, 这两个属性必须组合使用

没有看到这一块的具体解析源码, 不过也能猜出来, 根据反射调用方法获取的返回值

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface InsertProvider {// 用于指定获取 sql 语句的指定类Class<?> type();// 指定类中要执行获取 sql 语句的方法String method();
}

03、实战篇

如何根据注解定义 sql 语句呢, 首先定义 mapper 接口

public interface AutoConstructorMapper {@SelectProvider(type = SubjectSqlProvider.class, method = "getSubjectTestProvider")PrimitiveSubject getSubjectTestProvider(@Param("id") int id);
}

“ @Param() 为必须, 在解析时会将参数定义为 map, 进行调用指定 method

创建 type 对应的存放 sql 语句的类, 以及定义返回 sql 语句的方法

有三点需要注意:

  1. 方法入参必须为 Map
  2. 方法的权限修饰符 必须是 public
  3. 方法返回的必须是拼接好的 sql 字符串
public class SubjectSqlProvider {public String getSubjectTestProvider(Map<String, Object> params) {return new SQL().SELECT("*").FROM("subject").WHERE("id = " + params.get("id")).toString();}
}

“ SQL 类是 mybatis 提供开发者在代码中灵活编写 sql 语句的工具类

04、思考篇

思考一下, @SelectProvider 注解, 与 @Select 注解解析流程有什么不同?

@Select@SelectProvider 只是在定义注解的方式上有所不同, 一个是直接定义 sql, 一个是在外部定义好 sql 直接引用, 没有质的区别

在 mybatis 初始化定义 MappedStatement 时, 使用了两种不同的逻辑进行组装 SqlSource

Class<? extends Annotation> sqlAnnotationType = getSqlAnnotationType(method);
Class<? extends Annotation> sqlProviderAnnotationType = getSqlProviderAnnotationType(method);
if (sqlAnnotationType != null) {if (sqlProviderAnnotationType != null) {throw new BindingException("You cannot supply both a static SQL and SqlProvider to method named " + method.getName());}Annotation sqlAnnotation = method.getAnnotation(sqlAnnotationType);final String[] strings = (String[]) sqlAnnotation.getClass().getMethod("value").invoke(sqlAnnotation);return buildSqlSourceFromStrings(strings, parameterType, languageDriver);
} else if (sqlProviderAnnotationType != null) {Annotation sqlProviderAnnotation = method.getAnnotation(sqlProviderAnnotationType);return new ProviderSqlSource(assistant.getConfiguration(), sqlProviderAnnotation, type, method);
}

05、使用篇

这里介绍下 mybatis 具体编写 SQL 的三种形式, 以及介绍不同的方式对应的使用场景

5.1 @Select

这种方式能够定义简单的 sql, 不涉及复杂查询和多参数的场景, 类似下述方式

@Select 定义 sql 的方式是最简单的, 省去了定义 xml文件的繁琐, 也少了定义编写 @SelectProvider 对应类和方法的步骤

SELECT * FROM subject WHERE id = #{id}

5.2 @SelectProvider

这种方式编写sql适合编写中等长度, 简单的查询搭配 join、group、order...

SQL 工具类提供了这种简单的 API 语法, 还是比较方便的

如果不想使用 SQL 工具类, 自己编写 sql 字符串也是可以的

5.3 .xml 文件

这种方式就不多说了, 功能全部具备, 比如计算函数、动态SQL、各种关键字都支持

这几种方式都能够实现我们的 sql 编写需求, 只不过针对不同的场景, 合理的使用即可

06、总结篇

看 mybatis 源码, 对变量、方法的命名加深了感触, 一个好的变量或者方法命名在代码中是多么有必要

getSqlSourceFromAnnotations 是不是要比 getSqlSource 要好理解很多, 看了之后就能让阅读者知道这个方法要做什么功能

有什么好的源码阅读习惯可以点击下方进行留言, 大家一起讨论更好的学习方式 [开心]

@select注解模糊查询_mybatis @SelectProvider 注解, 打赌你没有用过相关推荐

  1. c3p0 参数 模糊查询_mybatis之动态sql,模糊查询,结果集处理,mybatis分页及特殊字符处理...

    目标及项目目录结构 目标 1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 项目的目录结构 1.mybatis动态sql If.trim.forea ...

  2. mybaits的模糊查询_mybatis模糊查询防止SQL注入(很详细)

    SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如"or '1'='1'"这样的语句),有可能入侵参数检验不足的应用程序 ...

  3. oracle模糊查询like语句,sql语句select like模糊查询用法

    本节内容: sql语句之select like模糊查询语法 1,like语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的 ...

  4. mysql mapper配置模糊查询_Mybatis各种模糊查询

    模糊查询: 工作中用到,写三种用法吧,第四种为大小写匹配查询 1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('% ...

  5. xml mysql 模糊查询_mybatis+Spring mysql的模糊查询问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 查询的mapping.xml语法 resultType="java.lang.Integer"> SELECT count(yy ...

  6. mybatis mysql 模糊查询_MyBatis Oracle、MySQL、DB2、SQLServer的like模糊查询

    Oracle数据库: select * from t_user where name like '%'||#{search_name}||'%' 或者 select * from t_user whe ...

  7. jQuery 实现 select模糊查询 反射机制

    通过如下代码就可以简单实现select带模糊查询的条件查询,具体如下jquery.select.js如下: (function($) { $.selectSuggest = function(targ ...

  8. 万能的Map集合传递参数和模糊查询

    注意:结合之前文章mybatis基础,在此基础上进行. 1 万能的Map 假设我们的实体类,或者数据库中的表.字段或者参数过多,我们可以考虑使用Map 1 不同名字的插入操作 // 不同名字的插入操作 ...

  9. Layui+ssm模糊查询

    做后台一般都要用到模糊查询,这次是用layui前端框架的查询,一开始表格能重载,但就是不是自己想要的结果,因为它把全部数据都重载出来了,等于没查. 按钮代码 1.<div class=" ...

最新文章

  1. Google Java编程风格指南中文版
  2. Codeforces Beta Round #2--B题 (DP)
  3. 修改mysql用户家目录,Linux 更改MySQL目录
  4. docker搭建mysql主从
  5. 如何在服务器运行aspx_ASP.NET开发实战——(四)MVC是如何运行?它的生命周期是什么?...
  6. RAID磁盘阵列配置和调优小结
  7. java 输入密码时显示星号6_Java多线程 例子 cmd窗口下 实现输入密码星号显示
  8. html图片轮播_前端轮播图怎么做?JavaScript来帮你轻松搞定
  9. 软件架构设计的几点理解
  10. adobe mac怎么卸载 ?彻底卸载Adobe Mac软件的正确做法
  11. 工科数学分析 MA_12 Vectors and the Geometry of Space (下篇)
  12. 经典6位半HP34401A电路图
  13. P3369 【模板】普通平衡树 Treap树堆学习笔记
  14. 微信java转盘抽奖代码_jquery手机端抽奖代码_微信jquery实现大转盘抽奖代码特效...
  15. Springboot爱护大自然的设计与实现 毕业设计-附源码231643
  16. 智能配时、图片识别…AI为你的春运保驾护航!
  17. 通过路由器连接JetsonNano与地面站
  18. scanner——04scaner进阶
  19. UDP TCP socket EtherCAT都是什么?
  20. 12年来最大飞跃!黄仁勋发布史上最强GPU,世界首个实时光线追踪新一代图灵架构...

热门文章

  1. 大竹中学2021高考成绩查询,四川大竹中学2021录取分数线
  2. python怎么把程序封装成函数_PYTHON中如何把固定格式代码,封装成一个函数?
  3. Python入门100题 | 第019题
  4. Spring Boot 2.0官方文档之 Actuator
  5. 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
  6. How do annotations work internally--转
  7. java 并发编程第七章:取消和关闭
  8. Java 理论与实践: 非阻塞算法简介--转载
  9. 【数据处理】python数据评估常用指标:ks、fpr、tpr
  10. 元宇宙iwemeta:互联网行业年底清算,税收优惠门槛抬高,阿里巴巴多交41亿税款