MyBatis中#{}和${}的区别

在MyBatis中,#{}和${}都是用于向SQL语句中传递参数的占位符,下面是它们的主要区别:

  • #{}进行预编译处理,${}直接替换
  • #{}可以防止SQL注入并且防止字符转义,${}只能防止字符转义
  • 执行时刻不同

1.预编译处理

与JDBC一样,MyBatis在执行SQL语句时,会将SQL语句传递给数据库,然后由数据库进行编译和优化。如果同一个SQL语句需要多次执行,那么每次传递给数据库的SQL语句都需要进行编译和优化,这样会降低应用程序的性能。

MyBatis通过预编译处理来解决这个问题,即将SQL语句预编译为PreparedStatement,然后将参数绑定到PreparedStatement中,最后执行PreparedStatement。这样做可以减少SQL语句的编译和优化次数,提高应用程序的性能。

#{}:

使用#{}时,MyBatis会将#{}替换为占位符?号,并将参数值绑定到PreparedStatement中。每次执行SQL语句时,只需要将PreparedStatement传递给数据库,而不需要重新编译和优化SQL语句。具体的区别可以查看

${}: 

使用${}时,MyBatis会将${}替换为参数值,并将结果作为一个字符串插入到SQL语句中。每次执行SQL语句时,都需要重新构造并编译SQL语句。

可以通过MySQL日志文查看执行的SQL语句有什么区别

2.SQL注入问题

SQL注入是应用程序中最常见的安全漏洞之一。SQL注入是攻击者使用用户输入数据构造恶意请求,从而获取或篡改应用程序中存储的数据。要解决SQL注入问题,就必须对用户输入数据进行校验和转义处理。例如在查询语句中加入 "' or '1' = '1" 这个字符串,则会在sql语句最后面加上1=1这个条件,必然可以查询成功。

在MyBatis中,#{}和${}都可以用来传递参数值,但它们对SQL注入问题的处理方式有所不同。

#{}:

使用#{}时,MyBatis会对参数值进行预编译处理,并绑定到PreparedStatement中。这样做既可以避免SQL注入问题,又不用显式地处理用户输入数据。

${}:

使用{}时,MyBatis会将参数值直接插入到SQL语句中。如果没有对用户输入数据进行校验和转义处理,就容易出现SQL注入问题。

3.执行时刻不同

使用#{}时,参数值会在SQL预编译阶段进行处理;而使用${}时,参数值会在SQL语句执行阶段进行处理。因此,使用#{}可以提高SQL的效率,尤其是当同一个SQL语句需要多次执行时。

你可能感兴趣的:(mybatis,java,sql)