Mybatis Dynamic Query 2.0 入门
对Mybatis Dynamic Query 没概念的同学可以传送到: http://www.cnblogs.com/wz2cool/p/7268428.html
简介
2.0 昨天打包好了,主要是整合了tk.mybatis.mapper 到项目中去,所以和1.x比起来主要多了一个通用mapper。
哈哈~ 简单的说,单表用通用mapper, 多表查询仍然用动态查询。
因为作者主要是使用springboot 这里讲一下Springboot 配法。有问题的话可以参照本章demo。
本章demo下载地址: https://github.com/wz2cool/mdq2.0test
配置步骤
- 添加依赖
<!-- 基本库 -->
<dependency>
<groupId>com.github.wz2cool</groupId>
<artifactId>mybatis-dynamic-query</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 主要注册通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.3</version>
</dependency>
<!-- mybatis 最新版本 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 如果有Spring boot web 自带jackson 这个可以不要,防止版本冲突 -->
<!-- <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>-->
<!-- spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
- 在applicaiton.properties 注册DynamicQueryMapper, (这里也可以注册自己写的mapper)。
mapper.mappers[0]=com.github.wz2cool.dynamic.mybatis.mapper.DynamicQueryMapper
- 在Application 类中设置扫描mapper包的路径
@SpringBootApplication
@MapperScan(basePackages = "com.github.wz2cool.mdqtest.mapper")
@EnableSwagger2
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.0 新特性
单表无XML
主要是tk.mybatis.mapper 已经实现了很多默认通用模板,所以我们无需再去写XML,DynamicQueryMapper 在tk.mybatis.mapper 基础上对筛选使用了我们自己的筛选器进行筛选。
实体类Product
@Table(name = "product")
public class Product {
@Id
@Column(name = "product_id")
private Integer productId;
@Column(name = "name")
private String productName;
private BigDecimal price;
private Integer categoryId;
// get/set...
}
对于mapper 我们只要继承一下DynamicQueryMapper 即可。
public interface ProductDao extends DynamicQueryMapper<Product> {
}
然后我们就可以看到通用方法已经可使用了

全程强类型编写
当我们使用最常用的筛选表述器FilterDescriptor/SortDescriptor 的时候,我们需要填写我们对哪个属性进行操作,以前是写一个String,现在我们可以使用表达式编写。
FilterDescriptor nameFilter = new FilterDescriptor(
User.class, User::getUsername,
FilterOperator.CONTAINS, "18");
添加自定义筛选
当FilterDescriptor 和 FilterGroupDescriptor 不能满足我们时候我们需要使用自定义筛选,比如H2数据库在做位运算的时候,需要调用Bitand 方法。
@Test
public void testBitand() throws Exception {
if ("h2".equalsIgnoreCase(active)) {
CustomFilterDescriptor bitFilter =
new CustomFilterDescriptor(FilterCondition.AND,
"Bitand(product_id, {0}) > {1}", 2, 0);
Map<String, Object> filterParams = MybatisQueryProvider.getWhereQueryParamMap(
Product.class, "whereExpression", bitFilter);
List<Product> products = northwindDao.getProductByDynamic(filterParams);
assertEquals(true, products.size() > 0);
} else {
CustomFilterDescriptor bitFilter =
new CustomFilterDescriptor(FilterCondition.AND,
"product_id & {0} > {1}", 2, 0);
Map<String, Object> filterParams = MybatisQueryProvider.getWhereQueryParamMap(
Product.class, "whereExpression", bitFilter);
List<Product> products = northwindDao.getProductByDynamic(filterParams);
assertEquals(true, products.size() > 0);
}
}
AS 枚举列
以前我们都是直接 SELECT * XXX 来读取数据,这样做有两个非常不好的地方
- 选择了所有的列,不是每个列都是我们需要的,增加传输时间。
- 当多表查询的时候,如果你两个表里面有列重名了,这样会有问题。
MybatisQueryProvider 帮助类中增加columsExpression占位。
Map<String, Object> params = MybatisQueryProvider.getQueryParamMap(dynamicQuery,
"whereExpression",
"sortExpression",
"columnsExpression");
return productViewDao.getProductViewByDynamicQuery(params);
在 xml 中的写法
<select id="getProductViewByDynamicQuery" resultType="com.github.wz2cool.mdqtest.model.entity.view.ProductView">
SELECT ${columnsExpression} FROM product LEFT JOIN category on product.category_id = category.category_id
<if test="whereExpression != null and whereExpression != ''">WHERE ${whereExpression}</if>
<if test="orderExpression != null and orderExpression != ''">ORDER BY ${orderExpression}</if>
</select>
输出的时候我们可以看到每个列都被AS 成为对应的属性列了
==> Preparing: SELECT product.product_id AS product_id, product.price AS price, category.description AS description, category.name AS category_name, 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.name = ?)
==> Parameters: 10(Integer), 20(Integer), Condiments(String)
<== Columns: PRODUCT_ID, PRICE, DESCRIPTION, CATEGORY_NAME, PRODUCT_NAME, CATEGORY_ID
<== Row: 3, 16.5000, test, Condiments, Northwind Traders Cajun Seasoning, 2
<== Row: 8, 17.4375, test, Condiments, Northwind Traders Walnuts, 2
<== Total: 2
json 序列化支持
我们筛选器现在已经支持json 序列化,这就意味着,我们查询可以通过接口完全动态化。当然你也可以把json 放入数据库,当做一个配置来用。
可以运行一下我们的demo,打开swagger: http://localhost:8080/swagger-ui.html
- 先去获取一下我们示例的json (GET /serialize/getGroupPriceFilters)

- 我们把的出来的json 调用 (POST /data/getProductsByDynamicQuery)

文章整合
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视图
结束
2.0 更新概括一下:
- 整合tk.mybatis.mapper, 并自定义 DynamicQueryMapper 通用mapper。
- 添加自定义筛选 CustomFilterDescriptor。
- AS 枚举列。
- json 序列化支持。
关注我 ##
最后大家可以关注我和 Mybatis-Dynamic-query项目 _
Follow @wz2cool Star Fork
Mybatis Dynamic Query 2.0 入门的更多相关文章
- Mybatis Dynamic Query 2.0.2
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- Mybatis Dynamic Query 1.0.2版本
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- 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'方法,可以便捷地满足基本的数据查询操作. 但是, ...
- Json.Net6.0入门学习试水篇
原文:Json.Net6.0入门学习试水篇 前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中 ...
- Mybatis-Plus3.0入门手册
Mybatis-Plus3.0入门手册 ref: https://blog.csdn.net/moshowgame/article/details/81008485 Mybatis-Plus简介 ...
- Mybatis系列(一)入门
Mybatis系列(一)入门 mybatis简介 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结 ...
随机推荐
- [leetcode-617-Merge Two Binary Trees]
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...
- C#基础:.NET环境下WebConfig的加密
在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...
- UML 解析
UML 解析 泛化 表示类与类之间的继承关系.接口与接口之间的继承关系: 实现 表示类对接口的实现 依赖 当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有"拥有关系&quo ...
- 底层码农的Stanford梦 --- 从SCPD开始 [转]
转载自知乎: https://zhuanlan.zhihu.com/p/25010074 一开始让我写这篇文章的时候,我是拒绝的.毕竟,我不是Stanford毕业的,出来写文章介绍Stanford,难 ...
- python编程快速上手之第7章实践项目参考答案
#!/usr/bin/env python3.5 #coding:utf-8 import re # 7.18.1 # 强口令检测 # 写一个函数,使用正则表达式,确保传入的口令字符串是强口令 # 长 ...
- Java Web使用Html5 FormData实现多文件上传
前一阵子,迭代一个线上的项目,其中有一个图片上传的功能,之前用的ajaxfileupload.js来实现上传的,不过由于ajaxfileupload.js,默认是单文件上传(虽然可以通过修改源码的方法 ...
- 安装wdcp linux一键安装包云系统客户端教程
首先把自己阿里云的磁盘格式化然后重启 自己下载一个PuTTY 打开后输入自己的Ip地址端口号默认是22 会跳出一个yes 跟no界面,点击yes 会进入一个类似cmd界面 直接输入root,然后会提示 ...
- AllPairs运用遇到的问题及解决办法分享
前些天用AllPairs自动生成了交互式测试用例,中间遇到的问题困扰了一天,最后解决了.现在分享下解决过程 首先,D\AllPairs是我的ALLPairs安装目录,C盘桌面test.txt是我写的测 ...
- UglifyJS-- 对你的js做了什么
也不是闲着没事去看压缩代码,但今天调试自己代码的时候发现有点意思.因为是自己写的,虽然压缩了,格式化之后还是很好辨认.当然作为min的首要准则不是可读性,而是精简.那么它会尽量的缩短代码,尽量的保持一 ...
- 初识RabbitMQ系列之一:简单介绍
一:RabbitMQ是什么? 众所周知,MQ是Message Queue(消息队列)的意思,RabbitMQ就是众多MQ框架其中的一款,开源实现了AMQP协议(官网:http://www.amqp. ...