#{} 是先被mybatis解析成 ?占位符 然后进行预编译,能避免 sql注入问题。但是不能用于表名、列名的占位符。(因为JDBC不允许?作为表名列名的占位符)
${} 是直接解析成表达式对应的值,进行了赋值,如果sql还有?占位符就进行预编译,但由于预编译前就进行了赋值,可能存在sql注入问题。但是可以用于代替表名、列名。
注意如果使用${}作为字符类型的字段的占位符需要在外面加引号,#{}则不需要加引号。
两者可以混合使用
不管使用哪种 底层都是使用的PreparedStatement。
#{} 是先被mybatis解析成 ?占位符 然后进行预编译,能避免 sql注入问题。但是不能用于表名、列名的占位符。(因为JDBC不允许?作为表名列名的占位符)
${} 是直接解析成表达式对应的值,进行了赋值,如果sql还有?占位符就进行预编译,但由于预编译前就进行了赋值,可能存在sql注入问题。但是可以用于代替表名、列名。
注意如果使用${}作为字符类型的字段的占位符需要在外面加引号,#{}则不需要加引号。
两者可以混合使用
不管使用哪种 底层都是使用的PreparedStatement。