mybatis注解動(dòng)態(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方法
請(qǐng)看mybatis注解動(dòng)態(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>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java?SpringBoot注解@Async不生效的解決方法
大家好,本篇文章主要講的是java?SpringBoot注解@Async不生效的解決方法,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01淺談自定義校驗(yàn)注解ConstraintValidator
鑒于通用性和普遍性,Spring框架提供了validator組件,通過一些校驗(yàn)器,可以對(duì)一些數(shù)據(jù)進(jìn)行統(tǒng)一的完整性和有效性等校驗(yàn),即簡(jiǎn)單又好用2021-06-06關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式
這篇文章主要介紹了關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01Java幾個(gè)實(shí)例帶你進(jìn)階升華上篇
與其明天開始,不如現(xiàn)在行動(dòng),本文為你帶來幾個(gè)Java書寫的實(shí)際案例,對(duì)鞏固編程的基礎(chǔ)能力很有幫助,快來一起往下看看吧2022-03-03用Java代碼實(shí)現(xiàn)一幅春聯(lián)詳解
大家好,本篇文章主要講的是用Java代碼實(shí)現(xiàn)一幅春聯(lián)詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01SSH框架網(wǎng)上商城項(xiàng)目第23戰(zhàn)之在線支付功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第23戰(zhàn)之在線支付功能實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2016-06-06spring?security需求分析與基礎(chǔ)環(huán)境準(zhǔn)備教程
這篇文章主要為大家介紹了spring?security需求分析與基礎(chǔ)環(huán)境準(zhǔn)備教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03