使用Mybatis执行sql时如何统一校验输入参数?

问题描述

如dao方法有:void batchInsert(List<User> userList);List<User> getUsersByIds(List<Long> idList);void deleteUsersByids(List<Long> idList);我想若输入参数为空(list.isEmpty()),就不要往下执行sql了,直接返回.否则的话会有错误sql出现,如:mysql> select * from user where id in () ;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1跟踪源码发现,可以在SqlSesisonTemplate(org.mybatis.spring.SqlSesisonTemplate)中进行处理,如selectList,可以添加如下的逻辑: if(parameter instanceof List){ if(((List) parameter).isEmpty()){List<E> result = new ArrayList<>();return result; } }但是需要在其他方法中(如insert update delete) 都需要加入差不多的逻辑.不知除了这一处理方式外,还有没其他更好的方法?

解决方案

方法1、创建自定义注解,然后再写一个Mybatis拦截器,拦截 查询相关方法,如果发现 输入参数有自定义注解,并且参数为Null,则直接返回空方法2、在Service层 对参数做判断,如果参数为空,直接返回,不需要调用DAO层查询
解决方案二:
isnull和isempty标签
解决方案三:
1 在service层判断参数list是否是null或者长度为0,这样就不调用dao层了2 sql的写法 <select id="getUsersByIds" resultType="User"> SELECT * FROM user <if test="idList!=null"> WHERE id in <foreach collection="idList" item="item" index="index" separator="," open="(" close=")"> #{item} </foreach> </if> </select>
解决方案四:
where后面的条件 可以加一个 1=1;例如select * from table_a where 1=1 <c:if test='判断表达式'> and id in () ; </c:if>
解决方案五:
切面编程(AOP)应该可以解决这个问题,题主试试

时间: 2024-09-20 05:42:08

使用Mybatis执行sql时如何统一校验输入参数?的相关文章

当使用ckeditor控件时,需要校验输入内容是否为空的一种解决办法(转帖)_网页编辑器

fckeditor 验证内容是否为空 fckeditor Js验证表单 原来的代码代码如下 复制代码 代码如下: <script language = "javascript"> <!-- function checkForm(){ if (document.form1.content.value==""){ alert("请输入内容!"); return false; } return true; } //--> <

MyBatis 执行动态 SQL语句详解_java

大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: <select id="executeSql" resultType="map"> ${_parameter} </select> 你可以如下调用: sqlSession.selectList("executeSql", "select * from sysuser where enabled

详解MyBatis直接执行SQL查询及数据批量插入_java

一.直接执行SQL查询: 1.mappers文件节选 <resultMap id="AcModelResultMap" type="com.izumi.InstanceModel"> <result column="instanceid" property="instanceID" jdbcType="VARCHAR" /> <result column="insta

linq2sql:直接执行sql语句

1.ExecuteQuery方法 看命名,我们很容易联想到ado.net里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告诉我们这个方法返回的是一个泛型集合,应该"所思非所得".下面通过一个简单方法,验证我们的猜想(数据库设计可以参考这一篇): /// <summary> /// 直接执行sql语句, 获取总人数 /// </summary> /// <returns></returns>  public i

一起谈.NET技术,linq2sql:直接执行sql语句

1.ExecuteQuery方法 看命名,我们很容易联想到ado.net里熟悉的Command的ExecuteNonQuery方法,但是VS的智能提示告诉我们这个方法返回的是一个泛型集合,应该"所思非所得".下面通过一个简单方法,验证我们的猜想(数据库设计可以参考这一篇): /// <summary>/// 直接执行sql语句,获取总人数/// </summary>/// <returns></returns> public int Ge

mybatis-Mybatis 调用sql server储存过程,有参数,有返回值,得到是个空值

问题描述 Mybatis 调用sql server储存过程,有参数,有返回值,得到是个空值 首先是XML 文件 <select id="procTrainPay" parameterMap="testParameterMap" statementType="CALLABLE" > {call PROC_TRAIN_PAY(?,?,?,?,?,?,?,?)} </select> sql 语句 sql在sql server里面

SQL*Plus 执行脚本时传递参数(@script_name var1,var2)

      在使用sqlplus执行sql脚本时,经常碰到向脚本传递参数的情形.类似于shell脚本的参数传递,我们同样可以向sql脚本传递参数,其方法是脚本后面直接跟多个连续的参数并以空格分开.本文描述该内容并给出示例. 1.SQLPlus 的帮助信息 下面的帮助信息是关于sqlplus调用带参脚本的说明 sqlplus -H <start> is: @<URL>|<filename>[.<ext>] [<parameter> ...] Run

在MySQL中执行SQL语句时的几个注意点

在执行查找命令时的大小写问题 默认情况下,MySQL在执行查找时不区分字母的大小写.当你在查找时使用like 'a%'时, 默认将返回以a或者A开头的所有列值,若要在查找时区分大小写,则需要使用collate运算符来实现,具体例子如下: col_name COLLATE latin1_general_cs LIKE 'a%'col_name LIKE 'a%' COLLATE latin1_general_cscol_name COLLATE latin1_bin LIKE 'a%'col_na

sql-MySql执行分页时查询统计数据量的Sql语句差别及性能

问题描述 MySql执行分页时查询统计数据量的Sql语句差别及性能 现在开发系统,涉及到了分页查询,在做的时候就在想,能不能自动把查询sql语句通过参数自动封装成能够统计查询语句不在分页条件下查询出的数据量有多大,例如一般做法是: 1.先根据拼接的sql语句进行查询:select * from ecs_goods where goods_type = 1 limit 1000, 10 2.再统计数量:select count(*) from ecs_goods where goods_type