mybatis注解動態(tài)sql注入map和list方式(防sql注入攻擊)
網(wǎng)上的教程
- 配置xml
- 注解中寫xml腳本@Select()
- 使用Java類中的Java方法拼寫sql語句(不防sql注入攻擊的純字符串拼接)
我的教程(防sql注入攻擊)
注入Map
Mapper層代碼
@Repository
public interface ManageMapper {
@SelectProvider(type = ManageProvider.class, method = "queryDevices")
List<Map<String, Object>> queryDevices(@Param("devicetypeno") String devicetypeno, @Param("map") Map<String, Object> map);
}
Service層代碼
@Service("manageService")
public class ManageServiceImpl implements ManageService {
@Resource
private ManageMapper manageMapper;
@Override
public List<Map<String, Object>> queryDevices(String devicetypeno) {
HashMap<String, Object> map = new HashMap<>();
map.put("1-1", "1800");
map.put("1-2", "1854");
return manageMapper.queryDevices(devicetypeno, map);
}
}
SqlProvider代碼
public class ManageProvider {
public String queryDevices() {
String sql = new SQL()
.SELECT("TERMINALNUM, ORGCODE, DEVICETYPENO, DEVICENAME")
.FROM("S_DEVICE_INFO")
.WHERE("DEVICETYPENO = #{devicetypeno}")
.WHERE("ORGCODE IN (#{map.1-1}, #{map.1-2})")
.toString();
return sql;
}
}
注入List
Mapper層代碼
@Repository
public interface ManageMapper {
@SelectProvider(type = ManageProvider.class, method = "queryDevices")
List<Map<String, Object>> queryDevices(@Param("devicetypeno") String devicetypeno, @Param("list") List<Object> list);
}
Service層代碼
@Service("manageService")
public class ManageServiceImpl implements ManageService {
@Resource
private ManageMapper manageMapper;
@Override
public List<Map<String, Object>> queryDevices(String devicetypeno) {
ArrayList<Object> list = new ArrayList<>();
list.add("1800");
list.add("1854");
return manageMapper.queryDevices(devicetypeno, list);
}
}
SqlProvider代碼
public class ManageProvider {
public String queryDevices(Map<String, Object> params) {
// String sql = new SQL()
// .SELECT("TERMINALNUM, ORGCODE, DEVICETYPENO, DEVICENAME")
// .FROM("S_DEVICE_INFO")
// .WHERE("DEVICETYPENO = #{devicetypeno}")
// .WHERE("ORGCODE IN (#{list[0]}, #{list[1]})")
// .toString();
// return sql;
@SuppressWarnings("unchecked")
List<Object> list = (List<Object>) params.get("list");
StringBuilder inBuilder = new StringBuilder();
for (int i = 0, size = list.size(); i < size; i++) {
if (i == 0) {
inBuilder.append("(").append("#{list[").append(i).append("]}");
} else if (i == size - 1) {
inBuilder.append(", ").append("#{list[").append(i).append("]}").append(")");
} else {
inBuilder.append(", ").append("#{list[").append(i).append("]}");
}
}
SQL sql = new SQL()
.SELECT("TERMINALNUM, ORGCODE, DEVICETYPENO, DEVICENAME")
.FROM("S_DEVICE_INFO")
.WHERE("DEVICETYPENO = #{devicetypeno}");
if (inBuilder.length() > 0) {
sql.WHERE("ORGCODE IN " + inBuilder);
}
return sql.toString();
}
}
封裝foreach
像xml foreach標(biāo)簽一樣使用foreach方法
請看mybatis注解動態(tài)sql中foreach工具方法
mybatis防止sql注入的循環(huán)map寫法
<foreach collection="condition.keys" item="k" separator="and">
<if test="null != condition[k]">
${k} = #{condition[${k}]}
</if>
</foreach>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
maven中profile動態(tài)打包不同環(huán)境配置文件的實現(xiàn)
開發(fā)項目時會遇到這個問題:開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境的配置文件不同, 打包時經(jīng)常要手動更改配置文件,本文就來介紹一下maven中profile動態(tài)打包不同環(huán)境配置文件的實現(xiàn),感興趣的可以了解一下2023-10-10
SpringCloud輪詢拉取注冊表與服務(wù)發(fā)現(xiàn)流程詳解
這篇文章主要介紹了SpringCloud輪詢拉取注冊表與服務(wù)發(fā)現(xiàn),現(xiàn)在很多創(chuàng)業(yè)公司都開始往springcloud靠了,可能是由于文檔和組件比較豐富的原因吧,畢竟是一款目前來說比較完善的微服務(wù)架構(gòu)2022-11-11
SpringBoot @Autowired注解注入規(guī)則介紹
這篇文章主要介紹了SpringBoot @Autowired注解注入規(guī)則介紹,具有很好的參考價值,希望對大家有所幫助。2021-11-11
SpringBoot和前端聯(lián)動實現(xiàn)存儲瀏覽記錄功能
這篇文章主要介紹了SpringBoot和前端聯(lián)動實現(xiàn)存儲瀏覽記錄功能,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
快速解決SpringMVC @RequestBody 用map接收請求參數(shù)的問題
今天小編就為大家分享快速解決SpringMVC @RequestBody 用map接收請求參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08

