分析以下的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. python学习day1--python基础

    Python的优缺点 先看优点 Python的定位是“优雅”.“明确”.“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂 ...

  2. vs2015启动iis express失败

    vs2015启动web项目失败,查看日志 IIS Express\aspnetcore.dll 未能加载 ,解决方法 下载 VSorVWDASPNETCore.exe (https://www.asp ...

  3. ios Swift 算法

    // Playground - noun: a place where people can play import Cocoa var nums = Int[]() ... { nums.appen ...

  4. ASP.NET MVC 路由进阶(之一)

    1.  MVC框架下的WebForm页面. 我们在MVC项目下新建一个WebForm页面. 然后右键浏览,打开页面,如下图: 发现页面能够正常访问.ok,我们尝试改一下Global.asax.cs中的 ...

  5. (转)DockPanel的一点点改进

    1.当双击Tab时,原先是直接把当前Tab所表示的这个窗体,从主窗体的框架上分离现来,成为一个浮动的窗体.这不是我想要的,我把它改成了双击关闭.在DockPaneStripBase的WndProc方法 ...

  6. iOS进阶——App生命周期

    State Description Not running The app has not been launched or was running but was terminated by the ...

  7. 6.JAVA_SE复习(集合)

    集合 结构图: 总结: 1.集合中的元素都是对象(注意不是基本数据类型),基本数据类型要放入集合需要装箱. 2.set与list的主要区别在于set中不允许重复,而list(序列)中可以有重复对象. ...

  8. ligerGrid 取得选中行的数据

    var SelectUserIdArr = []; function GetData() { var returnValue = ""; var grid = $("#m ...

  9. 九度OJ做题记录 更新.....

    2015年1月7日 20:34:23  题目1007:奥运排序问题 有点意思,以后想另外方法快速做出来 2015年1月7日 21:03:56 有一个技巧就是,写了三个比较函数cmp1,cmp2,cmp ...

  10. 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)

    唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...