SQL 语句在Java中如何使用占位符?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 语句在Java中如何使用占位符?相关的知识,希望对你有一定的参考价值。

参考技术A String sql= "SELECT * FORM emp where ENAME=?";
PreparedStatement ps = connect.preparedStatement(sql);
ps.setString(1,'KING');
ResultSet rs = ps.executeQuery();追问

请问,按照以上写法,1,2,3,4·····等是否属于魔法数字?

参考技术B select name,password from user where id=? 参考技术C 用?设置占位符 然后用preparedstatement 设置参数本回答被提问者采纳

Mybatis 中 sql 语句的占位符 #{} 和 ${}

       #{} 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换。#{} 可以有效防止   sql注入。 #{} 可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。

       ${} 表示拼接sql串,通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,不能防止 sql 注入问题, ${} 可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${} 括号中只能是 value。

下面举个例子来说明这两个的区别:

代码上来先:

<!-- 通过ID查询一个用户 -->
    <select id="findUserById" parameterType="Integer" resultType="com.msym.beans.User">
        select * from user where id = #{v}
    </select>
    
    <!-- //根据用户名称模糊查询用户列表
    #{}    select * from user where id = ?    占位符  ? ==  ‘五‘
    ${}    select * from user where username like ‘%五%‘  字符串拼接  
    
     -->
    <select id="findUserByUsername1" parameterType="String" resultType="com.msym.beans.User">
        select * from user where username like ‘%${value}%‘
    </select>
    <select id="findUserByUsername2" parameterType="String" resultType="com.msym.beans.User">
        select * from user where username like "%"#{v}"%"
    </select>

  上面是 user 类对应的 user.xml 文件,用于编写 sql 语句,避免了硬编码。

  id 为 findUserByUsername1 的采用的是 ${} 占位符,id 为findUserByUsername2 采用的是 #{} 占位符,

  前者生成的 sql 为 select * from user where username like ‘%XXX%’;

  后者生成的 sql 语句是 select * from user where username like "%"‘XXX‘"%",(这样的格式我还没在 sql 中写过,但是的确能 run)

(XXX 是调用该查询是传入的参数)注意这两者的不同,前者不能防止 sql 注入,后者能防止。

以上是关于SQL 语句在Java中如何使用占位符?的主要内容,如果未能解决你的问题,请参考以下文章

text java sql中如何对于in使用占位符

使用 flyway 占位符生成 sql 语句

Sql语句占位符?的使用

如何打印 Perl 的 DBI 填充占位符后执行的 SQL 查询?

mybatis的一些小细节

占位符如何在 Flyway 中工作?