Mybatis Dynamic Query 框架整合
项目地址:https://github.com/wz2cool/mybatis-dynamic-query
文档地址:https://wz2cool.gitbooks.io/mybatis-dynamic-query-zh-cn/content/
博客文章:https://wz2cool.github.io/tags/Mybatis-Dynamic-Query/
初入JAVA
因为工作关系,开始接触JAVA(但心中一直割舍不下我大.net)。一开始选择持久化框架的时候,同事选的是Mybatis,开始我还闹情绪,感觉应该选hibernate,因为以前用EntityFramework 感觉还不错。关键是入JAVA不久,算了就用Mybatis 吧,也算是误打误撞才有了这个动态查询框架。
Mybatis 震撼
如果说hibernate是全自动的,那么Mybatis 就是半自动。Mybatis 比 hibernate 更强的在于他对sql 的控制更加好,hibernate 这些ORM 生成的sql 在调优的时候比较麻烦,当然你们可以说使用hibernate 照样可以写sql,嗯是可以的,但是把一块 sql 写到了code 里面而且还是String 类型, 以后改个什么字段找半天(如果有不对,请大家指出)。
Mybatis 有个专门的 xml 文件放sql 语句,这个其实很不错,至少不用去code 里面找 sql。 其实 Mybatis 是提供了一些根据条件生成对应的sql 比如<if> <foreach> 标签。
动态查询框架初衷
在实际应用Mybatis 的时候,我们同样遇到了问题,就是xml 接口数量爆炸的情况,而且XML 代码量大了,也不是非常好维护,XML 也是一种没有强类型的语言。 嗯 这个就是我们的框架建立的最初目的。
灵感的爆发同样来自于我大.net, 其实你们如果用过RIA service 就知道 FilterDescriptor 哈哈,确实借鉴了一下 参考: https://msdn.microsoft.com/en-us/library/system.windows.controls.filterdescriptor(v=vs.91).aspx
框架解决了什么问题
- 不必写大量的代码在XML中,因为这些代码都是弱类型的。
- 筛选排序是被Java代码中维护,可以进行组合使用。
- 你的筛选排序是可以热更新的,在代码中想什么时候加就什么时候加。
- 你的筛选条件是可以被持久化的,可以作为配置保存下来。
框架基本组织
interface
一个实体的基本操作定义
@Mapper
public interface NorthwindDao {
List<Product> getProductByDynamic(Map<String, Object> params);
int insert(Map<String, Object> params);
int update(Map<String, Object> params);
int delete(Map<String, Object> params);
}
xml 基本格式
xml 中与之对应的实现
<!-- 增加 -->
<insert id="insert" parameterType="java.util.Map">
${insertExpression}
</insert>
<!-- 删除 -->
<delete id="delete" parameterType="java.util.Map">
${deleteExpression}
</delete>
<!-- 修改 -->
<update id="update" parameterType="java.util.Map">
${updateExpression}
</update>
<!-- 查询 -->
<select id="getProductByDynamic" parameterType="java.util.Map"
resultType="com.github.wz2cool.dynamic.mybatis.db.model.entity.table.Product">
SELECT * FROM product
<if test="whereExpression != null and whereExpression != ''">WHERE ${whereExpression}</if>
<if test="orderExpression != null and orderExpression != ''">ORDER BY ${orderExpression}</if>
</select>
参数Map里面是什么
这里用一张图来说明
- 蓝色背景里面都是我们的动态表达式,注意里面参数都是占位符(比如 #{id_placeholder}).
- 绿色背景都是我们占位符的与之对应的实际数据

调用
简单写一个查询的例子
@Test
public void testEqual() throws Exception {
FilterDescriptor idFilter =
new FilterDescriptor(FilterCondition.AND, "productID", FilterOperator.EQUAL, 2);
ParamExpression paramExpression = mybatisQueryProvider.getWhereExpression(ProductView.class, idFilter);
Map<String, Object> queryParams = new HashMap<>();
queryParams.putAll(paramExpression.getParamMap());
queryParams.put("whereExpression", paramExpression.getExpression());
ProductView productView =
northwindDao.getProductViewsByDynamic(queryParams).stream().findFirst().orElse(null);
assertEquals(Long.valueOf(2), productView.getProductID());
}
杂谈
- 在做这个框架也会去看别人写的Mybatis 框架,其中就有Mybatis-jpa,和博主交谈以后发现我这边少了 jdbcType 在insert和update中,果然和需要交流,当然这个会再1.0.2版本解决具体bug
- 在写文档的时候,有次推翻了原来的想法,坑啊,全部testCase 重写 T_T,坚持保持100%代码覆盖。
- 跨出开源第一步,代码、文档在一点点完善,虽然比不上大神的NB框架,至少第一步迈出去了。
- 希望大家多多关注,批评也可以,毕竟java 功底不深,欢迎指教。
文章整合
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项目 _
Follow @wz2cool Star Fork
Mybatis Dynamic Query 框架整合的更多相关文章
- 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 2.0.2
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- mybatis+spring+struts2框架整合
近期公司要开发新的项目,要用struts2+mybatis+spring框架,所以学习了下,来自己的博客发表下,希望能给大家带来帮助!下边我把我的myschool开发的源代码以及数据库贴出来! 开 ...
- Springmvc+mybatis+restful+bootstrap框架整合
框架整合: Springmvc + Mybatis + Shiro(权限) + REST(服务) + WebService(服务) + JMS(消息) + Lucene(搜搜引擎) + Quartz( ...
- 【企业级框架整合】Springmvc+mybatis+restful+bootstrap框架整合
1. 使用阿里巴巴Druid连接池(高效.功能强大.可扩展性好的数据库连接池.监控数据库访问性能.支持Common-Logging.Log4j和JdkLog,监控数据库访问)2. 提供高并发JMS消息 ...
- Spring,Mybatis,Springmvc框架整合项目(第一部分)
一.说在前面的话 本篇博文实现一个注册登录小项目,使用spring,mybatis,springmvc框架进行整合,我们创建的是一个maven工程,主要是方便jar包版本的管理.项目使用eclispe ...
- Mybatis Dynamic Query 简单筛选
在框架中,筛选描述类有两种(FilterDescriptor, FilterGroupDescriptor),这里我们主要举例来说明FilterDescriptor用法. FilterDescript ...
- 【Java】MyBatis与Spring框架整合(二)
本文讲解 Spring 注入映射器及事务功能的实现. 注入映射器实现 MyBatis 可以使用 SqlSession 的 getMapper ( Class<T> type ) 方法,根据 ...
随机推荐
- c# networkcomms 3.0实现模拟登陆总结
最近项目需要做一个客户查询状态系统,当前上位机缺少服务功能,于是找到了networkcomms 开源框架,作为项目使用. 最新版networkcomms 下载地址:https://github.com ...
- 使用EF连接Postgresql
环境: VS2017 Community Windows 10 Postgresql 9.6 安装Postgresql: https://www.postgresql.org/download/ 1. ...
- Vue2 全家桶仿 微信App 项目,支持多人在线聊天和机器人聊天
前言 这个项目是利用工作之余写的一个模仿微信app的单页面应用,整个项目包含27个页面,涉及实时群聊,机器人聊天,同学录,朋友圈等等,后续页面还是开发中.写这个项目主要目的是练习和熟悉vue和vuex ...
- python制作pdf电子书
python制作pdf电子书 准备 制作电子书使用的是python的pdfkit这个库,pdfkit是 wkhtmltopdf 的Python封装包,因此在安装这个之前要安装wkhtmltopdf 安 ...
- jmeter3.2版本完美实现Load Test报表
今天下载了最新版的apache tomcat jmeter 3.2,需要jdk1.8以上的版本. 用非GUI模式运行压力测试后,出现的报表太完美了. 将jmx脚本放在就jmeter_home下的Scr ...
- 搭建带热更新功能的本地开发node server
引言 使用webpack有一段时间了,对其中的热更新的大概理解是:对某个模块做了修改,页面只做局部更新而不需要刷新整个页面来进行更新.这样就能节省因为整个页面刷新所产生开销的时间,模块热加载加快了开发 ...
- 解决Socket粘包问题——C#代码
解决Socket粘包问题——C#代码 前天晚上,曾经的一个同事问我socket发送消息如果太频繁接收方就会有消息重叠,因为当时在外面,没有多加思考 第一反应还以为是多线程导致的数据不同步导致的,让他加 ...
- net::ERR_CONNCTION_ABORTED与http post request header is too large 错误
开始浏览器报(net::ERR_CONNCTION_ABORTED)然后就一直找这个错误是怎么引起的,找了一圈也没有找到答案. 后来看了一下后台发出后台错http post request heade ...
- 关于引入多个jquery冲突的问题(附一个很好用的validate前端验证框架及使用方法)
废话不多说,进入正题: 如果一个jsp中想要使用两个不同版本的jquery怎么办呢?客官往下看: <script src="${ctxStatic}/jquery/jquery-1.8 ...
- java面向对象浅析
1.(了解) 面向对象 vs 面向过程 例子:人开门:把大象装冰箱 2.面向对象的编程关注于类的设计!1)一个项目或工程,不管多庞大,一定是有一个一个类构成的.2)类是抽象的,好比是制造汽车的图纸. ...