MyBatis Xml映射文件之字符串替换方式

目录
  • MyBatis Xml映射文件字符串替换
    • 字符串替换
    • 举个例子
  • Mybatis中字符串替换问题

MyBatis Xml映射文件字符串替换

字符串替换

默认情况下,使用 #{} 格式的语法会导致 MyBatis 创建 PreparedStatement 参数占位符并安全地设置参数(就像使用 ? 一样)。 这样做更安全,更迅速,通常也是首选做法,不过有时你就是想直接在 SQL 语句中插入一个不转义的字符串。

比如,像 ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

这里 MyBatis 不会修改或转义字符串。

当 SQL 语句中的元数据(如表名或列名)是动态生成的时候,字符串替换将会非常有用。

举个例子

如果你想通过任何一列从表中 select 数据时,不需要像下面这样写:

@Select("select * from user where id = #{id}")
User findById(@Param("id") long id);

@Select("select * from user where name = #{name}")
User findByName(@Param("name") String name);

@Select("select * from user where email = #{email}")
User findByEmail(@Param("email") String email);
// and more "findByXxx" method

可以只写这样一个方法:

@Select("select * from user where ${column} = #{value}")
User findByColumn(@Param("column") String column, @Param("value") String value);

其中 ${column} 会被直接替换,而 #{value} 会被使用 ? 预处理。 因此你就可以像下面这样来达到上述功能:

User userOfId1 = userMapper.findByColumn("id", 1L);
User userOfNameKid = userMapper.findByColumn("name", "kid");
User userOfEmail = userMapper.findByColumn("email", noone@nowhere.com);

这个想法也同样适用于用来替换表名的情况。

提示:用这种方式接受用户的输入,并将其用于语句中的参数是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。

Mybatis中字符串替换问题

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法!

有时只想直接在SQL语句中插入一个不改变的字符串.比如,像ORDER BY,你可以这样来使用:ORDER BY ${column}

这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查!

错误方式:

ORDER BY fupdated ${sort, jdbcType=VARCHAR}, fcreated ${sort, jdbcType=VARCHAR}

正确方式:

ORDER BY fupdated ${sort}, fcreated ${sort}

前提条件:请对sort进行必要验证,防止sql攻击问题!

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

(0)

相关推荐

  • mybatis映射XML文件详解及实例

    mybatis映射XML文件 一个简单的映射文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="c

  • MyBatis中XML 映射文件中常见的标签说明

    SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出): cache – 对给定命名空间的缓存配置. cache-ref – 对其他命名空间缓存配置的引用. resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象. parameterMap – 已被废弃!老式风格的参数映射.更好的办法是使用内联参数,此元素可能在将来被移除. sql – 可被其他语句引用的可重用语句块. insert – 映射插入语句 update – 映射更新语句 delete –

  • myBatis的mapper映射文件之批量处理方式

    目录 mybatis批量插入 mybatis批量删除 mybatis批量修改 myBatis mapper文件详解 Mapper文件中包含的元素有 mybatis支持别名: jdbcType与JavaType的映射关系 #mybatis常见批量处理 在开发当中,可能经常会遇到批量处理这种情况,一般都再在java层面进行, 其本质是节省数据库连接打开关闭的的次数,占用更少的运行内存. mybatis批量插入 <insert id="saveFeeRuleList" useGener

  • MyBatis Xml映射文件之字符串替换方式

    目录 MyBatis Xml映射文件字符串替换 字符串替换 举个例子 Mybatis中字符串替换问题 MyBatis Xml映射文件字符串替换 字符串替换 默认情况下,使用 #{} 格式的语法会导致 MyBatis 创建 PreparedStatement 参数占位符并安全地设置参数(就像使用 ? 一样). 这样做更安全,更迅速,通常也是首选做法,不过有时你就是想直接在 SQL 语句中插入一个不转义的字符串. 比如,像 ORDER BY,你可以这样来使用: ORDER BY ${columnNa

  • mybatis框架的xml映射文件常用查询指南

    使用mybatis框架时,那必然会有对数据库的查询语句的编写,所以这篇文章希望可以帮助到你. 什么是Mybatis框架? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录. 如何使用?

  • mybatis整合spring实现开启mapper.xml映射文件扫描

    目录 mybatis整合spring开启mapper.xml映射文件扫描 spring配置扫描mybatis的mapper文件注意 mybatis整合spring开启mapper.xml映射文件扫描 一般情况下,我们知道在使用mybatis的时候,必须在mybatis全局配置文件里配置映射文件. 代码如下: <mappers> <mapper resource="/resources/mybatis/sys/ParamMapper.xml"/> <mapp

  • Java Mybatis的初始化之Mapper.xml映射文件的详解

    目录 解析Mapper文件入口 解析Mapper文件 总结 前言: 解析完全局配置文件后接下来就是解析Mapper文件了,它是通过XMLMapperBuilder来进行解析的 解析Mapper文件入口 XMLMapperBuilder的parse()方法: public void parse() { if (!configuration.isResourceLoaded(resource)) { configurationElement(parser.evalNode("/mapper"

  • Mybatis配置映射文件中parameterType的用法讲解

    目录 Mybatis配置映射文件parameterType用法 1.基本数据类型 2.复杂数据类型:包含java实体类,map Mybatis parameterType # $符号的注意事项 Mybatis配置映射文件parameterType用法 在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的输入参数类型即可.parameterType有基

  • 深入浅出MyBatis中映射文件和实体类的关联性

    mybatis的映射文件写法多种多样,不同的写法和用法,在实际开发过程中所消耗的开发时间.维护时间有很大差别,今天我就把我认为比较简单的一种映射文件写法记录下来,供大家修改建议,争取找到一个最优写法~~: 以User对象和UserMap.xml为例讲解,代码如下: User为用户实体类(仅作为讲解,可以只关注引用类型变量,get/set方法省略): import com.google.common.collect.Lists; import com.gukeer.common.persisten

  • 解决Spring boot整合mybatis,xml资源文件放置及路径配置问题

    网上各种解决方案,我试了好久,整合了几篇文章才凑出来,在这里分享一下,实在不想网友们在这里面绕圈子,毕竟,写代码的时间是愉快的,解决bug也是愉快的,但也是一直在bug里面绕圈子就不爽了. 亲自试验: 1) 我的mapper和xml是这样子放置的 2) 在.xml中namespace是这样的: 3) application.properties中mybatis.mapper-locations得这么配置到xml 4) 最后呢,你只要在pom.xml中build下这样配置 5) 按照我这种位置防止

  • Mybatis通过数据库表自动生成实体类和xml映射文件

    环境:maven+idea. 1. 需要的jar包 基本的spring和mybatis依赖包就不说了,在pom文件的build->plugins节点下需要添加(两个依赖包也可以直接添加到pom的依赖里面去,这里是为了直接通过maven的插件来生成.如果不是使用maven,自行百度下): <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-mave

随机推荐