中国学网 - 学路上 - 儿童网 - 微电影 - 经验 - 学院 - 突袭网 - 商务网 - 笑话 - QQ - 我搜你 - 新闻 - IT科技 - 易沃网 - 文档库 - 3G - 软件下载 - 源代码 - 书法大师

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

来源:互联网  责任编辑:小易  时间:2015/11/26 13:01:12
用户提出问题:使用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楼=====================

方法1、创建自定义注解,然后再写一个Mybatis拦截器,拦截 查询相关方法,如果发现 输入参数有自定义注解,并且参数为Null,则直接返回空

方法2、在Service层 对参数做判断,如果参数为空,直接返回,不需要调用DAO层查询

=================2楼=====================

isnull和isempty标签

=================3楼=====================

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>

=================4楼=====================

where后面的条件 可以加一个 1=1;
例如
select * from table_a where 1=1
<c:if test='判断表达式'>
    and id in () ;
</c:if>

=================5楼=====================

切面编程(AOP)应该可以解决这个问题,题主试试

如果您还有更好的解决方法,请在最下面评论中留下您的解决方法


  • 本文相关:
  • 使用Mybatis执行sql时如何统一校验输入参数?
  • js里这种表述式是啥意思?return (y1 - y2 > 0 ? "Up" : "Down");
  • 请问基于云架构的J2EE架构应该怎么做?
  • spring ,hibernate 都是用到了asm字节码技术,请问它们具体都拿ASM来实现了什么功能?或者说在哪个功能上用到的
  • 如何判断操作系统是32位还是64位?
  • DBA_OBJECTS + ROWNUM 和 DUAL + ROWNUM 一个结果比较的疑问
  • ajax缺点?
  • 判断字符串是否是数字开头
  • 用java程序监视mysql的变化。求方法
  • 如何对URL地址栏传参的信息进行加密或保护
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2015 www.zgxue.com All Rights Reserved