Mybatis重置Criteria的正确姿势分享

目录
  • Mybatis重置Criteria
    • 发现问题原因如下
    • 我们想重置查询条件怎么办?
    • 得出一个结论
  • Mybatis的Criteria用法总结

Mybatis重置Criteria

开发中遇到Mybatis生成的Example通过调用createCriteria()来创建Criteria并设置查询条件的情况。

但是需要换一个查询条件再次查询时发现再次调用该方法“无效果"。

看到大多数的做法是通过new一个新的Example来查询,考虑到可能不是最好的或者最合理的做法,对此进行了简单研究。

发现问题原因如下

我们看下生成的Exmaple的源码:

 public Criteria createCriteria() {
        Criteria criteria = createCriteriaInternal();
        if (oredCriteria.size() == 0) {
            oredCriteria.add(criteria);
        }
        return criteria;
    }

    protected Criteria createCriteriaInternal() {
        Criteria criteria = new Criteria();
        return criteria;
    }

发现调用createCriteria(),虽然每次创建一个新的Criteria对象但是只有

protected List<Criteria> oredCriteria

这个列表长度为0时才会添加,进去。

查看映射的xml文件时发现,查询条件正是取自于oredCriteria。

只有调用or时才添加到该集合中

 public void or(Criteria criteria) {
        oredCriteria.add(criteria);
    }

我们想重置查询条件怎么办?

两种方法:

一种是只清空Example的oredCriteria属性。

那么可以通过Example类中的getOredCriteria() 函数获取该列表后通过clear方法清空。

public List<Criteria> getOredCriteria() {
        return oredCriteria;
    }

另外一种更彻底的方法,直接调用Example的clear() 方法,将exmple对象“重置”为初始状态。

  public void clear() {
        oredCriteria.clear();
        orderByClause = null;
        distinct = false;
        pageParam = null;
    }
 

得出一个结论

遇到问题,多看源码,多看官方文档。

Mybatis的Criteria用法总结

用一对多内敛查询的时候,有的老铁提出left join in 但是我和同事商讨结果是用代码写处各种list然后stream存到数据库中,这样一来把计算压力从数据库存入服务器,当并发量高了,这样做的好处就体现在性能方面了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis createcriteria和or的区别说明

    createcriteria和or的区别 mybatis generator插件生成的example中,有createcriteria和or方法,他们有什么区别呢? 通过源码,能很清楚的看出差别 createcriteria,当没有规则时,则加入到现有规则,但有规则时,不再加入到现有规则,只是返回创建的规则 public Criteria createCriteria() { Criteria criteria = createCriteriaInternal(); if (oredCriter

  • Mybatis中的Criteria条件查询方式

    Mybatis Criteria条件查询 Criterion Criterion是最基本,最底层的Where条件,用于字段级的筛选. Criteria Criteria包含一个Cretiron的集合,每一个Criteria对象内包含的Cretiron之间是由AND连接的,是逻辑与的关系. 其它 Example类的distinct字段用于指定DISTINCT查询. orderByClause字段用于指定ORDER BY条件,这个条件没有构造方法,直接通过传递字符串值指定. 代码示例 import

  • Mybatis Criteria使用and和or进行联合条件查询的操作方法

    之前用Mybatis框架反向的实体,还有实体里面的Example,之前只是知道Example里面放的是条件查询的方法,可以一直不知道怎么用,到今天才开始知道怎么简单的用.在我们前台查询的时候会有许多的条件传过来:先看个例子: public List<Contact> searchByExample(Contact contact) { System.out.println("searchByExampleContact"); ContactExample example =

  • Mybatis重置Criteria的正确姿势分享

    目录 Mybatis重置Criteria 发现问题原因如下 我们想重置查询条件怎么办? 得出一个结论 Mybatis的Criteria用法总结 Mybatis重置Criteria 开发中遇到Mybatis生成的Example通过调用createCriteria()来创建Criteria并设置查询条件的情况. 但是需要换一个查询条件再次查询时发现再次调用该方法"无效果". 看到大多数的做法是通过new一个新的Example来查询,考虑到可能不是最好的或者最合理的做法,对此进行了简单研究.

  • 调用java.lang.Runtime.exec的正确姿势分享

    目录 调用java.lang.Runtime.exec的正确姿势 两种方法 小结一下 Java Runtime.exec()注意事项 1.Runtime.exec() 有四种调用方法 2.得到程序执行返回值, 0为success 3.得到程序执行的结果或错误信息 4.Runtime.exec() 调用java.lang.Runtime.exec的正确姿势 今天写一个用到编译的程序,遇到了问题. 在调用 runtime.exec("javac HelloWorld.java"); 运行完

  • MySQL8.0修改密码的正确姿势分享

    目录 前言 mysql5.7.9之后取消了password函数,authentication_string=password("123456")会报错 正确更改密码的方式 总结 前言 mysql 更新完密码,总是拒绝连接.登录失败?MySQL8.0 不能通过直接修改 mysql.user 表来更改密码.正确更改密码的方式备注: 清空root密码 MySQL8.0 不能通过直接修改 mysql.user 表来更改密码. 因为authentication_string字段下只能是MySQL

  • Java线程状态及切换、关闭线程的正确姿势分享

    前言 在讲线程之前有必要讨论一下进程的定义:进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位.进程实体由程序段, 数据段 PCB(进程控制块)组成.线程又是什么?线程可以看做轻量级进程,线程是进程的执行单元,是进程调度的基本单位 本文将详细介绍关于Java线程状态及切换.关闭线程的相关内容,下面话不多说了,来一起看看详细的介绍吧 1.线程状态及切换 Java中的线程有六种状态,使用线程Thread内的枚举类来实现,如下,我对每个状态都进行了一定的解释. public

  • 在日志中记录Java异常信息的正确姿势分享

    目录 日志中记录Java异常信息 遇到的问题 原因分析 正确的做法 java异常在控制台和日志里面的打印记录 1.e.printStackTrace()打印在哪里 2.e.printStackTrace()打印的内容是什么 3.如果将e.printStackTrace()的信息打印在日志里应该怎么做呢? 日志中记录Java异常信息 遇到的问题 今天遇到一个线上的BUG,在执行表单提交时失败,但是从程序日志中看不到任何异常信息. 在Review源代码时发现,当catch到异常时只是输出了e.get

  • mybatis3.4.6 批量更新 foreach 遍历map 的正确姿势详解

    好久没编码了!最近开始编码遇到一个问题 !一个批量修改的问题,就是mybatis foreach 的使用. 当时使用的场景 ,前端 传逗号拼接的字符串id, 修改id对应数据的数据顺序 ,顺序 就是id 的顺序. 就是一个条件(单个id值) 修改一个值(传入的id的顺序) , 1. 把条件作为Map 的key 修改值是value,用map入参 2.用List<Object> 或者数组 ,把条件和值封装成对象放进list集合或者array数组 3.代码使用for循环调用mapper方法 穿两个参

  • Android屏幕锁屏弹窗的正确姿势DEMO详解

    在上篇文章给大家介绍了Android程序开发仿新版QQ锁屏下弹窗功能.今天通过本文给大家分享android锁屏弹窗的正确姿势. 最近在做一个关于屏幕锁屏悬浮窗的功能,于是在网上搜索了很多安卓屏幕锁屏的相关资料,鉴于网上的资料比较零碎,所以我在这里进行整理总结.本文将从以下两点对屏幕锁屏进行解析: 1. 如何监听系统屏幕锁屏 2. 如何在锁屏界面弹出悬浮窗 如何监听系统屏幕锁屏 经过总结,监听系统的锁屏可以通过以下两种方式: 1) 代码直接判定 2) 接收广播 1) 代码直接判定 代码判断方式,也

  • 浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势

    本文介绍了使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势,分享给大家,具体如下: 官方文档:http://www.yiiframework.com/doc-2.0/guide-structure-assets.html 有兴趣的同学可以先看下官方原文档 文档样例代码 <?php namespace app\assets; use yii\web\AssetBundle; class FontAwesomeAsset extends AssetBundle

  • 如何免费获取 Jetbrain 全家桶使用兑换码的正确姿势(推荐)

    自今年1月份以Jetbrain公司严厉打击旗下开发工具产品(如:IntelliJ IDEA.WebStorm.PyCharm等)的盗版破解以来.求新破解方式.分享新破解方法的帖子或信息经常可以在各技术社区或微信社群中看到. 大批 IDEA 激活码到期之后的乱象...一文中介绍了如何通过正常途径继续使用这些开发工具的三种方法. **学生免费:**JetBrains的全线产品对在校学生全部免费开放.所以,你只要有专属于学校的邮箱,就可以注册账号并免费使用它们. **开源免费:**如果您跟我一样,热爱

  • Angularjs全局变量被作用域监听的正确姿势

    如果你只想知道结论: $scope.$watch($rootScope.xxx,function(newVal,oldVal){ //do something }) 马上就有人问为什么不是: $rootScope.$watch("xxx",function(newVal,oldVal){ //do something }) 从我最近的一个bug来说说为什么要用第一种方式. 逻辑如图,一开始我使用了 $rootScope.$watch 的写法.因为 angularjs 在 $rootSc

随机推荐