MyBatis獲取引數值的兩種方式:#{} 與 ${}

語言: CN / TW / HK

theme: jzman highlight: googlecode


#{}${}的區別

  • #{}的本質是佔位符賦值,${}的本質是字串拼接

  • ${}使用字串拼接的方式拼接sql,若為字串型別或日期型別的欄位進行賦值時,需要手動加單引號

  • #{}使用佔位符賦值的方式拼接sql,此時為字串型別或日期型別的欄位進行賦值時,可以自動新增單引號

如何使用${}#{}獲取引數值

獲取單個字面量型別的引數

  • 此時可以使用#{}${}以任意的名稱(最好見名識意)獲取引數的值,注意${}需要手動加單引號

  • 編寫mapper介面:

java public class UserMapper { //通過id查詢使用者資訊 User getUserById(Integer id); }

  • 編寫對映檔案:

xml <select id="getUserById" resultType="com.mybatis.pojo.User"> SELECT * FROM user WHERE `id` = #{id} </select>

xml <select id="getUserById" resultType="com.mybatis.pojo.User"> SELECT * FROM user WHERE id = '${id}' </select>

多個字面量型別的引數

  • 若mapper介面中的方法引數為多個時,此時MyBatis會自動將這些引數放在一個map集合中

    1. 以arg0,arg1...為鍵,以引數為值;
    2. 以param1,param2...為鍵,以引數為值;
  • 因此只需要通過${}#{}訪問map集合的鍵就可以獲取相對應的值,注意${}需要手動加單引號。

  • 使用arg或者param都行,要注意的是,arg是從arg0開始的,param是從param1開始的

  • 編寫mapper介面:

java public class UserMapper { //通過姓名和年齡查詢使用者資訊 User getUserByNameAndAge(String name, Integer age); }

  • 編寫對映檔案:

xml <select id="getUserByNameAndAge" resultType="com.mybatis.pojo.User"> SELECT * FROM user WHERE name = #{arg0} AND age = #{arg1} </select>

```xml

```

map集合型別的引數

  • 若mapper介面中的方法需要的引數為多個時,此時可以手動建立Map集合,將這些資料放在Map中只需要通過${}#{}訪問Map集合的鍵就可以獲取相對應的值,注意${}需要手動加單引號

  • 編寫mapper介面:

java public class UserMapper { //通過Map集合獲取使用者資訊 User getUserByMap(Map<String,Object> map); }

  • 編寫對映檔案:

```xml

```

```xml

```

  • 編寫測試類: ```java @Test public void test() { SqlSession sqlSession = new SqlSessionFactoryBuilder .build(Resources.getResourceAsStream("mybatis-config.xml")) .openSession(true); UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    Map map = new HashMap<>(); map.put("name","張三"); map.put("password","123456"); User user = mapper.getUserByMap(map); System.out.println(user); } ```

實體類型別的引數

  • 若mapper介面中的方法引數為實體類物件時此時可以使用${}#{},通過訪問實體類物件中的屬性名獲取屬性值,注意${}需要手動加單引號

  • 編寫mapper介面:

java public class User { //通過實體類新增使用者資訊 void addUser(User user); }

xml <insert id="addUser"> INSERT INTO user VALUES(null, #{name}, #{age}, #{sex}, #{account}, #{password}) </insert>

xml <insert id="addUser"> INSERT INTO user VALUES(null, '${name}', '${age}', '${sex}', '${account}', '${password}') </insert>

  • 編寫測試類:

java @Test public void test() { SqlSession sqlSession = new SqlSessionFactoryBuilder .build(Resources.getResourceAsStream("mybatis-config.xml")) .openSession(true); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(null, "小李", 23, "女", "1965325425", "222222"); mapper.addUser(user); }

使用@Param標識引數

  • 可以通過@Param註解標識mapper介面中的方法引數,此時,會將這些引數放在map集合中

    1. 以@Param註解的value屬性值為鍵,以引數為值;
    2. 以param1,param2...為鍵,以引數為值;
  • 只需要通過${}#{}訪問map集合的鍵就可以獲取相對應的值,注意${}需要手動加單引號

  • 編寫mapper介面:

java public class User { User getUserByParam(@Param("name") String name, @Param("password") String password); }

  • 編寫對映檔案:

xml <select id="getUserByParam" resultType="com.mybatis.pojo.User"> SELECT * FROM user WHERE name = #{name} AND password = #{password} </select>

xml <select id="getUserByParam" resultType="com.mybatis.pojo.User"> SELECT * FROM user WHERE name = '${name}' AND password = '${password}' </select>

  • 編寫測試類:

``` @Test public void test() { SqlSession sqlSession = new SqlSessionFactoryBuilder .build(Resources.getResourceAsStream("mybatis-config.xml")) .openSession(true);

UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.getUserByParam("張三", "123456");

} ```

總結

  • 建議分成兩種情況進行處理:

    1. 實體類型別的引數
    2. 使用@Param標識引數