ES基础篇-11-Spring提供的elasticsearch组件:Spring Data Elasticsearch

article/2025/10/5 3:35:03

1. 简介

1.1.什么是SpringDataElasticsearch

SpringDataElasticsearch(以后简称SDE)是Spring Data项目下的一个子模块。

查看 Spring Data的官网:http://projects.spring.io/spring-data/

在这里插入图片描述

Spring Data 的使命是给各种数据访问提供统一的编程接口,不管是关系型数据库(如MySQL),还是非关系数据库(如Redis),或者类似Elasticsearch这样的索引数据库。从而简化开发人员的代码,提高开发效率。

包含很多不同数据操作的模块:

在这里插入图片描述

Spring Data Elasticsearch的页面:https://projects.spring.io/spring-data-elasticsearch/

在这里插入图片描述

特征:

  • 支持Spring的基于@Configuration的java配置方式,或者XML配置方式
  • 提供了用于操作ES的便捷工具类**ElasticsearchTemplate**。包括实现文档到POJO之间的自动智能映射。
  • 利用Spring的数据转换服务实现的功能丰富的对象映射
  • 基于注解的元数据映射方式,而且可扩展以支持更多不同的数据格式
  • 根据持久层接口自动生成对应实现方法,无需人工编写基本操作代码(类似mybatis,根据接口自动得到实现)。当然,也支持人工定制查询

2.配置SpringDataElasticsearch

我们在pom文件中,引入SpringDataElasticsearch的启动器:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

然后,只需要在resources下新建application.yml文件,引入elasticsearch的host和port即可:

spring:data:elasticsearch:cluster-name: elasticcluster-nodes: 192.168.150.101:9300,192.168.150.101:9301,192.168.150.101:9302

需要注意的是,SpringDataElasticsearch底层使用的不是Elasticsearch提供的RestHighLevelClient,而是TransportClient,并不采用Http协议通信,而是访问elasticsearch对外开放的tcp端口,我们之前集群配置中,设置的分别是:9301,9302,9300

另外,SpringBoot已经帮我们配置好了各种SDE配置,并且注册了一个ElasticsearchTemplate供我们使用。接下来一起来试试吧。

2.1.索引库操作

2.1.1.创建索引库

我们先创建一个测试类,然后注入ElasticsearchTemplate:

/*** @author 虎哥*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringElasticsearchTest {@Autowiredprivate ElasticsearchTemplate esTemplate;}

然后准备一个新的实体类,作为下面与索引库对应的文档:

package cn.itcast.es.pojo;public class Goods {private Long id;private String title; //标题private String category;// 分类private String brand; // 品牌private Double price; // 价格private String images; // 图片地址public Goods() {}public Goods(Long id, String title, String category, String brand, Double price, String images) {this.id = id;this.title = title;this.category = category;this.brand = brand;this.price = price;this.images = images;}//  getter和setter略
}

下面是创建索引库的API示例:

@Test
public void testCreateIndex(){// 创建索引库,并制定实体类的字节码esTemplate.createIndex(Goods.class);
}

发现没有,创建索引库需要指定的信息,比如:索引库名、类型名、分片、副本数量、还有映射信息都没有填写,这是怎么回事呢?

实际上,与我们自定义工具类类似,SDE也是通过实体类上的注解来配置索引库信息的,我们需要在Goods上添加下面的一些注解:

@Document(indexName = "goods", type = "docs", shards = 3, replicas = 1)
public class Goods {@Idprivate Long id;@Field(type = FieldType.Text, analyzer = "ik_max_word")private String title; //标题@Field(type = FieldType.Keyword)private String category;// 分类@Field(type = FieldType.Keyword)private String brand; // 品牌@Field(type = FieldType.Double)private Double price; // 价格@Field(type = FieldType.Keyword, index = false)private String images; // 图片地址// 。。。略
}

几个用到的注解:

  • @Document:声明索引库配置
    • indexName:索引库名称
    • type:类型名称,默认是“docs”
    • shards:分片数量,默认5
    • replicas:副本数量,默认1
  • @Id:声明实体类的id
  • @Field:声明字段属性
    • type:字段的数据类型
    • analyzer:指定分词器类型
    • index:是否创建索引

2.1.2.创建映射

刚才的注解已经把映射关系也配置上了,所以创建映射只需要这样:

@Test
public void testMapping(){// 创建索引库,并制定实体类的字节码esTemplate.putMapping(Goods.class);
}

查看索引库:

在这里插入图片描述

3. 索引数据CRUD

SDE的索引数据CRUD并没有封装在ElasticsearchTemplate中,而是有一个叫做ElasticsearchRepository的接口:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9aLfTnqQ-1614864431921)(assets/1554378139181.png)]

我们需要自定义接口,继承ElasticsearchRespository:

package cn.itcast.es.repository;import cn.itcast.es.pojo.Goods;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;/*** @author 虎哥*/
public interface GoodsRepository extends ElasticsearchRepository<Goods, Long> {
}

3.1.创建索引数据

创建索引有单个创建和批量创建之分,先来看单个创建

@Autowired
private GoodsRepository goodsRepository;@Test
public void addDocument(){Goods goods = new Goods(1L, "小米手机9", " 手机","小米", 3499.00, "http://image.leyou.com/13123.jpg");// 添加索引数据goodsRepository.save(goods);
}

再来看批量创建:

@Test
public void addDocuments(){// 准备文档数据:List<Goods> list = new ArrayList<>();list.add(new Goods(1L, "小米手机7", "手机", "小米", 3299.00, "/13123.jpg"));list.add(new Goods(2L, "坚果手机R1", "手机", "锤子", 3699.00, "/13123.jpg"));list.add(new Goods(3L, "华为META10", "手机", "华为", 4499.00, "/13123.jpg"));list.add(new Goods(4L, "小米Mix2S", "手机", "小米", 4299.00, "/13123.jpg"));list.add(new Goods(5L, "荣耀V10", "手机", "华为", 2799.00, "/13123.jpg"));// 添加索引数据goodsRepository.saveAll(list);
}

通过elasticsearch-head查看:

在这里插入图片描述

3.2.查询索引数据

默认提供了根据id查询,查询所有两个功能:

根据id查询

@Test
public void testQueryById(){Optional<Goods> goodsOptional = goodsRepository.findById(3L);System.out.println(goodsOptional.orElse(null));
}

结果:

Item{id=3, title='华为META10', category='手机', brand='华为', price=4499.0, images='http://image.leyou.com/13123.jpg'}

查询所有:

@Test
public void testQueryAll(){Iterable<Goods> list = goodsRepository.findAll();list.forEach(System.out::println);
}

结果:

Item{id=2, title='坚果手机R1', category='手机', brand='锤子', price=3699.0, images='http://image.leyou.com/13123.jpg'}
Item{id=4, title='小米Mix2S', category='手机', brand='小米', price=4299.0, images='http://image.leyou.com/13123.jpg'}
Item{id=5, title='荣耀V10', category='手机', brand='华为', price=2799.0, images='http://image.leyou.com/13123.jpg'}
Item{id=1, title='小米手机7', category='手机', brand='小米', price=3299.0, images='http://image.leyou.com/13123.jpg'}
Item{id=3, title='华为META10', category='手机', brand='华为', price=4499.0, images='http://image.leyou.com/13123.jpg'}

3.3.自定义方法查询

GoodsRepository提供的查询方法有限,但是它却提供了非常强大的自定义查询功能:

只要遵循SpringData提供的语法,我们可以任意定义方法声明:

public interface GoodsRepository extends ElasticsearchRepository<Goods, Long> {/*** 根据价格区间查询* @param from 开始价格* @param to 结束价格* @return 符合条件的goods*/List<Goods> findByPriceBetween(Double from, Double to);
}

无需写实现,SDE会自动帮我们实现该方法,我们只需要用即可:

@Test
public void testQueryByPrice(){List<Goods> list = goodsRepository.findByPriceBetween(1000d, 4000d);list.forEach(System.out::println);
}

结果:

Item{id=2, title='坚果手机R1', category='手机', brand='锤子', price=3699.0, images='http://image.leyou.com/13123.jpg'}
Item{id=5, title='荣耀V10', category='手机', brand='华为', price=2799.0, images='http://image.leyou.com/13123.jpg'}
Item{id=1, title='小米手机7', category='手机', brand='小米', price=3299.0, images='http://image.leyou.com/13123.jpg'}

支持的一些语法示例:

KeywordSampleElasticsearch Query String
AndfindByNameAndPrice{"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
OrfindByNameOrPrice{"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
IsfindByName{"bool" : {"must" : {"field" : {"name" : "?"}}}}
NotfindByNameNot{"bool" : {"must_not" : {"field" : {"name" : "?"}}}}
BetweenfindByPriceBetween{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
LessThanEqualfindByPriceLessThan{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
GreaterThanEqualfindByPriceGreaterThan{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
BeforefindByPriceBefore{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
AfterfindByPriceAfter{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
LikefindByNameLike{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
StartingWithfindByNameStartingWith{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
EndingWithfindByNameEndingWith{"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}}
Contains/ContainingfindByNameContaining{"bool" : {"must" : {"field" : {"name" : {"query" : "**?**","analyze_wildcard" : true}}}}}
InfindByNameIn(Collection<String>names){"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}}
NotInfindByNameNotIn(Collection<String>names){"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}}
NearfindByStoreNearNot Supported Yet !
TruefindByAvailableTrue{"bool" : {"must" : {"field" : {"available" : true}}}}
FalsefindByAvailableFalse{"bool" : {"must" : {"field" : {"available" : false}}}}
OrderByfindByAvailableTrueOrderByNameDesc{"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}}

4.原生查询

如果觉得上述接口依然不符合你的需求,SDE也支持原生查询,这个时候还是使用ElasticsearchTemplate

而查询条件的构建是通过一个名为NativeSearchQueryBuilder的类来完成的,不过这个类的底层还是使用的原生API中的QueryBuildersAggregationBuildersHighlightBuilders等工具。

示例:

@Test
public void testNativeQuery(){// 原生查询构建器NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 1.1 source过滤queryBuilder.withSourceFilter(new FetchSourceFilter(new String[0], new String[0]));// 1.2搜索条件queryBuilder.withQuery(QueryBuilders.matchQuery("title", "小米手机"));// 1.3分页及排序条件queryBuilder.withPageable(PageRequest.of(0, 2,Sort.by(Sort.Direction.ASC, "price")));// 1.4高亮显示// queryBuilder.withHighlightBuilder(new HighlightBuilder().field("title"));// 1.5聚合queryBuilder.addAggregation(AggregationBuilders.terms("brandAgg").field("brand"));// 构建查询条件,并且查询AggregatedPage<Goods> result = esTemplate.queryForPage(queryBuilder.build(), Goods.class);// 2、解析结果:// 2.1分页结果long total = result.getTotalElements();int totalPages = result.getTotalPages();List<Goods> list = result.getContent();System.out.println("总条数 = " + total);System.out.println("总页数 = " + totalPages);list.forEach(System.out::println);// 2.2.聚合结果Aggregations aggregations = result.getAggregations();Terms terms = aggregations.get("brandAgg");terms.getBuckets().forEach(b -> {System.out.println("品牌 = " + b.getKeyAsString());System.out.println("count = " + b.getDocCount());});
}

上述查询不支持高亮结果,悲剧。

5.自定义结果处理器

要支持高亮,必须自定义结果处理器来实现,结果处理器是一个接口:

在这里插入图片描述

可以看到,处理器中的方法接受3个参数:

  • SearchResponse:搜索的Response,原生查询中就见到过
  • Class<T> clazz:结果的实体类的字节码,本例中的是Goods.class
  • Pageable:分页参数,就是我们定义的PageRequest

返回值一个:AggregatedPage<T>,就是带聚合的分页结果

我们可以实现这个方法,在方法内部对响应处理,带上高亮结果:

package cn.itcast.mapper;import com.google.gson.Gson;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.util.CollectionUtils;import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class HighlightResultMapper implements SearchResultMapper {Gson gson = new Gson();@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {String scrollId = response.getScrollId();long total = response.getHits().getTotalHits();float maxScore = response.getHits().getMaxScore();List<T> list = new ArrayList<>();for (SearchHit hit : response.getHits()) {String source = hit.getSourceAsString();T t = gson.fromJson(source, clazz);// 处理高亮Map<String, HighlightField> highlightFields = hit.getHighlightFields();if (!CollectionUtils.isEmpty(highlightFields)) {for (Map.Entry<String, HighlightField> entry : highlightFields.entrySet()) {String fieldName = entry.getKey();String value = StringUtils.join(entry.getValue().getFragments());try {BeanUtils.setProperty(t, fieldName, value);} catch (Exception e) {e.printStackTrace();}}}list.add(t);}return new AggregatedPageImpl<>(list, pageable, total, response.getAggregations(), scrollId, maxScore);}
}

需要额外3个依赖:

<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId>
</dependency>
<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.3</version>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId>
</dependency>

然后再次编写带高亮查询:

@Test
public void testNativeQueryAndHighlight() {// 原生查询构建器NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 1.1 source过滤queryBuilder.withSourceFilter(new FetchSourceFilter(new String[0], new String[0]));// 1.2搜索条件queryBuilder.withQuery(QueryBuilders.matchQuery("title", "小米手机"));// 1.3高亮显示queryBuilder.withHighlightFields(new HighlightBuilder.Field("title"));// 构建查询条件,并且自定义结果处理器AggregatedPage<Goods> result = esTemplate.queryForPage(queryBuilder.build(), Goods.class, new HighlightResultMapper());// 2.1分页结果long total = result.getTotalElements();int totalPages = result.getTotalPages();List<Goods> list = result.getContent();System.out.println("总条数 = " + total);System.out.println("总页数 = " + totalPages);list.forEach(System.out::println);
}

结果:

总条数 = 3
总页数 = 1
Item{id=1, title='<em>小米</em><em>手机</em>7', category='手机', brand='小米', price=3299.0, images='http://image.leyou.com/13123.jpg'}
Item{id=2, title='坚果<em>手机</em>R1', category='手机', brand='锤子', price=3699.0, images='http://image.leyou.com/13123.jpg'}
Item{id=4, title='<em>小米</em>Mix2S', category='手机', brand='小米', price=4299.0, images='http://image.leyou.com/13123.jpg'}

nse.getHits()) {
String source = hit.getSourceAsString();
T t = gson.fromJson(source, clazz);
// 处理高亮
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
if (!CollectionUtils.isEmpty(highlightFields)) {
for (Map.Entry<String, HighlightField> entry : highlightFields.entrySet()) {
String fieldName = entry.getKey();
String value = StringUtils.join(entry.getValue().getFragments());
try {
BeanUtils.setProperty(t, fieldName, value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
list.add(t);
}
return new AggregatedPageImpl<>(list, pageable, total, response.getAggregations(), scrollId, maxScore);
}
}


需要额外3个依赖:```xml
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId>
</dependency>
<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.3</version>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId>
</dependency>

然后再次编写带高亮查询:

@Test
public void testNativeQueryAndHighlight() {// 原生查询构建器NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 1.1 source过滤queryBuilder.withSourceFilter(new FetchSourceFilter(new String[0], new String[0]));// 1.2搜索条件queryBuilder.withQuery(QueryBuilders.matchQuery("title", "小米手机"));// 1.3高亮显示queryBuilder.withHighlightFields(new HighlightBuilder.Field("title"));// 构建查询条件,并且自定义结果处理器AggregatedPage<Goods> result = esTemplate.queryForPage(queryBuilder.build(), Goods.class, new HighlightResultMapper());// 2.1分页结果long total = result.getTotalElements();int totalPages = result.getTotalPages();List<Goods> list = result.getContent();System.out.println("总条数 = " + total);System.out.println("总页数 = " + totalPages);list.forEach(System.out::println);
}

结果:

总条数 = 3
总页数 = 1
Item{id=1, title='<em>小米</em><em>手机</em>7', category='手机', brand='小米', price=3299.0, images='http://image.leyou.com/13123.jpg'}
Item{id=2, title='坚果<em>手机</em>R1', category='手机', brand='锤子', price=3699.0, images='http://image.leyou.com/13123.jpg'}
Item{id=4, title='<em>小米</em>Mix2S', category='手机', brand='小米', price=4299.0, images='http://image.leyou.com/13123.jpg'}

http://chatgpt.dhexx.cn/article/QqcywjDB.shtml

相关文章

91-Lucene+ElasticSeach核心技术

LuceneElasticSeach 什么是全文检索&#xff1a; 数据分类&#xff1a; 我们生活中的数据总体分为两种&#xff1a;结构化数据和非结构化数据 结构化数据&#xff1a;指具有固定格式或有限长度的数据&#xff0c;如数据库&#xff0c;元数据等 非结构化数据&#xff1a;指…

SpringBoot集成Elasticseach

目录 一、Elasticseach介绍 1.简单介绍 2.对比关系&#xff1a; 3.详细说明&#xff1a; 4.查出数据的解释 二、SpringBoot集成Elasticseach 1.引入依赖 2.添加配置 3.创建pojo类与索引对应 4.SpringData封装了基础的增删改查&#xff0c;自定义增删改查 5.测试方法-…

Windows系统下载安装MinGW(包括32位和64位)

一、MinGW简介 MinGW是是将GCC编译器和GNU Binutils移植到Win32平台下的产物&#xff0c;包括一系列头文件&#xff08;Win32API&#xff09;、库和可执行文件。MinGW是从Cygwin&#xff08;1.3.3版&#xff09;基础上发展而来。GCC支持的语言大多在MinGW也受支持&#xff0c;其…

MySQL寻找特定字符后的字符串

“日边清梦断,镜里朱颜改” 在操作数据库的某些情况下,我们需要对其中一字段的最后几个字做修改,如下图,把老师改为学生 我找了半天,好像没找到mysql中有合适的函数,能找到最后一个/符号并且修改后面的字符串.需要用好几个函数嵌套使用.如下: select 处理前 as status,org…

支付宝支付功能的实现

支付宝支付功能实现 一.环境准备 二.配置沙箱环境 1.浏览器搜索 支付宝开放平台 2.找到开发服务&#xff0c;选择沙箱 3.根据文档提示&#xff0c;一步步配置 4.配置完成后的样子 5.下载好支付宝手机开放平台助手&#xff0c;可以获取应用私钥 **注意&#xff1a;**应用公…

针对Spring/Gradle启动失败的一些通用解决方案

文章目录 0 前言1 更改Gradle JVM的Java JDK1.1 执行JUnit测试时&#xff0c;Gradle报错 0 前言 当你对Spring/Gradle启动失败的错误信息一筹莫展时&#xff0c;不妨试试以下这些通用的解决方案 1 更改Gradle JVM的Java JDK Settings -> Build, Execution, Deployment -&…

13123

111 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不…

编译JSqlparser

这个东西是用来解析sql的。既然要编译源码&#xff0c;第一步当然要下载源码了。 要下源码当然是到世界最大同志网站了: https://github.com/JSQLParser/JSqlParser 项目导入idea&#xff0c;缺少源码&#xff0c;原来需要javacc来生成代码。 自然我们需要安装javacc这个东西&…

jsqlparser:修改语法定义(JSqlParserCC.jjt)实现UPSERT支持Phoenix语法ON DUPLICATE KEY IGNORE

最近在用jsqlparser4.5解析SQL时遇到了一个问题&#xff0c; 如下是apache phoenix的UPSERT语句 UPSERT INTO TEST (ID, COUNTER) VALUES (123, 0) ON DUPLICATE KEY IGNOREON DUPLICATE KEY IGNORE即为当主键重复时忽略&#xff0c;这与MySQL的IGNORE语法不同&#xff1a; …

jsqlparser mysql_java sql解析器比较druid sql parser vs jsqlparser vs fdb-sql-parser

先上结论。 功能上&#xff1a;druid sql parser(支持分区、WITH、DUAL等。使用mysql语法解析时&#xff0c;已知oracle的一些操作符会被转为mysql&#xff0c;如|| 转为OR。使用oracle解析器时&#xff0c;union all里面的括号会被移到外面&#xff0c;从而导致可能执行出错) …

JSqlParser4.3版本无法解析mysql中JSON_OBJECT函数抛出ParseException异常

2022年3月31日&#xff0c;找了一下午的bug bug 已经提交issues&#xff0c;详情请看GitHub&#xff0c;地址&#xff1a;https://github.com/JSQLParser/JSqlParser/issues/1504 使用JSqlparser4.3版作者提供的补丁版后解决&#xff0c;下载地址&#xff1a;https://download.…

JSqlparser 使用攻略(高效的SQL解析工具)

JSqlparser github地址 目录 Maven 引用远程仓库依赖包 SQL解析获取SQL中的信息创建Select的方式创建Select&#xff08;非SQL String 创建&#xff09; Insert 插入字段和值where条件中字段替换解析SQL例子获取所有tableNames自动生成别名SQL函数单表where条件拼装JOIN 拼装 校…

jsqlparser 简介、中文文档、中英对照文档 下载

jsqlparser 文档 下载链接&#xff08;含jar包、源码、pom&#xff09; 组件名称中文-文档-下载链接中英对照-文档-下载链接jsqlparser-0.9.5.jarjsqlparser-0.9.5-API文档-中文版.zipjsqlparser-0.9.5-API文档-中英对照版.zipjsqlparser-1.0.jarjsqlparser-1.0-API文档-中文版…

java使用jsqlparser实现自定义转换

jsqlparser描述&#xff1a; JSqlParser 解析 SQL 语句并将其转换为 Java 类的层次结构。基本上的sql关键字和函数都可以被jsqlparser解析成对象层层包装。 实现的功能&#xff1a; 基础sql查询&#xff0c;条件查询&#xff0c;字段和表得别名&#xff0c;排序&#xff0c;…

JSQLParser碰到的问题

JSQLParser是github上一个开源的项目&#xff0c;专门解析SQL&#xff0c;可以轻松地得到一条SQL的列、表、条件等对象&#xff0c; P.S. https://github.com/JSQLParser/JSqlParser 最近在做一个功能开发的时候&#xff0c;被他困扰了下&#xff0c;从需求来讲&#xff0c;就是…

JSqlParser-SQL解析处理

一、介绍 JSqlParse是一款很精简的sql解析工具&#xff0c;将sql语句转成Java对象。 官网&#xff1a;JSqlParser - Home 用法&#xff1a;可以用于数据权限处理&#xff0c;拦截sql解析改写sql等等。 二、版本 <dependency><groupId>com.github.jsqlparser&l…

JSQLParser 解析复杂SQL 2.0

前言 这段时间&#xff0c;为了开发数据中台项目&#xff0c;我去研究学习了JSQLParser&#xff08;Java中解析SQL语句的工具&#xff09;&#xff0c;并且结合网上资料&#xff0c;写了一个初步的SQL解析工具类... 正文 时隔三天&#xff0c;我又回来了&#xff0c; 因为之前J…

JSqlParser入门系列(1)-JSqlParser简介及入门案例

简介 JSqlParser是一个SQL语句解析器。它将SQL转换为Java类的可遍历层次结构。 支持Oracle&#xff0c;SqlServer&#xff0c;MySQL&#xff0c;PostgreSQL等常用数据库。但各种数据库系统的SQL语法都在动态变化&#xff0c;可以解析某些&#xff08;不是全部&#xff09;。 …

JSqlParser

JSqlParser 关于SqlParser引言&#xff1a; Java 生态中较为流行的 SQL Parser 有以下几种&#xff1a; fdb-sql-parser 是 FoundationDB 在被 Apple 收购前开源的 SQL Parser&#xff08;不支持很复杂的SQL&#xff09;&#xff0c;目前已无人维护。jsqlparser 是基于 Java…

Sql解析转换之JSqlParse完整介绍

1、 jsqlparse介绍 JSqlParse是一款很精简的sql解析工具&#xff0c;它可以将常用的sql文本解析成具有层级结构的“语法树”&#xff0c;我们可以针对解析后的“树节点&#xff08;也即官网里说的有层次结构的java类&#xff09;”进行处理进而生成符合我们要求的sql形式。 官…