分析以下的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. Linux -Yum 命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  2. Appcn 移动开发 前台与服务器数据交互

    第一次写.嘿嘿. 言归正传,这几天开始学习移动开发,使用的是Appcan平台.Appcan平台采用HTML5+CSS3做开发 实现跨平台,正好可以满足我们的业务需求. Appacn和数据库进行交互的方 ...

  3. 判断DataReader中是否有指定列

    取出的DataReader如果在读取过程中报没有列的错误可以用这个方法. //调用该方法判断datareader中是否有指定列 public static bool readerExists(IDat ...

  4. 使用Ctex总结1

    使用Ctex应该是每一个做学术研究的人要学会掌握的. 它的基本结构: \documentclass[11pt,two side,a4paper]{cctart}%使用cctart可以让摘要变成中文,比 ...

  5. jquery实现2级联动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 一些达成共识的JavaScript编码风格约定

    如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要.与其他 ...

  7. VS2010 常见错误总结

    错误一:“此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的,请稍后重试” 安装VS2010补丁:http://xiazai.jb51.net/201007/tools/V ...

  8. Jquery ajax basic

    $.ajax({ url: "test.aspx?action=testaction", contentType: "application/json; charset= ...

  9. PHP获取当前时间的毫秒数(yyyyMMddHHmmssSSS)

    1 second = 1000 millisecond = 1000,000 microsecond = 1000,000,000 nanosecond php的毫秒是没有默认函数的,但提供了一个mi ...

  10. json 语义分析

    json 中:元素与值用冒号 ":" 隔开元素与元素用逗号 "," 隔开{} 之间是一个对象, 对象可以层层嵌套[] 表示数组, 数组元素用逗号 ", ...