当前位置: 首页 > news >正文

陇城科技网站建设成都cms建站

陇城科技网站建设,成都cms建站,网站建设个人网站,河南手机网站建设多少钱需求背景需要一个像mybatis plus 一样的基于lambda, 且面向对象的查询mongo数据的插件。在网上找了很久,没有发现有类似功能的插件。于是自己手写了一个,借助mongoTemplate屏蔽了底层查询语句的实现细节。在此基础上,实现了查询的统一封装。技…

需求背景

需要一个像mybatis plus 一样的基于lambda, 且面向对象的查询mongo数据的插件。在网上找了很久,没有发现有类似功能的插件。于是自己手写了一个,借助mongoTemplate屏蔽了底层查询语句的实现细节。在此基础上,实现了查询的统一封装。

技术难点

  1. 基于SerializedLambda对象获取查询的属性,例如下面是获取task的name;

MongoLambdaQuery.lambdaQuery(Task.class).is(Task::getName, taskCriteria.getName())
  1. 怎么传参这种Task::getName 函数引用

通过函数式接口SFunction来表示R实际类型:

Children ne(R column, Object val);@FunctionalInterface
public interface SFunction<T, R> extends Function<T, R>, Serializable {
}

然后通过maybeDo来判断搜索参数不为空才进行查询。这里DoSomething又是一个函数式接口,something.doIt()时才会执行具体columnToString操作,得到我们的属性。

  protected Children addCondition(boolean condition, R column, SqlKeyword keyWord, Object val, Object... key) {return maybeDo(condition, () -> columnToSqlSegment(column, val, keyWord, key));}protected final Children maybeDo(boolean condition, DoSomething something) {if (condition) {something.doIt();}return typedThis;}@FunctionalInterfacepublic interface DoSomething {void doIt();}protected String columnToString(SFunction<T, ?> column) {return LambdaUtils.getField(column);}

c. 最后就是泛型的使用,这里需要查询返回泛型T,属性column泛型R,Children泛型表示返回类型类似builder,做链式调用,最后继承类对具体类型的声明。

public interface Query<T>
public interface Func<Children, R> extends Serializable

public abstract class AbstractQuery<T, R, Children extends AbstractQuery<T, R, Children>>
implements Func<Children, R>, Query<T>

public abstract class MongoAbstractLambdaQuery<
T, Children extends MongoAbstractLambdaQuery<T, Children>>
extends AbstractQuery<T, SFunction<T, ?>, Children>

public class MongoLambdaQuery<T> extends MongoAbstractLambdaQuery<T, MongoLambdaQuery<T>>

项目地址:

https://github.com/DarMi7/mongo-lambda-query

使用demo

  1. 引入maven依赖文件

<dependency>
<groupId>io.github.darmi7</groupId>
<artifactId>mongo-lambda-query</artifactId>
<version>1.1.0</version>
</dependency>
  1. 开启插件注解,加上需要扫描mongo实体的包路径

@EnableMongoLambdaQuery
@EnableMongoRepositories(basePackages = "com.darmi.demo.repository.mongo")
public class Application
  1. 编写查询代码

@Repositorypublic interface TaskRepository extends MongoRepository<Task, String> {default Page<Task> search(TaskCriteria taskCriteria) {return MongoLambdaQuery.lambdaQuery(Task.class).is(Task::getName, taskCriteria.getName()).is(Task::getType, taskCriteria.getFuzzyName()).reg(Task::getName, taskCriteria.getName()).gt(Task::getPoints, taskCriteria.getPoints()).gt(Task::getCreated, taskCriteria.getBegin()).lt(Task::getCreated, taskCriteria.getEnd()).page(taskCriteria.getPagination());}}
http://www.yayakq.cn/news/974284/

相关文章:

  • 江苏建设人才无纸化考核网站东莞比较出名的网站建设公司
  • wordpress 制作网站公司做网站的
  • 教育手机网站开发网站正能量大全
  • 网站建设飠金手指科杰十五seo成创网络
  • 凡科建站怎么用网络营销产品概念的五个层次
  • 建设工程造价管理总站网站qq官方网站
  • 运城做网站方式方法全自动在线制作网页
  • 沪浙网站网站你的后台管理系统用什么做
  • 揭西网站建设怎么看一个网站用什么做的
  • 网站js下载网页界面设计分析案例
  • 个人做 网站2019做网站视频 上传到哪儿
  • 做画册可以参考哪些网站上海浦东网站建设
  • 网站快速建设视频不懂网站建设.怎么销售
  • 无锡网站建设兼职WordPress设置页数
  • 懒人图库网站源码乐云seo可视化网站建设
  • 建筑网站新闻写那些好互联网行业未来发展趋势
  • 网站仿站是啥将网站源码下载下来如何使用
  • 网站建设企业服务器衡水市做网站
  • 南通城乡住房建设厅网站首页郑州网站设计见效快
  • 开发一个网站模版建好网站是不是每年都要交钱
  • 盱眙网站建设公司wordpress默认主题
  • 青锐成长计划网站开发人员东昌网站建设费用
  • 怎样健建设一个有利于优化的网站二级域名免费注册网站
  • 网上做公司网站怎么做杭州公司注册多少钱
  • 苏州教育网站建设中国建设银行上海分行网站
  • 云建站模板织梦网站分享插件
  • 做的网站里面显示乱码怎么解决创建网站公司 徐州
  • 德州建设局网站网站建设自由容器是什么意思
  • 想要注册一个公司网站怎么做北京通州网站设计公司
  • 那家专门做特卖的网站什么内容能提高网站流量