广告
返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis中的字符串拼接问题
  • 695
分享到

mybatis中的字符串拼接问题

mybatis字符串拼接mybatis拼接字符串mybatis字符串 2023-02-07 12:02:11 695人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录mybatis字符串拼接使用CONCAT 函数使用${ } 代替 #{ }mybatis 拼接动态表名、字段名总结mybatis字符串拼接 MyBatis中拼接字符串有两种方式。

mybatis字符串拼接

MyBatis中拼接字符串有两种方式。

使用CONCAT 函数

SELECT * FROM user WHERE name LIKE CONCAT(CONCAT(‘%', #{name}), ‘%')

使用${ } 代替 #{ }

因为${ }直接传入sql,而#{ }传入的是字符串带有引号

SELECT * FROM user WHERE name LIKE ‘%${name}%'

原因:

#{}能够有效防止SQL注入,但是也有它的缺点,它会把传入的数据自动加上一个双引号,所以如果要的是数字的话,就会比较尴尬。

而${}可以直接解析出原本的数据,所以需要数值比较的话,还是要加${}。

mybatis 拼接动态表名、字段名

项目中遇到个需求是要动态的根据前台传入的字段名称和升降序条件在mybatis里动态拼接sql语句进行查询。现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助。

动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。

这里我们详细说下动态表名和字段名。下面让我们先来熟悉下mybatis里#{}与${}的用法:

在动态sql解析过程,#{}与${}的效果是不一样的:

#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。

如以下sql语句

select * from user where name = #{name};

会被解析为:

select * from user where name = ?;

可以看到#{}被解析为一个参数占位符?。

${ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换

如以下sql语句:

select * from user where name = ${name};

当我们传递参数“sprite”时,sql会解析为:

select * from user where name = "sprite";

可以看到预编译之前的sql语句已经不包含变量name了。

综上所得, ${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。

#{}与${}的区别可以简单总结如下:

  • #{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
  • ${}将传入的参数直接显示生成在sql中,不会添加引号
  • #{}能够很大程度上防止sql注入,${}无法防止sql注入

${}在预编译之前已经被变量替换了,这会存在sql注入的风险。如下sql

select * from ${tableName} where name = ${name}

如果传入的参数tableName为user; delete user; --,那么sql动态解析之后,预编译之前的sql将变为:

select * from user; delete user; -- where name = ?;
--之后的语句将作为注释不起作用,顿时我和我的小伙伴惊呆了!!!看到没,本来的查询语句,竟然偷偷的包含了一个删除表数据的sql,是删除,删除,删除!!!重要的事情说三遍,可想而知,这个风险是有多大。
  • ${}一般用于传输数据库的表名、字段名等
  • 能用#{}的地方尽量别用${}

进入正题,通过上面的分析,相信大家可能已经对如何动态调用表名和字段名有些思路了。示例如下:

  <select id="getUser" resultType="java.util.Map" parameterType="java.lang.String" statementType="STATEMENT">
    select 
        ${columns}
    from ${tableName}
        where COMPANY_REMARK = ${company}
  </select>

要实现动态调用表名和字段名,就不能使用预编译了,需添加statementType="STATEMENT"" 。

statementType:STATEMENT(非预编译),PREPARED(预编译)或CALLABLE中的任意一个,这就告诉 MyBatis 分别使用Statement,PreparedStatement或者CallableStatement。默认:PREPARED。这里显然不能使用预编译,要改成非预编译。

其次,sql里的变量取值是${xxx},不是#{xxx}。

因为${}是将传入的参数直接显示生成sql,如${xxx}传入的参数为字符串数据,需在参数传入前加上引号,如:

String name = "sprite";
name = "'" + name + "'";

这样,sql就变成:

select * from user where name = 'sprite';

总结

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

--结束END--

本文标题: mybatis中的字符串拼接问题

本文链接: https://www.lsjlt.com/news/194417.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mybatis中的字符串拼接问题
    目录mybatis字符串拼接使用CONCAT 函数使用${ } 代替 #{ }mybatis 拼接动态表名、字段名总结mybatis字符串拼接 MyBatis中拼接字符串有两种方式。...
    99+
    2023-02-07
    mybatis字符串拼接 mybatis拼接字符串 mybatis字符串
  • 浅析Golang中字符串拼接问题
    目录1.概述2.Golang中字符串拼接的方式3.总结1.概述 Go的字符串是一个不可改变的数据结构,这和其他语言如JAVA,C++等的设定很类似.总体来说,有如下五种拼接方式,下面...
    99+
    2023-05-15
    Golang字符串拼接 Go 字符串拼接 Golang字符串
  • Mybatis-plusforeach拼接字符串查询无数据返回问题
    目录foreach拼接字符串查询无数据返回两种解决方式精讲#{}和${}的区别是什么?对于这个问题我感觉要抓住两点foreach拼接字符串查询无数据返回 Mybatis-plus x...
    99+
    2022-11-13
  • Golang中字符串拼接问题怎么解决
    本篇内容主要讲解“Golang中字符串拼接问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang中字符串拼接问题怎么解决”吧!1.概述Go的字符串是一个不可改变的数据结构,这和其...
    99+
    2023-07-06
  • C++中常见的字符串拼接问题详解
    C++中常见的字符串拼接问题详解,需要具体代码示例在C++编程中,字符串拼接是一项常见的任务。无论是简单的拼接几个字符串还是复杂的字符串操作,都需要掌握一些基本的技巧和方法。本文将详细介绍C++中常见的字符串拼接问题,并提供具体的代码示例。...
    99+
    2023-10-22
    字符串拼接 C++ 中的字符串操作 字符串拼接问题详解
  • MyBatis中正则使用foreach拼接字符串
    目录正则使用foreach拼接字符串foreach标签拼接多字段in ,和union正则使用foreach拼接字符串 业务需求:使用代理名字查询该代理的所有下级代理 数据库...
    99+
    2022-11-12
  • Java中list.foreach不能使用字符串拼接的问题
    目录list.foreach不能使用字符串拼接如图,不能使用String进行拼接foreach循环中不能使用字符串拼接问题解决原理   lambda表达式使用...
    99+
    2022-11-12
  • JS中循环字符串拼接时加换行问题
    目录JS循环字符串拼接时加换行JS字符串中的空格、换行符(\r,\s,\n,\r\n)换行,回车空白符总结JS循环字符串拼接时加换行 var importantItemsStr = ...
    99+
    2023-02-13
    JS循环字符串 JS字符串拼接 JS字符串换行
  • C++中常见的字符串拼接问题解决方案
    C++中常见的字符串拼接问题解决方案在C++编程中,字符串拼接是一种常见的操作,特别是在处理文本和输出结果时。本文将介绍一些常见的字符串拼接问题,并提供相应的解决方案,同时附上代码示例以帮助读者理解。使用"+"运算符进行字符串拼接在C++中...
    99+
    2023-10-22
    字符串 解决 拼接 字符串拼接方案:
  • C++中常见的字符串拼接问题的解决方案
    C++中常见的字符串拼接问题的解决方案在C++编程中,字符串拼接是一个常见的操作,通常用于拼接两个或多个字符串,或者将其他数据类型转换为字符串后进行拼接。在处理字符串拼接的过程中,我们需要考虑到性能和代码的简洁性。本文将介绍几种常见的字符串...
    99+
    2023-10-22
    C++ 问题解决方案 关键词:字符串拼接
  • Mybatis判断空字符串的问题
    目录Mybatis判断空字符串先说正确的使用方式还有一个题外话Mybatis判断为空注意startBalancejava中是BigDecimal类型Mybatis判断空字符串 先说结...
    99+
    2022-11-13
  • mysql中如何给查出的字符串拼接字符串
    mysql中查询字符串并实现字符串的方法首先,在命令行中启动MySQL服务;service mysql start   MySQL服务启动后,输入用户名和密码,登录mysql数据库;mysql -u root -p登录到MySQL数据库后,...
    99+
    2022-10-21
  • python中如何拼接字符串
    在Python中,可以使用"+"运算符或者使用字符串的join()方法来拼接字符串。下面是两种方法的示例:1. 使用"+"运算符拼接...
    99+
    2023-08-11
    python
  • sqlserver字符串拼接的实现
    目录1. 概述2. 数字 + 字符串2.1 int + varchar2.2 decimal + varchar3. 数字 + 数字4.字符串 + 字符串5. 使用CAST和CONVERT函数进行类型转换1. 概述 在S...
    99+
    2023-02-02
    sqlserver字符串拼接 sqlserver拼接字符串
  • php中字符串不能拼接吗
    php中字符串能进行拼接。字符串拼接的两种方法:1、使用字符串连接符“.”进行拼接,可以把两个或两个以上的字符串拼接成一个新的字符串,语法“$string1.$string2.$string3....”;2、使用赋值运算符“.=”进行拼接,...
    99+
    2022-08-15
    php php字符串
  • 怎么在Shell中拼接字符串
    怎么在Shell中拼接字符串?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 字符串声明概述字符串的基本操作脚本 1# 声明字符串str01="str...
    99+
    2023-06-09
  • Java中字符串占位替换、字符串拼接、字符串与Collection互转的方式
    场景 字符串占位替换 String.format 最原始最基础的方式。 使用%来表示占位,后面跟上不同的标识符,用于限定这个占位符的参数类型,由jdk原生提供支持。 示例:         String badao = String.for...
    99+
    2023-09-03
    java servlet 开发语言
  • SQL中字符串拼接的示例分析
    这篇文章主要为大家展示了“SQL中字符串拼接的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL中字符串拼接的示例分析”这篇文章吧。一、概述相信大家在...
    99+
    2022-10-18
  • JavaScript中怎么组合拼接字符串
    今天就跟大家聊聊有关JavaScript中怎么组合拼接字符串,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript组合拼接字符串的效率。...
    99+
    2022-10-19
  • Java8中需要StringBuilder拼接字符串吗
    这篇文章主要讲解了“Java8中需要StringBuilder拼接字符串吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java8中需要StringBuilder拼接字符串吗”吧!在Java...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作