mybatis注解动态sql注入map和list方式(防sql注入攻击)

 更新时间:2021年11月30日 10:27:36   作者:daodfs1  
这篇文章主要介绍了mybatis注解动态sql注入map和list方式(防sql注入攻击),具有很好的参考价值,希望对大家有所帮助。

网上的教程

  • 配置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标签一样使用foreach方法

请看mybatis注解动态sql中foreach工具方法

mybatis防止sql注入的循环map写法

<foreach collection="condition.keys" item="k" separator="and"> 
<if test="null != condition[k]"> 
${k} = #{condition[${k}]}
</if>
</foreach>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java SpringBoot注解@Async不生效的解决方法

    java SpringBoot注解@Async不生效的解决方法

    大家好,本篇文章主要讲的是java SpringBoot注解@Async不生效的解决方法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 浅谈自定义校验注解ConstraintValidator

    浅谈自定义校验注解ConstraintValidator

    鉴于通用性和普遍性,Spring框架提供了validator组件,通过一些校验器,可以对一些数据进行统一的完整性和有效性等校验,即简单又好用
    2021-06-06
  • 关于QueryWrapper,实现MybatisPlus多表关联查询方式

    关于QueryWrapper,实现MybatisPlus多表关联查询方式

    这篇文章主要介绍了关于QueryWrapper,实现MybatisPlus多表关联查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • Java语言class类用法及泛化(详解)

    Java语言class类用法及泛化(详解)

    这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象今夕类型标识,也就是RTTI。这项信息记录了每个对象所属的类,需要的朋友可以参考下
    2015-07-07
  • Java几个实例带你进阶升华上篇

    Java几个实例带你进阶升华上篇

    与其明天开始,不如现在行动,本文为你带来几个Java书写的实际案例,对巩固编程的基础能力很有帮助,快来一起往下看看吧
    2022-03-03
  • 用Java代码实现一幅春联详解

    用Java代码实现一幅春联详解

    大家好,本篇文章主要讲的是用Java代码实现一幅春联详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • 详解java自定义类

    详解java自定义类

    这篇文章主要介绍了java自定义类的概念以及用法,文中讲解非常详细,实例代码帮助大家更好的理解,感兴趣的朋友可以参考下
    2020-06-06
  • SSH框架网上商城项目第23战之在线支付功能实现

    SSH框架网上商城项目第23战之在线支付功能实现

    这篇文章主要为大家详细介绍了SSH框架网上商城项目第23战之在线支付功能实现,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • spring security需求分析与基础环境准备教程

    spring security需求分析与基础环境准备教程

    这篇文章主要为大家介绍了spring security需求分析与基础环境准备教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Java中的LinkedHashSet和TreeSet解读

    Java中的LinkedHashSet和TreeSet解读

    这篇文章主要介绍了Java中的LinkedHashSet和TreeSet解读,哈希表和链表实现的set接口哈希表决定了它元素是唯一的,而链表则保证了他是有序的(存储和取出顺序一致),元素按照一定规则排序,不是按储存时间排的,需要的朋友可以参考下
    2023-09-09

最新评论