项目地址: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

框架解决了什么问题

  1. 不必写大量的代码在XML中,因为这些代码都是弱类型的。
  2. 筛选排序是被Java代码中维护,可以进行组合使用。
  3. 你的筛选排序是可以热更新的,在代码中想什么时候加就什么时候加。
  4. 你的筛选条件是可以被持久化的,可以作为配置保存下来。

框架基本组织

interface

一个实体的基本操作定义

  1. @Mapper
  2. public interface NorthwindDao {
  3. List<Product> getProductByDynamic(Map<String, Object> params);
  4. int insert(Map<String, Object> params);
  5. int update(Map<String, Object> params);
  6. int delete(Map<String, Object> params);
  7. }

xml 基本格式

xml 中与之对应的实现

  1. <!-- 增加 -->
  2. <insert id="insert" parameterType="java.util.Map">
  3. ${insertExpression}
  4. </insert>
  5. <!-- 删除 -->
  6. <delete id="delete" parameterType="java.util.Map">
  7. ${deleteExpression}
  8. </delete>
  9. <!-- 修改 -->
  10. <update id="update" parameterType="java.util.Map">
  11. ${updateExpression}
  12. </update>
  13. <!-- 查询 -->
  14. <select id="getProductByDynamic" parameterType="java.util.Map"
  15. resultType="com.github.wz2cool.dynamic.mybatis.db.model.entity.table.Product">
  16. SELECT * FROM product
  17. <if test="whereExpression != null and whereExpression != ''">WHERE ${whereExpression}</if>
  18. <if test="orderExpression != null and orderExpression != ''">ORDER BY ${orderExpression}</if>
  19. </select>

参数Map里面是什么

这里用一张图来说明

  1. 蓝色背景里面都是我们的动态表达式,注意里面参数都是占位符(比如 #{id_placeholder}).
  2. 绿色背景都是我们占位符的与之对应的实际数据

调用

简单写一个查询的例子

  1. @Test
  2. public void testEqual() throws Exception {
  3. FilterDescriptor idFilter =
  4. new FilterDescriptor(FilterCondition.AND, "productID", FilterOperator.EQUAL, 2);
  5. ParamExpression paramExpression = mybatisQueryProvider.getWhereExpression(ProductView.class, idFilter);
  6. Map<String, Object> queryParams = new HashMap<>();
  7. queryParams.putAll(paramExpression.getParamMap());
  8. queryParams.put("whereExpression", paramExpression.getExpression());
  9. ProductView productView =
  10. northwindDao.getProductViewsByDynamic(queryParams).stream().findFirst().orElse(null);
  11. assertEquals(Long.valueOf(2), productView.getProductID());
  12. }

杂谈

  1. 在做这个框架也会去看别人写的Mybatis 框架,其中就有Mybatis-jpa,和博主交谈以后发现我这边少了 jdbcType 在insert和update中,果然和需要交流,当然这个会再1.0.2版本解决具体bug
  2. 在写文档的时候,有次推翻了原来的想法,坑啊,全部testCase 重写 T_T,坚持保持100%代码覆盖。
  3. 跨出开源第一步,代码、文档在一点点完善,虽然比不上大神的NB框架,至少第一步迈出去了。
  4. 希望大家多多关注,批评也可以,毕竟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 框架整合的更多相关文章

  1. Mybatis Dynamic Query 1.0.2版本

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

  2. Mybatis Dynamic Query 2.0 入门

    简介 2.0 昨天打包好了,主要是整合了tk.mybatis.mapper 到项目中去,所以和1.x比起来主要多了一个通用mapper.因为作者主要是使用springboot 这里讲一下Springb ...

  3. Mybatis Dynamic Query 2.0.2

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

  4. mybatis+spring+struts2框架整合

     近期公司要开发新的项目,要用struts2+mybatis+spring框架,所以学习了下,来自己的博客发表下,希望能给大家带来帮助!下边我把我的myschool开发的源代码以及数据库贴出来!  开 ...

  5. Springmvc+mybatis+restful+bootstrap框架整合

    框架整合: Springmvc + Mybatis + Shiro(权限) + REST(服务) + WebService(服务) + JMS(消息) + Lucene(搜搜引擎) + Quartz( ...

  6. 【企业级框架整合】Springmvc+mybatis+restful+bootstrap框架整合

    1. 使用阿里巴巴Druid连接池(高效.功能强大.可扩展性好的数据库连接池.监控数据库访问性能.支持Common-Logging.Log4j和JdkLog,监控数据库访问)2. 提供高并发JMS消息 ...

  7. Spring,Mybatis,Springmvc框架整合项目(第一部分)

    一.说在前面的话 本篇博文实现一个注册登录小项目,使用spring,mybatis,springmvc框架进行整合,我们创建的是一个maven工程,主要是方便jar包版本的管理.项目使用eclispe ...

  8. Mybatis Dynamic Query 简单筛选

    在框架中,筛选描述类有两种(FilterDescriptor, FilterGroupDescriptor),这里我们主要举例来说明FilterDescriptor用法. FilterDescript ...

  9. 【Java】MyBatis与Spring框架整合(二)

    本文讲解 Spring 注入映射器及事务功能的实现. 注入映射器实现 MyBatis 可以使用 SqlSession 的 getMapper ( Class<T> type ) 方法,根据 ...

随机推荐

  1. asp.net core中负载均衡场景下http重定向https的问题

    上周欣喜地发现,微软官方终于针对 asp.net core 在使用负载均衡的情况下从 http 强制重定向至 https 的问题提供了解决方法. app.UseForwardedHeaders(new ...

  2. 写代码中遇到的问题(php接收不到传过来的json数据,php使用utf8的用法)

    今天写代码用python处理完数据,传给php服务器后,发现接收不到数据,因为是跨域,所以加了消息头:header('Access-Control-Allow-Origin:*');但是并没有什么卵用 ...

  3. angularJS loading 载入画面

    在请求网络的时候,显示loading画面 1. 使用http的interceptor,截断处理所有的http请求和响应,以及错误.在request的时候设置$rootScope.loading=Tru ...

  4. Python 基础 (单、双引号区别) 不断补充

    最近开始学习Python ,一些小细节的东西不是很理解,所以就记录一下,方便自己以后查看. 我的Python环境: Mac pro 10.12.3,Python3.5 ,Pycharm 多句题外话:公 ...

  5. C#中的Dictionary的使用

    在工作中有时候会用到Dictionary,由于自己之前没用过,参考了一下前人和先辈的实践,仿照着写了一个Test,第一次用还不是很熟练,要多实践练习才能用的得心应手,写代码重在敲键盘,以此为诫.(主要 ...

  6. oracle表空间增长异常或表空间占用过高问题分析

    本人对oracle调优还处在不断学习状态,这个问题是之前处理的项目上遇到过的,顺利解决了,分享下此类问题的处理思路,不足之处,还请指正. 项目上反馈说业务表空间增长越来越快,上次新增的30G数据文件, ...

  7. linux 权限字母含义

    查看某一文件夹下所有文件夹的权限情况:ls -l分别是:所有者(user)-所有者(user)-其他人(other)r 表示文件可以被读(read)w 表示文件可以被写(write)x 表示文件可以被 ...

  8. 第一章(认识jQuery)

    1.3.2编写简单的jQuery代码 ①$是jQuery的简写 ②$("#foo") = $("#foo") ③$.ajax  =  jQuery.ajax ④ ...

  9. Oracle数据库中的重要对象

    数据库中的重要对象:表.视图.序列.函数.存储过程.索引.同义词1.表:用PL/SQL Developer 软件打开 Scott的DEPT表查看SQL,可以看见DEPT表创建的脚本-- Create ...

  10. 【原创】无线破解Aircrack-ng套件详解--airmon-ng与airodump-ng

    一:Aircrack-ng详解 1.1 Aircrack-ng概述 Aircrack-ng是一款用于破解无线802.11WEP及WPA-PSK加密的工具,该工具在2005年11月之前名字是Aircra ...