Mybatis的 #{ }與${ }
一般在mybatis中使用#{ }代替參數,#{}可以獲取參數值,或者POJO對象屬性的值。
#{}:是以預編譯的形式,將參數設置到sql語句中,PreparedStatement;防止sql註入
${}:取出的值直接拼裝在sql語句中,會有安全問題;
大多情況下,我們取參數的值都應該去使用#{};
但在某些情況下,就需要使用${ }
原生JDBC不支持占位符的地方我們就可以使用${}進行取值
比如分表、排序;按照年份分表拆分
select * from ${year}_salary where xxx;[表名不支持預編譯]
select * from tbl_employee order by ${f_name} ${order} :排序是不支持預編譯的!
模糊查詢:
下面看一個例子:
Java接口:
public List<Student> findStu(Student student);
xml文件:
SQL語句: select * from stu1 where sname like ‘%x%‘
在這裏需要註意,使用${}獲取POJO 中String類型屬性值,值為英文字母或漢字的,需要在${} 的兩邊加上單引號
這裏加上%%的用途是,%是拼接符,前後匹配任意個字符,也需要在單引號內。
<!--public List<Student> findStu(String sname); --> <select id="findStu" parameterType="com.neuedu.bean.Student" resultType="com.neuedu.bean.Student"> select * from stu1 where sname like ‘%${sname}%‘ </select>
測試類
@Test public void testUpdate(){ Student student=new Student(1, "xiaosheng","100", "1"); try { SqlSessionFactory sqlSessionFactory = sqlSessionFactory(); SqlSession openSession= sqlSessionFactory.openSession(); Stu mapper = openSession.getMapper(Stu.class); mapper.updateStuById(student); openSession.commit(); openSession.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
切記如果值為字母或漢字需要加上單引號。當然以防萬一,可以在${}的兩邊都加上單引號,這裏${}在獲取POJO屬性值的時候需要加上單引號,在獲取非POJO屬性的值
的時候就不需要加單引號。
下面看打印的日誌:
DEBUG 09-04 20:32:05,148 ==> Preparing: update stu1 set sname=‘xiaosheng‘, score=100,sclass=1 where sid=1 (BaseJdbcLogger.java:145)
DEBUG 09-04 20:32:05,311 ==> Parameters: (BaseJdbcLogger.java:145)
Mybatis的 #{ }與${ }