文章目录
  1. 1. 杂谈
  2. 2. 2.3 更新
    1. 2.1. 选择字段查询
    2. 2.2. 链式调用
  3. 3. 结束
  4. 4. 关注@我 
  5. 5. 文章整合

项目地址:https://github.com/wz2cool/mybatis-dynamic-query
文档地址:https://wz2cool.gitbooks.io/mybatis-dynamic-query-zh-cn/content/

杂谈

前段时间一直忙项目,而且一直在用 typescript 写动态查询,结果一看 java 版本已经一年没有更新了,感觉要加点东西了。

2.3 更新

更新了两点:

  1. 支持选择字段查询
  2. 支持链式调用在 DynamicQuery 类中

选择字段查询

默认来说,我们会把所有的字段全部返回,有些字段我们不想返回,比如 password

下面我们来看个例子:

  1. 创建一个实体 Entity
1
2
3
4
5
6
7
8
9
10
@Table(name = "product")
public class Product {
@Column(name = "product_id", insertable = false, updatable = false)
private Integer productID;
private String productName;
private BigDecimal price;
private Integer categoryID;

...
}
  1. 创建我们 Dao 继承自 DynamicQueryMapper
1
2
public interface ProductDao extends DynamicQueryMapper<Product> {
}
  1. 利用 addSelectField 方法来描述我们需要哪些字段,这里例子中,我们只需要:productName, price.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void testSelectFields() {
DynamicQuery<Product> dynamicQuery = DynamicQuery.createQuery(Product.class)
.addSelectField(Product::getProductName)
.addSelectField(Product::getPrice);

List<Product> products = PageHelper.startPage(0, 3, false)
.doSelectPage(() -> productDao.selectByDynamicQuery(dynamicQuery));

for (Product p : products) {
// categoryID ignore to select
assertEquals(null, p.getCategoryID());
assertEquals(true, StringUtils.isNotBlank(p.getProductName()));
}
}
  1. 我们同样可以看一下 mybatis 控制台输出结果, 确实我们只选择了 productName 和 price
1
2
3
4
5
6
7
==>  Preparing: SELECT price AS price, product_name AS product_name FROM product LIMIT 3
==> Parameters:
<== Columns: PRICE, PRODUCT_NAME
<== Row: 18.0000, Northwind Traders Chai
<== Row: 7.5000, Northwind Traders Syrup
<== Row: 16.5000, Northwind Traders Cajun Seasoning
<== Total: 3

链式调用

为了让代码写的比较舒服,不用再手动 new FilterDescritpor 了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Resource
private ProductDao productDao;

@Test
public void testLinkOperation() {
DynamicQuery<Product> dynamicQuery = DynamicQuery.createQuery(Product.class)
.addSelectField(Product::getProductID)
.addSelectField(Product::getProductName)
.addSelectField(Product::getPrice)
.addFilterDescriptor(Product::getPrice, FilterOperator.GREATER_THAN, 16)
.addSortDescriptor(Product::getPrice, SortDirection.DESC)
.addSortDescriptor(Product::getProductID, SortDirection.DESC);

List<Product> products = PageHelper.startPage(0, 100, false)
.doSelectPage(() -> productDao.selectByDynamicQuery(dynamicQuery));

for (Product p : products) {
// categoryID ignore to select
assertEquals(null, p.getCategoryID());
assertEquals(true, StringUtils.isNotBlank(p.getProductName()));
// price > 16
assertEquals(1, p.getPrice().compareTo(BigDecimal.valueOf(16)));
}
}

看一下输出结果和用 new FilterDescriptor,new SortDesciptor 效果是一样的, 并且在价格一样的时候,ID 是倒叙排列的。

1
2
3
4
5
6
7
==>  Preparing: SELECT product_id AS product_id, price AS price, product_name AS product_name FROM product WHERE (price > ?) ORDER BY price DESC, product_id DESC LIMIT 100
==> Parameters: 16(Integer)
<== Columns: PRODUCT_ID, PRICE, PRODUCT_NAME
<== Row: 1, 18.0000, Northwind Traders Chai
<== Row: 4, 16.5000, Northwind Traders Olive Oil
<== Row: 3, 16.5000, Northwind Traders Cajun Seasoning
<== Total: 3

结束

时隔一年已经在项目中一直使用,感觉还是蛮顺手的,希望大家能支持一下。

关注@我 

最后大家可以关注我和 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 入门

文章目录
  1. 1. 杂谈
  2. 2. 2.3 更新
    1. 2.1. 选择字段查询
    2. 2.2. 链式调用
  3. 3. 结束
  4. 4. 关注@我 
  5. 5. 文章整合