1. 程式人生 > >Mybatis的 #{ }與${ }

Mybatis的 #{ }與${ }

order 參數設置 一個 sna mit 文件 commit 原生 poj

一般在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的 #{ }與${ }