Mybatis Dynamic Query 2.0.2
项目地址:https://github.com/wz2cool/mybatis-dynamic-query
文档地址:https://wz2cool.gitbooks.io/mybatis-dynamic-query-zh-cn/content/
杂谈
不知道有多少人在用MDQ(Mybatis Dynamic Query),反正我一直是在我们公司自己项目里用的,总之是不会坑大家的啊。还有毕竟作者也是入java坑不久,欢迎java大神前来指导。
面对质疑
当然有人一开始真心接受不了我这套,无非就几点:
- 问题1:来个新人还要学习MDQ,只理解Mybatis上手要容易的多。
反驳:MDQ没有产生一套新的东西,而是基于Mybatis的一个扩展,理解MDQ对Mybatis更加有帮助。 - 问题2:我直接在mybatis里面写sql感觉写起来比较快。
反驳:一开始你是写起来快,最开始你只写几个查询,随着业务扩展,你要写的筛选和排序会越来越多,更可怕的事,你全部写在xml中,想想你以后要维护一个弱类型的东西... - 问题3:你写的东西感觉不靠谱。
反驳:大神写的同样有bug,好的代码需要反复重构,并且保持良好的单元测试,这个是不变的真理,有问题可以,大家讨论一下解决即可。
2.2 更新
更新了三点:
- 原来是有自定义筛选的,现在添加了自定义排序。
- 设计MDQ的目的就是为了可维护性,所以这次添加了获取查询列,即[tableName].[columnName] 这种形式。
- 链式调用,等下看例子就明白了。
查询列
这个查询列大家可能有点云里雾里,列就叫列,为什么叫查询列。其实MDQ工作的时候对数据库查询是[tableName].[columnName], 这样做有个好处就是当我们join表的时候,我们可以指定这个列是哪里来的,保证查询的正确性。
当然你这个拼接工作是由MDQ完成的,我们只需要在@Column 这个注解设计 tableOrAlias 和name 两个属性即可。当然为什么要这个查询列,我在下面的自定义排序中说明。
下面我们来看个例子,还是用我们经典的ProductView。
public class ProductView {
@Column(name = "product_id", table = "product")
private Long productID;
@Column(name = "product_name", table = "product")
private String productName;
@Column(name = "price", table = "product")
private BigDecimal price;
@Column(name = "category_id", table = "category")
private Long categoryID;
@Column(name = "category_name", table = "category")
private String categoryName;
@Column(name = "description", table = "category")
private String description;
...
}
@Test
public void testGetQueryColumn() throws Exception {
String productIdColumn = MybatisQueryProvider.getQueryColumn(
ProductView.class, productView -> productView.getProductID());
// 这里我们就可以看到期望的输出结果就是 [tableName].[columnName]
assertEquals("product.product_id", productIdColumn);
}
自定义筛选
其实和自定义筛选类似,就是我们可以hardcode 一小段我们自己的sql(虽然觉得不是很好)。
当然下面例子也会使用到查询列。
现在我们有个需求,我们需要把ProductID是2的产品放到第一个,常规的升序降序都不能满足我们,我们该怎么办呢,恩 我们重新自定义一下排序权重即可。
@Test
public void testCustomSort() throws Exception {
String idQueryColumn = MybatisQueryProvider.getQueryColumn(ProductView.class, ProductView::getProductID);
// NOTE: queryColumn cannot be parameter.
// 这里注意:列不能当做参数,否则会报错,所以我们字符串拼接出来。
String customSortExpression =
String.format("CASE %s WHEN {0} THEN {1} ELSE product.product_id END DESC", idQueryColumn);
CustomSortDescriptor id2TopSort = new CustomSortDescriptor();
id2TopSort.setExpression(customSortExpression);
// 当id是2的时候,我们权重直接给int 最大值
id2TopSort.setParams(2, Integer.MAX_VALUE);
Map<String, Object> queryParam =
MybatisQueryProvider.createInstance(ProductView.class)
.addSorts("orderExpression", id2TopSort)
.toQueryParam();
List<ProductView> productList = northwindDao.getProductViewsByDynamic(queryParam);
assertEquals(Long.valueOf(2), productList.get(0).getProductID());
}
我们看一下输出结果,2的产品排序到了最上面去了。
==> Preparing: SELECT * FROM product LEFT JOIN category ON product.category_id = category.category_id ORDER BY CASE product.product_id WHEN ? THEN ? ELSE product.product_id END DESC
==> Parameters: 2(Integer), 2147483647(Integer)
<== Columns: PRODUCT_ID, CATEGORY_ID, PRODUCT_NAME, PRICE, CATEGORY_ID, CATEGORY_NAME, DESCRIPTION
<== Row: 2, 2, Northwind Traders Syrup, 7.5000, 2, Condiments, test
<== Row: 4, 3, Northwind Traders Olive Oil, 16.5000, 3, Oil, test
<== Row: 3, 2, Northwind Traders Cajun Seasoning, 16.5000, 2, Condiments, test
<== Row: 1, 1, Northwind Traders Chai, 18.0000, 1, Beverages, test
<== Total: 4
链式调用
这个应该是我在哪本java 文章看过,反正感觉不错啊。
以前的调用我们非要组织一个DynamicQuery类,然后调用一个静态方法生成一个参数Map,有了链式调用我们写代码就方便了很多。
看我们一个步骤,创建帮助类-》添加筛选-》添加排序-》转化成参数。
@Test
public void testMultiTablesFilter() throws Exception {
FilterDescriptor priceFilter1 =
new FilterDescriptor(ProductView.class, ProductView::getPrice,
FilterOperator.GREATER_THAN_OR_EQUAL, 6);
FilterDescriptor priceFilter2 =
new FilterDescriptor(ProductView.class, ProductView::getPrice,
FilterOperator.LESS_THAN, 10);
FilterDescriptor categoryNameFilter =
new FilterDescriptor(ProductView.class, ProductView::getCategoryName,
FilterOperator.START_WITH, "Co");
SortDescriptor idDescSort =
new SortDescriptor(ProductView.class, ProductView::getProductID, SortDirection.DESC);
Map<String, Object> params =
// NOTE: we recommend you to set "columnsExpressionPlaceholder"
// in case of duplicated column name in two tables.
// 这里你也可以不给列的站位,但是推荐使用,防止两个表有重复的名字
MybatisQueryProvider
.createInstance(ProductView.class, "columnsExpression")
.addFilters("whereExpression",
priceFilter1, priceFilter2, categoryNameFilter)
.addSorts("orderExpression", idDescSort)
.toQueryParam();
List<ProductView> result = northwindDao.getProductViewsByDynamic(params);
assertEquals(true, result.size() > 0);
}
看一下输出结果
==> Preparing: SELECT product.product_id AS product_id, product.price AS price, category.description AS description, category.category_name AS category_name, product.product_name AS product_name, category.category_id AS category_id FROM product LEFT JOIN category ON product.category_id = category.category_id WHERE (product.price >= ? AND product.price < ? AND category.category_name LIKE ?) ORDER BY product.product_id DESC
==> Parameters: 6(Integer), 10(Integer), Co%(String)
<== Columns: PRODUCT_ID, PRICE, DESCRIPTION, CATEGORY_NAME, PRODUCT_NAME, CATEGORY_ID
<== Row: 2, 7.5000, test, Condiments, Northwind Traders Syrup, 2
<== Total: 1
结束
利用十一的时间更行了2.0.2,欢迎大家节后回来使用。
关注我 ##
最后大家可以关注我和 Mybatis-Dynamic-query项目 _
Follow @wz2cool Star Fork
文章整合
Mybatis Dynamic Query 简单筛选
Mybatis Dynamic Query 组筛选
Mybatis Dynamic Query 排序
Mybatis Dynamic Query 筛选+排序
Mybatis Dynamic Query 插入
Mybatis Dynamic Query 更新
Mybatis Dynamic Query 删除
Mybatis Dynamic Query 属性表达式
Mybatis Dynamic Query join视图
Mybatis Dynamic Query 2.0 入门
Mybatis Dynamic Query 2.0.2的更多相关文章
- Mybatis Dynamic Query 1.0.2版本
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- Mybatis Dynamic Query 2.0 入门
简介 2.0 昨天打包好了,主要是整合了tk.mybatis.mapper 到项目中去,所以和1.x比起来主要多了一个通用mapper.因为作者主要是使用springboot 这里讲一下Springb ...
- Mybatis Dynamic Query 框架整合
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- Mybatis Dynamic Query 简单筛选
在框架中,筛选描述类有两种(FilterDescriptor, FilterGroupDescriptor),这里我们主要举例来说明FilterDescriptor用法. FilterDescript ...
- Mybatis Dynamic Query 更新
文章目录 1. 简介 2. 准备工作 3. 开始更新 3.1. update 3.2. update Null 4. 结束 5. 关注@我 项目地址:https://github.com/wz2coo ...
- [Liferay6.2]Liferay Dynamic Query API示例
介绍 Liferay提供了几种方法定义复杂的查询用来检索数据库中的数据. 通常情况下,在每个service Entity中,通过定义一些'finder'方法,可以便捷地满足基本的数据查询操作. 但是, ...
- Error:dijit.tree.TreeStoreModel:root query returned 0 items
1.错误描述 error loading root: Tree.js(第341行) Error:dijit.tre ...
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0'
七月 05, 2018 10:26:54 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRul ...
- query.setFirstResult(0),query.setMaxResults(4)
query.setFirstResult(0),query.setMaxResults(1);相当于MySQL中的limit 0, 1; String hql = "FROM Forum f ...
随机推荐
- Java基础语法(一)---关键字、常量、变量、运算符
一.关键字 定义:被Java赋予了特殊含义的单词. 特点:体现上都是英文小写. 1. 用于定义数据类型的关键字 基本数据类型: 整数类型:byte short int long 浮点类型:f ...
- python进阶学习(三)
本节通过SQLite了解数据库操作 ------------------------- 数据库支持 使用简单的纯文本只能实现有退限的功能,所需要引入数据库,完成更强大的功能,本节使用的简单数据库SQL ...
- JVM(一) OpenJDK1.8源码在Ubuntu16.04下的编译
笔者最近在学习周志明老师编写的<深入理解Java虚拟机>一书,书中第一章的实战部分就是"自己编译JDK",不过书中提到的是OpenJDK 7的编译.由于现在Java开发 ...
- macaca web(4)
米西米西滴,吃过中午饭来一篇,话说,上回书说道macaca 测试web(3),参数驱动来搞,那么有小伙本又来给雷子来需求, 登录模块能不能给我给重新封装一下吗, 我说干嘛封装,现在不挺好,于是乎,接着 ...
- 使用nginx实现纯前端跨越
你是否厌倦了老是依赖后台去处理跨域,把握不了主动权 你是否想模仿某个app倒腾一个demo,却困于接口无法跨域 那么很幸运,接下来我将现实不依赖任何后台,随心所欲的想访问哪个域名就访问哪个! 下载ng ...
- 基于NIOS-II的示波器:PART1 按键&显示屏驱动&界面
NIOS II 相关资料以及基础入门 <NiosII的奇幻漂流> <Nios II那些事儿> 本文所有的硬件基础以及工程参考来自魏坤示波仪,重新实现驱动并重构工程. 基于NIO ...
- 详解 mpls vpn 的实现
MPLS VPN的实现 一.实验目的 该实验通过MPLS VPN的数据配置,使学生掌握路由器相关接口的IP地址设置.路由协议的配置以及MPLS VPN的完整的创建过程, 从而加深对IP网络的IP编址. ...
- 201521123091 《Java程序设计》第14周学习总结
Java 第十四周总结 第十四周的作业. 目录 1.本章学习总结 2.Java Q&A 3.码云上代码提交记录及PTA实验总结 4.课后阅读 1.本章学习总结 以你喜欢的方式(思维导图或其他) ...
- Java学习2——HelloWorld(编写第一个java程序)
编写 在自己的工作文件目录下(如上一篇中配置的classpath路径)创建HelloWorld.java文件,编写如下代码,并保存 public class HelloWorld { public s ...
- 201521123037 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. java异常继承架构 2. 书面作业 本次PTA作业题集异常 1. 常用异常 题目5-1 1.1 截图你的提交结果( ...