分析以下的sqlmap存在问题:

<delete id="deletePartspic" parameterClass="TblSpPartspic">
delete from tbl_sp_partspic
<dynamic prepend="where">
<isNotEmpty property="id" prepend="and">
id = #id#
</isNotEmpty>
<isNotEmpty property="fPartsinfoId" prepend="and">
f_partsinfo_id = #fPartsinfoId#
</isNotEmpty>
<isNotEmpty property="picUrl" prepend="and">
pic_url = #picUrl#
</isNotEmpty>
</dynamic>
</delete> <update id="updatePartspic" >
update tbl_sp_partspic
<dynamic prepend="set">
<isNotEmpty property="picUrl" prepend="," >
pic_url=#picUrl#
</isNotEmpty>
<isNotEmpty property="fPartsinfoId" prepend="," >
f_partsinfo_id=#fPartsinfoId#
</isNotEmpty>
<isNotEmpty property="flag" prepend="," >
flag=#flag#
</isNotEmpty>
</dynamic>
<dynamic prepend="where">
<isNotEmpty property="id" prepend="and" >
id = #id#
</isNotEmpty>
<isNotEmpty property="picUrl" prepend="and" >
pic_url = #picUrl#
</isNotEmpty>
</dynamic>
</update>

如果没有传递参数,导致的结果就是删除整个表的数据,或修改整个表的数据,如果项目处理上线阶段,这样的问题将会很严重。

查询,添加不会出现以上问题。

所以我们要避免该种问题,要做一个限定条件,虽然sqlmal动态参数有它的灵活性,但是面对这样的情况,还是要尽量少用。

--解决方法: 分拆成多个sql语句,在dao层来判断执行。操作都要带上where条件(限定),就算没有传参,也只会报sql语法异常。--

[SQL] delete FROM `tbl_sp_partspic` where id = ;
[Err] 1064 - 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

在dao层做判断,分别调用不同的sql

public boolean deletePartsPic(Map map) throws DataAccessException{
boolean flag = false;
Object object = null;
PartsPicPO po = new PartsPicPO();
po.setId((Integer)map.get("id"));
po.setfPartsinfoId( (Integer)map.get("fPartsinfoId"));
po.setPicUrl( (String)map.get("picUrl") ); if(po.getId() != null){
object = this.getSqlMapClientTemplate().delete("deletePartspicById", po);
log.info("删除返回的信息" + object);
}else if(po.getfPartsinfoId() != null){
object = this.getSqlMapClientTemplate().delete("deletePartspicByFid", po);
log.info("删除返回的信息" + object);
}else if(po.getPicUrl() != null){
object = this.getSqlMapClientTemplate().delete("deletePartspicByPicUrl", po);
log.info("删除返回的信息" + object);
} if (object != null) {
flag = true;
}
return flag;
} @Override
public boolean updatePartsPic(Map<String, Object> map) throws DataAccessException{
boolean flag = false;
Object object = null;
PartsPicPO po = new PartsPicPO();
po.setId((Integer) map.get("id"));
po.setPicUrl((String) map.get("picUrl"));
po.setfPartsinfoId((Integer) map.get("fPartsinfoId"));
po.setFlag((Integer) map.get("flag")); if(po.getId() != null){
object = this.getSqlMapClientTemplate().update("updatePartspicById", po);
log.info("更新信息的返回:" + object + ",影响行数");
flag = true;
}else if(po.getPicUrl() != null){
object = this.getSqlMapClientTemplate().update("updatePartspicByPicUrl", po);
log.info("更新信息的返回:" + object + ",影响行数");
flag = true;
} return flag; }

拆分的sqlmap文件:

<delete id="deletePartspicById" parameterClass="TblSpPartspic">
delete from tbl_sp_partspic where id = #id#
</delete> <delete id="deletePartspicByFid" parameterClass="TblSpPartspic">
delete from tbl_sp_partspic where f_partsinfo_id = #fPartsinfoId#
</delete> <delete id="deletePartspicByPicUrl" parameterClass="TblSpPartspic">
delete from tbl_sp_partspic where pic_url = #picUrl#
</delete> <update id="updatePartspicById" >
update tbl_sp_partspic
<dynamic prepend="set">
<isNotEmpty property="picUrl" prepend="," >
pic_url=#picUrl#
</isNotEmpty>
<isNotEmpty property="fPartsinfoId" prepend="," >
f_partsinfo_id=#fPartsinfoId#
</isNotEmpty>
<isNotEmpty property="flag" prepend="," >
flag=#flag#
</isNotEmpty>
</dynamic>
where id = #id#
</update> <update id="updatePartspicByPicUrl" >
update tbl_sp_partspic
<dynamic prepend="set">
<isNotEmpty property="picUrl" prepend="," >
pic_url=#picUrl#
</isNotEmpty>
<isNotEmpty property="fPartsinfoId" prepend="," >
f_partsinfo_id=#fPartsinfoId#
</isNotEmpty>
<isNotEmpty property="flag" prepend="," >
flag=#flag#
</isNotEmpty>
</dynamic>
where pic_url = #picUrl#
</update>

问题回顾:

1. PartsPicPO po = new PartsPicPO();

po.setfPartsinfoId( (Integer)map.get("fPartsinfoId"));

//没有对id赋予值。故在运行id的junit测试的时候全部删除表数据(特地将id设置一个极大值,本来是让无物理删除)。

2.另外一个原因是连接的库是备用库,而不是开发库。导致配件图片表数据误删~!!!

web运行与junit运行,加载的jdbc数据库配置文件。 jdbc-ds.properties   jdbc-ds-test.properties

sqlmap动态sql优化,避免传参失误批量修改和删除操作!的更多相关文章

  1. 05Microsoft SQL Server 表创建,查看,修改及删除

    Microsoft SQL Server 表创建,查看,修改及删除 创建表 创建普通表 use 数据库名称 go create table 表名称( 列1 ) not null, 列2 ) not n ...

  2. Docker 如何动态给SpringBoot项目传参

    关于SpringBoot配置数据源 在项目开发中,我们往往需要配置多套不同的配置环境例如:本地开发.测试环境.部署环境.每一个环境的数据源配置可能都不同,因此需要写不同的数据源配置.如果用Docker ...

  3. sql取逗号前后数据与批量修改某一字段某一值

    sql取逗号后的值 SELECT SUBSTRING_INDEX(字段,) FROM 表名 sql取逗号前的值 SELECT SUBSTRING_INDEX(字段,) FROM 表名 批量修改 UPD ...

  4. sql server 笔记(数据类型/新建、修改、删除数据表/)

    1.数据类型: Character 字符串 / Unicode 字符串 / Binary 类型 / Number 类型  /  Date 类型  / 其他数据类型 详解:http://www.w3sc ...

  5. 一个坑:sql中问号(?)传参和 美元符号传参(${})的区别

    ? 可能会把参数加一对引号,不忽略前后空格? ${}是字符串拼接,好处是字符串前后的空格会被忽略... 但拼接有可能导致SQL注入

  6. php sql 类似 mybatis 传参

    PHP sql 处理上,没有类似于 java mybatis 的工具,导致进行一些sql 处理时,会有诸多不便, 楼主抽时间写了一个 php 类似 mybatis 的sql 工具,省去了拼装sql 的 ...

  7. FastDFS:Java客户都实现文件的上传、下载、修改、删除

    客户端版本:fastdfs_client_v1.24.jar 配置文件 connect_timeout = 200 network_timeout = 3000 charset = UTF-8 htt ...

  8. 转,sql server update set from inner 批量修改的使用

    SQL update select结合语句详解及应用   QL update select语句 最常用的update语法是: 1 2 UPDATE TABLE_NAME SET column_name ...

  9. vue动态路由配置,vue路由传参

    动态路由: 当我们很多个页面或者组件都要被很多次重复利用的时候,我们的路由都指向同一个组件,这时候从不同组件进入一个"共用"的组件,并且还要传参数,渲染不同的数据 这就要用到动态路 ...

随机推荐

  1. TCP/IP——内外网IP+子网掩码作用+PING(网络总结)

    目录: 1.如何区分内网IP和外网IP? 保留字段 2.子网掩码是起什么作用的? 将DNS和IP异或,表示哪段起作用 3.ping到底起什么作用? ping本地.ping远程 下面针对上面三个问题分别 ...

  2. Struts升级到2.3.15.1抵抗漏洞

    后知后觉,今天才开始修复Struts2的漏洞 详细情形可以参考: http://struts.apache.org/release/2.3.x/docs/security-bulletins.html ...

  3. Commons-logging + Log4j

    一.Commons-logging能帮我们做什么? 1.提供一个统一的日志接口,简单了操作,同时避免项目与某个日志实现系统紧密耦合 2.自动选择适当的日志实现系统 a.classpath下查找comm ...

  4. java新手笔记32 jdk5新特性

    1.for package com.yfs.javase; import java.awt.Color; import java.util.Calendar; import java.util.Has ...

  5. ZStack中的编程技巧

    1. 像函数一样使用的宏 //这个宏,用来被其他宏使用,构造一个正确有效的表达式.这个适合于一些离散语句的组合,不适合函数的重新命名 #define st(x)      do { x } while ...

  6. 【转】C#类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)

    静态类 -------------------------------------------------------------------------------- 静态类就是在class关键字前 ...

  7. 【转】JavaScript中undefined与null的区别

    通常情况下, 当我们试图访问某个不存在的或者没有赋值的变量时,就会得到一个undefined值.Javascript会自动将声明是没有进行初始化的变量设为undifined. 如果一个变量根本不存在会 ...

  8. Linux C 程序 指针数组和二级指针(TEN)

    指针数组和二级指针 #include<stdio.h> int main(){ ] = {,,,,}; ], i; int **pp = p; //使p指针数组指向每一个a ; i < ...

  9. [CSS]浮动的那点事儿

    元素是怎样浮动 元素的水平方向浮动,意味着元素只能左右移动而不能上下移动. 一个浮动元素会尽量向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 浮动元素之后的元素将围绕它. 浮动元素 ...

  10. NoSQL性能测试:MongoDB VS SequoiaDB

    作 为NoSQL的一个重要类型,文档型NoSQL通常被认为是最接近传统关系型数据库的NoSQL.文档型NoSQL的核心是数据嵌套,这种设计可以从某种 程度上大大简化传统数据库复杂的关联问题.同时由于摆 ...