Mybatis Dynamic Query 2.0 入门
来源:互联网 发布:广州聚焦网络 编辑:程序博客网 时间:2024/09/21 06:17
对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")@EnableSwagger2public 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 方法。
@Testpublic 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
- Mybatis Dynamic Query 前言
- Mybatis Dynamic Query 框架整合
- dynamic query on sql
- Liferay Dynamic Query API
- liferay Dynamic Query 查询
- Dynamic Query System 基本SBT
- Dynamic Linq Query 简单API
- Dynamic Query Adapter Epicor E10
- Dynamic Linq Query 简单API
- MyBatis dynamic sql demo!!!
- Mybatis Dynamic SQL
- Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)
- [Liferay6.2]Liferay Dynamic Query API示例
- Dynamic Programming:303. Range Sum Query
- Dynamic入门指导
- mybatis query 对象 or 查询
- Hash算法冲突解决方法分析
- vs2010
- C语言文件操作函数大全(超详细)
- 回顾U-boot(一)
- ccf认证最大的矩形
- Mybatis Dynamic Query 2.0 入门
- [HDU
- C++11:用户定义字面量
- 移动端插件-快速生成tab插件(纯手写+亲测)
- 二阶积分系统L1自适应控制器设计
- 51Nod 1244 莫比乌斯函数之和
- 【Mybatis从0到1-005】mybatis开发DAO之原始开发方法
- java高并发开发一些注意点
- lua与C/C++互调函数方法