sqlmap动态sql优化,避免传参失误批量修改和删除操作!
分析以下的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优化,避免传参失误批量修改和删除操作!的更多相关文章
- 05Microsoft SQL Server 表创建,查看,修改及删除
Microsoft SQL Server 表创建,查看,修改及删除 创建表 创建普通表 use 数据库名称 go create table 表名称( 列1 ) not null, 列2 ) not n ...
- Docker 如何动态给SpringBoot项目传参
关于SpringBoot配置数据源 在项目开发中,我们往往需要配置多套不同的配置环境例如:本地开发.测试环境.部署环境.每一个环境的数据源配置可能都不同,因此需要写不同的数据源配置.如果用Docker ...
- sql取逗号前后数据与批量修改某一字段某一值
sql取逗号后的值 SELECT SUBSTRING_INDEX(字段,) FROM 表名 sql取逗号前的值 SELECT SUBSTRING_INDEX(字段,) FROM 表名 批量修改 UPD ...
- sql server 笔记(数据类型/新建、修改、删除数据表/)
1.数据类型: Character 字符串 / Unicode 字符串 / Binary 类型 / Number 类型 / Date 类型 / 其他数据类型 详解:http://www.w3sc ...
- 一个坑:sql中问号(?)传参和 美元符号传参(${})的区别
? 可能会把参数加一对引号,不忽略前后空格? ${}是字符串拼接,好处是字符串前后的空格会被忽略... 但拼接有可能导致SQL注入
- php sql 类似 mybatis 传参
PHP sql 处理上,没有类似于 java mybatis 的工具,导致进行一些sql 处理时,会有诸多不便, 楼主抽时间写了一个 php 类似 mybatis 的sql 工具,省去了拼装sql 的 ...
- FastDFS:Java客户都实现文件的上传、下载、修改、删除
客户端版本:fastdfs_client_v1.24.jar 配置文件 connect_timeout = 200 network_timeout = 3000 charset = UTF-8 htt ...
- 转,sql server update set from inner 批量修改的使用
SQL update select结合语句详解及应用 QL update select语句 最常用的update语法是: 1 2 UPDATE TABLE_NAME SET column_name ...
- vue动态路由配置,vue路由传参
动态路由: 当我们很多个页面或者组件都要被很多次重复利用的时候,我们的路由都指向同一个组件,这时候从不同组件进入一个"共用"的组件,并且还要传参数,渲染不同的数据 这就要用到动态路 ...
随机推荐
- hdoj1423 最长上升公共子序列
hdoj1423 题目分析: 两个数组a[n1] , b[n2], 求最长上升公共子序列. 我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对数组 ...
- <转载>批处理之FOR语句祥解
批处理之FOR语句祥解 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数 %%变量名 IN ...
- Windows 安装 pip管理工具
Step 1: 设置Python环境变量(我的Python 是 2.7.3) SETX PATH "%path%;D:\python;D:\python\Scripts" 也可以在 ...
- OOP—还原被遮掩的继承名称
1.public继承——using 声明式 class Base { private: int x; public: ; virtual void mf1(int) ; virtual void mf ...
- LibCurl笔记四
1,curl设置fiddler代理curl_easy_setopt(m_easyHandle, CURLOPT_PROXY, "127.0.0.1:8888"); 2,
- What are Upgrade, Product and Package Codes used for? By pusu
Following content is reprinted from here, please go to the original website for more information. Au ...
- oracle的decimal和number的对比
Oracle只是在语法上支持decimal类型,但是在底层实际上它就是number类型,支持decimal类型是为了能把数据从Oracle数据库移到其他数据库中(如DB2等). 因为decimal在O ...
- apache和php扩展问题
1.redis扩展: windows下开发用的xampp集成的环境,想装个php-redis扩展,扩展的github地址: https://github.com/nicolasff/phpredis ...
- foreach的原理
1.foreach 语句对实现 System.Collections .IEnumerable 或 System.Collections.Generic .IEnumerable <T > ...
- JavaScript的常见事件和Ajax小结
一.常见事件类型 1.鼠标事件 事件名称 说明 onclick 鼠标单击时触发 ondbclick 鼠标双击时触发 onmousedown 鼠标左键按下时触发 onmouseup 鼠标释放时触发 on ...