mybatis-dynamic-query 2.0.3 更新
前段時間一直忙專案,而且一直在用 typescript 寫動態查詢,結果一看 java 版本已經一年沒有更新了,感覺要加點東西了。
2.3 更新
更新了兩點:
- 支援選擇欄位查詢
- 支援鏈式呼叫在 DynamicQuery 類中
選擇欄位查詢
預設來說,我們會把所有的欄位全部返回,有些欄位我們不想返回,比如 password
下面我們來看個例子:
- 建立一個實體 Entity
@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; ... }
- 建立我們 Dao 繼承自 DynamicQueryMapper
public interface ProductDaoextends DynamicQueryMapper<Product>{ }
- 利用 addSelectField 方法來描述我們需要哪些欄位,這裡例子中,我們只需要:productName, price.
@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())); } }
- 我們同樣可以看一下 mybatis 控制檯輸出結果, 確實我們只選擇了 productName 和 price
==>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 了。
@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 是倒敘排列的。
==>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
結束
時隔一年已經在專案中一直使用,感覺還是蠻順手的,希望大家能支援一下。