分析以下的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. jquery 解析xml字符串

    // 函数功能:把xml字符串转换成对象 function convertXmlStringToObj(xmlString) { var xmlObj = new Object; var xmlDoc ...

  2. 数组和ArrayList 相互转换

    Dim params(10) As DbParameter params(0) = DBHelper.CreateDbParameter("@RegName", Jz_RegInf ...

  3. Sublime Text 3下 Emmet 使用小技巧

    Emmet常用技巧:(输入下面简写,按Tab键可触发效果)                          生成 HTML 文档初始结构 html:5 或者 ! 生成 HTML5 结构        ...

  4. ios开发:OC对象的内存分析

    最近要开始准备找实习单位了,做做笔试题,看看各位大神的面试经历,发现自己要学习的东西真的还有很多,虽然也做过几个的项目,但是真正拿过笔试题一看,才发现自己对基础这方面的东西,确实有点忽视了,所以最近开 ...

  5. vs2010创建COM以及调用

    1,创建COM组件 2,调用COM 3,MFC调用COM

  6. Call C# code from C++

    Reference: https://support.microsoft.com/en-us/kb/828736 Calling C# .NET methods from unmanaged C/C+ ...

  7. DWZ 刷新 dialog

    DWZ刷新dialog: 1,在删除按钮上添加callback属性;如:(callback="dialogAjax") <a class="delImg" ...

  8. DirectSound学习(二)--流式缓冲区

    使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据.要注意从缓冲区这时是一个环形缓冲区,声音 ...

  9. 【转】Qt使用自带的windeployqt 生成exe来发布软件

    集成开发环境 QtCreator 目前生成图形界面程序 exe 大致可以分为两类:Qt Widgets Application  和 Qt Quick Application.下面分别介绍这两类exe ...

  10. bootstrap响应式网页设计的9条基本原则!

    bootstrap响应式网页设计是针对多屏幕问题的一个很好的解决方案,但从印刷的视角来看有点困难.没有固定的页面尺寸,没有毫米或英寸,没有任何的物理限制,无从下手. 为了desktop和mobile单 ...