1.#{} 和 ${}的区别
在xml中#{}中展示的参数类型会自动添加‘ ’,例如:where name = #{person.name},假如name=张三, 则表达式变为where name = '张三',相当于预编译的方式。
Connection conn = getConn();
String slq = " select name from person where name = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "张三");
ResultSet rs=pstmt.executeUpdate();
而${}则是直接展示参数,例如:where name = ${person.name},假如name=张三, 则表达式变为where name = 张三,相当于预编译的方式。
Connection conn = getConn();
String name = “张三”;
String slq = " select name from person where name = "+name;
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs=pstmt.executeUpdate();
假如name=‘张三;drop table person;’的话用${ }则会直接删除表,但是当传参表示表名,或者排序字段名的时候,则要用${ }形式去接收参数,所以在mybatis xml接收参数的时候,尽量用#{}去接收,除了参数表名字段名之类的用${},用${ }形式接收参数时,一定要提前做好判断。
2.<bind/>元素
在进行模糊查询编写SQL语句时,如果使用“${}”进行字符串拼接,无法防止sql注入问题,bind元素可以提前拼接好模糊查询,并用name属性设置参数别名
<select id="findPersonByName" parameterType="String" resultType="cn.csdn.bean.Student">
<bind name="nameLike" value="'%'+person.name+'%'"/>
select name from person where name like #{nameLike}
</select>