Java中#和$占位符对比区别

2022-06-15 09:37:35

1.#占位符

语法 :#{id}占位符

mybatis处理#{}使用jdbc对象PrepareStatment对象

<select id="selectStudentById" resultType="ssm.Entity.Student" parameterType="java.lang.Integer">
select * from tb_student where sid =#{sid}

例如 mybatis创建PrepareStatment对象,执行sql语句
String sql6=“ssm.dao.StudentDao”+"."+“QuertStudentParam”;
PrepareStatment pst=conn.prepareStatement(sql);
pst.setIn(1,1001);
resultSet rs=pst.executeQuery();//执行sql语句

主要特点有:

1.1

@1. PrepareStatment对象执行sql语句效率高
@2. 使用PrepareStatment对象 ,执行sql语句可以有效避免sql注入,提高代码的安全性
@3. #{}常常位于=的右侧位置,与数据类型有关

1.2

#{}: 表示一个占位符号,实现向PreparedStatement占位符中设置值(#{}表示一个占位符?),自动进行Java类型到JDBC类型 的转换(因此#{}可以有效防止SQL注入).#{}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,#{}花括号中可以是value或其它名称.

2. $占位符

语法 : ${id} 占位符

select * from tb_student where sid =${sid}

statement st=conn.createStatement(sql);
resultSet rs=st.executeQuery();//执行sql语句

主要特点有:

2.1

@1. Statement对象执行sql语句效率低
@2. ${}占位符的值需要字符串进行链接使用 ,有sql注入的风险,存在一定提高代码 的风险性
@3. ${}是原样进行使用的,无关数据类型问题
@4. ${}常用作表名,或者列名,在能保障数据安全的情况下进行使用

2.2

: 表 示 拼 接 S Q L 串 , 通 过 {}: 表示拼接SQL串,通过:SQL,{}可将parameterType内容拼接在SQL中而不进行JDBC类型转换, 可 以 接 收 简 单 类 型 或 P O 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 的 是 单 个 简 单 类 型 值 , {}可以接收简单类型或PO属性值,如果parameterType传输的是单个简单类型值,PO,parameterType,{}花括号中只能是value.

区分使用

@3.1

     {}方式能够很大程度防止sql注入(安全),${}方式无法防止Sql注入
     在JDBC能使用占位符的地方,最好优先使用#{}
     比如 有两张表,分别是emp_2017 和 emp_2018 .如果需要在查询语句中 动态指定表名,就只能使用${}
     再比如MyBatis 排序时使用order by 动态参数时,此时也只能使用${}
  • 作者:了不起的大志
  • 原文链接:https://blog.csdn.net/anzuaifangcheng/article/details/119060726
    更新时间:2022-06-15 09:37:35