谨慎使用MyBatis自动生成Where语句

最近监控到类似这样一个慢查询:

select delete_flag,delete_time
from D_OrderInfo
     WHERE (  OrderId is not null and
                   OrderId = N‘xxxx‘) 
D_OrderInfo表上有一个OrderId的索引,但OrderId字段是Varchar类型。由于开发框架MyBatis自动生成Where条件不会指定参数类型,字符串类型的参数到了SQLServer里就自动成了NVARCHAR(4000)类型了,坑人的是,不指定参数类型也就罢了,还自动加了个OrderId Is NOT NULL这样一个非SARG的条件,执行计划成了这样:---------------------------------------------------------------------------------------------如果没有OrderId IS NOT NULL这个条件,执行计划会是这样的:由于参数类型Nvarchar比索引字段类型varchar优先级要高,不能直接转换,但SQLServer优化器最终还是将他转成了一个范围值,最终的等号查询也变成了类似一个小范围查询。可以从Index Seek这一步的详细信息可以看出:------------------------------------------------------------------------如果参数类型匹配,那么执行计划会是想象中的那样(虽然没有包含到,还是有Key Lookup):--------------------------------------------------------------------------------------当然,有点小小强迫症的我最终希望的写法是这样的:
select delete_flag,delete_time
from D_OrderInfo
     WHERE OrderId = ‘xxxx‘

执行计划当然也会是这样的:

只是,只是不知道最终开发大神能改成什么样......
时间: 2024-08-04 02:29:52

谨慎使用MyBatis自动生成Where语句的相关文章

NO2:自动生成sql语句

SQL语句自动生成工具 大哉乾元 2016/2/26   作者原创转载请注明出处 前言 这个程序是几年前做成的,现在整理成文档和大家分享,当时参与的项目中大量使用的sql语句,所以SqL语句的代码输入占了较大的比例,为了提高sql语句的书写正确性和输入效率,做成了这个自动生成工具. 一:ADO.NET中执行sql文,对应的sql语句嵌入到vb.net的代码内,分析sql的语法格式个特点: 已检索语句为例分析: A:必须是已select开头 B:检索的字段名(一些系统函数:可选,例如max,sum

Mybatis 自动生成代码,数据库postgresql

最近做了一个项目,使用Mybatis自动生成代码,下面做一下总结,被以后参考: 一.提前准备: 1.工具类:mybatis-generator-core-1.3.2.jar 2.postgresql驱动:postgresql-9.2-1003-jdbc4.jar 3.xml文件 这些我都上传到了附件上,下载链接:Download 二.XML详解 咱们的核心配置文件:mybatisGeneratorConfig.xml <?xml version="1.0" encoding=&q

Mybatis自动生成的BO对象继承公共父类(BO中过滤掉公共属性)

使用mybatis的代码生成工具:mybatis-generator,如果自动生成的BO都有公共的属性,则可以指定这些BO继承父类(父类中定义公共属性) 1.定义父类 注意:属性public,不要使用private,让子类BO可以直接操作它 2.BO打jar包,并在mybatis-generator-maven-plugin中指定依赖 注意:一定要把依赖的BO先打jar包 1 <plugin> 2 <groupId>org.mybatis.generator</groupId

MyBatis自动生成Dao层

MyBatis自动生成Dao层 MyBatis自动生成Dao层,从数据库的表映射到Java的数据层.包括 Mapper接口的定义,Mapper文件中的sql脚本以及接口中用到的对象 参考地址: http://mybatis.org/generator/running/runningWithMaven.html http://mybatis.org/generator/configreference/xmlconfig.html 新建Maven项目(我的是基于SpringBoot) 1.配置pom

Mybatis自动生成key值

介绍 像MySQL.Sql Server有自动生成主键(递增),Oracle只能用序列生成,或者UUID 那么在MyBatis怎么处理呢,有两个处理方式,那么我们接下来看看怎么处理 编码 useGeneratedKeys useGeneratedKeys (insert and update only) This tells MyBatis to use the JDBC getGeneratedKeys method to retrieve keys generated internally

mybatis自动生成

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > &

mybatis自动生成dao, model, mapper xml文件

用mybatis的时候,手写xml或model文件是一个力气活,所以可以用mybatis-gennerator插件自动生成mybatis所需要的dao.bean.mapper xml文件 (原文地址:http://blog.csdn.net/tolcf/article/details/50835165) 附件下载地址:http://files.cnblogs.com/files/cc-robot/generator.rar 把附件解压到本地,我放在d:\web\java目录下了 只需要修改下面x

mybatis自动生成java代码

SSM框架没有DB+Record模式,写起来特别费劲,只能用下面的方法勉强凑合. 上图中,*.jar为下载的,src为新建的空白目录,.xml配置如下. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

SQL的自动生成delete语句

当要清除数据库中表的数据时,自己写sql不好检查错误,也很麻烦. 可以使用下列语句自动生成语句,同时防止误操作,mysql 用 information_schema来存储数据库所有的信息 SELECT CONCAT('delete from ',table_name) FROM information_schema.tables WHERE table_schema='数据库名' AND table_type='base table'; 效果