前几天写一个有几十个字段的查询wrapper,写得我心烦意乱。然后就琢磨了一下能不能只传一个条件类对像就能创建对应的wrapper。去看了下mybatis-plus的文档没看到合适的api,有一个创建wrapper时传入实体类的,但那个的查询条件都是eq不太使用。所以我就自己用反射和泛型写了一个创建wrapper的方法,可以根据传入的dto对象和泛型来返回对应的wrapper。

理一下需求:
  1. 我需要一个能创建任意类型wrapper的方法。
  2. 这个方法的参数需要是Object类型,方便传入任意类型的dto。
  3. 能根据这个dto的字段类型来使用不同的查询条件。

大概思路就是根据泛型创建一个对应类型的QueryWrapper,使用反射来读取遍历dto的属性来作为查询条件。

实现

 public static <T> QueryWrapper<T> createWrapper(Object dto){
QueryWrapper<T> wrapper = new QueryWrapper<>();
Class<?> dataClass = data.getClass(); try {
for (Field field : dataClass.getDeclaredFields()) {
//如果属性没有用private修饰的话这行可以不用
field.setAccessible(true);
//获取字段类型和字段值
Class<?> type = field.getType();
Object value = field.get(data);
if (value == null){
continue;
}
//将字段名转为数据库中的字段名
String fieldName;
//获取一下属性上的@TableField注解,优先使用注解的value作为字段名
TableField tableFieldAnnotation = field.getAnnotation(TableField.class);
if (tableFieldAnnotation != null) {
fieldName = tableFieldAnnotation.value();
}else{
//若没有TableField注解则将获取到的字段名转换一下,从驼峰命名改为下划线的形式
fieldName = convertToSnakeCase(field.getName());
}
//下面这部分定义字段的查询方式就看各自的习惯了,下面是我经常用的
//根据字段的类型来选择不同的查询方式
if (type == String.class) {
wrapper.like(fieldName, value);
}else if (type == Long.class){
wrapper.eq(fieldName, value);
}else if (type == List.class){
wrapper.in(fieldName, (ArrayList<?>)value);
}else if (type == TimeParam.class){
TimeUtils val= (TimeParam)value;
wrapper.between(fieldName, val.getStart(), val.getEnd());
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return wrapper; } /**
* 将驼峰命名法的字段名转为下划线隔开的形式
* @param input
* @return
*/
public static String convertToSnakeCase(String input) {
StringBuilder output = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isUpperCase(ch)) {
if (i > 0) {
output.append(StrPool.C_UNDERLINE);
}
output.append(Character.toLowerCase(ch));
} else {
output.append(ch);
}
}
return output.toString();
}

欧了,希望这个方法能帮到各位

【createWrapper】根据条件类创建查询wrapper的更多相关文章

  1. SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询

    背景&痛点 通过ES进行查询,如果需要新增查询条件,则每次都需要进行硬编码,然后实现对应的查询功能.这样不仅开发工作量大,而且如果有多个不同的索引对象需要进行同样的查询,则需要开发多次,代码复 ...

  2. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  3. Hibernate--------八大类HQL查询集合

    Hibernate的   八大类HQL查询集合 Hibernate的八大类HQL查询集合: 一:属性查询(SimplePropertyQuery) 1,单一属性查询 *返回结果集属性列表,元素类型和实 ...

  4. Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询

    原文:Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候, ...

  5. 【2017-03-10】Tsql语句基础、条件,高级查询

    一.语句基础 1.创建数据库:create database 数据库名(不能汉字,不能数字.符号开头) 2.删除数据库:drop database 数据库名 3.选用数据库:use 数据库名 4.创建 ...

  6. 【2017-03-10】T-sql基础语句及条件,高级查询

    一.T-sql基础语句 1.创建数据库:create database 数据库名  (不能中文,不能数字开头,不能符号开头) 2.删除数据库:drop database 数据库名 3.选择数据库:us ...

  7. 002Conditional条件化创建bean

    01.条件化配置bean @Bean @Conditional(MagicExistsCondition.class)---->条件化创建bean public MagicBean magicB ...

  8. 应用DriverManager类创建sqlserver数据库连接实例 JSP中使用数据库

    JSP中使用数据库 1.JDBC介绍 java数据库连接(java Database Connectivity ,JDBC)是一种用于执行SQL语句的JavaAPI ,由一组使用java编程语言编写的 ...

  9. Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据

    Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据 1. 1. 配置条件字段@Conditional 1 1 2. 2. 配置条件字段 ...

  10. 对于python,一切事物都是对象,对象基于类创建

    新建列表.新建string字符串 li1 = [1, 2, 3, 4] li2 = list([1, 2, 3]) s1 = "abc" s2 = str("abc&qu ...

随机推荐

  1. Zabbix Timeout 设置不当导致的问题

    哈喽大家好,我是咸鱼 今天跟大家分享一个关于 zabbix Timeout 值设置不当导致的问题,这个问题不知道大家有没有碰到过 问题 事情经过是这样的: 把某一台 zabbix agent 的模板由 ...

  2. Java 基础复习——StringBuffer 和 StringBuilder

    StringBuffer 和 StringBuilder StringBuffer 类 简介 java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删 很多方法和 S ...

  3. JAVA 环境搭建(java 8为例)

    JAVA 环境搭建 下载JDK(java 8为例) JDK下载地址:直达 JDK镜像网站: 编程宝库 java jdk镜像 安装JDK(java 8为例) 双击启动下载的exe文件 单击下一步 可以选 ...

  4. 简约版八股文(day2)

    Redis(内存中->非关系型数据库) redis是什么,为什么要用redis redis是基于键值对的NoSQL数据库,经常用来做缓存用户直接读取数据库中的数据效率是相对比较慢的,如果把数据读 ...

  5. Git的基本操作(CUDR)及分支

    ## 安装 到Git官网下载,网站地址:https://git-scm.com/downloads 需要从网上下载一个,然后进行默认安装即可.安装完成后,在开始菜单里面找到 "Git --& ...

  6. .NetCore3.1+微服务架构技术栈

    目标 目标系统架构演变,单体-分布式-微服务-中台 微服务架构核心解决,横向对比1.0.2.0.3.0 践行微服务架构,全组件解读! 也谈中台 单体架构Monolithic 单体应用时代:应用程序就是 ...

  7. debezium之mysql配置

    实验环境 全部部署于本地虚拟机 1 mysql 参考 官方文档 和 根据官方示例镜像(debezium/example-mysql,mysql版本为8.0.32) 1.1 创建用户 官方镜像里一共有三 ...

  8. Flutter系列文章-Flutter进阶2

    这一节我将再详细地为您介绍 Flutter 进阶主题,包括导航和路由.状态管理.异步处理.HTTP请求和Rest API,以及数据持久化.让我们逐个介绍这些主题. 1.导航和路由 在 Flutter ...

  9. Django创建超级管理员用户

    python manage.py createsuperuser 后面就会提示你输入用户名.邮箱以及密码.

  10. [mysql]状态检查常用SQL

    前言 使用MySQL自身命令获取数据库服务状态. 连接数 -- 最大使用连接数 show status like 'Max_used_connections'; -- 系统配置的最大连接数 show ...