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

11 篇文章 0 订阅
3 篇文章 1 订阅

网上的教程

  1. 配置xml
  2. 注解中写xml脚本@Select()
  3. 使用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工具方法

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个流行的Java持久层框架,它允许开发者在运行时构建动态SQL查询,从而提高了代码的灵活性和适应性。MyBatis通过结合XML映射文件和注解,实现了动态SQL的执行。以下是MyBatis动态SQL的主要实现方式: 1. XML映射文件(Mapper XML):在MyBatis中,`<select>`, `<update>`, `<delete>`等标签可以包含参数占位符,如`#{id}`, `#{name}`,这些占位符会在运行时被实际的值替换,形成动态SQL语句。 ```xml <select id="getUser" parameterType="int" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> ``` 2. 参数化查询(Parametrized queries):MyBatis支持使用预编译语句,将参数与SQL语句分离,这样可以SQL注入攻击。 3. 显式对象(Parameter Objects):如果动态SQL非常复杂,可以创建一个Java对象作为参数传递给查询,其中包含了多个属性,MyBatis会自动将对象的属性转换为SQL中的列名。 ```java Map<String, Object> params = new HashMap<>(); params.put("startDate", startDate); params.put("endDate", endDate); List<User> users = sqlSession.selectList("getUsers", params); ``` 4. 动态SQL标签:MyBatis提供了`<if>`, `<choose>`, `<when>`, `<otherwise>`等标签,用于根据条件动态生成SQL,实现基于条件的分支查询。 ```xml <select id="getUser" parameterType="map" resultType="User"> <if test="id != null"> SELECT * FROM users WHERE id = #{id} </if> <if test="name != null"> AND name LIKE '%' + #{name} + '%' </if> </select> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值