首頁 > 軟體

淺談Mybatis獲取引數值的方式

2022-04-01 13:01:02

Mybatis獲取引數值的兩種方式:${},#{}

  • ${}本質:字串拼接,注意:單引號要加上
  • #{}:本質:預留位置賦值

一、 Mybatis獲取引數值的各種情況

1.mapper介面方法的引數為單個字面量的型別

 /**
     * 根據使用者名稱來查詢資訊
     * @return
     */
    User getUsername(String username);

既然傳入的引數有多個,那麼肯定也是可以傳入多個引數的,接下來我們來看一下獲取引數的第二種情況

2.mapper介面方法的引數有多個

 /**
     * 通過使用者名稱和密碼進行驗證登入
     */
    User checkLogin(String username,String password);

 @Test
 public void testCheckLogin() throws IOException {
  InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
  SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
  SqlSession sqlSession = sqlSessionFactory.openSession(true);
  ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
  User user = mapper.checkLogin("李四", "123859");
  System.out.println(user);

 }

下面這個是報錯資訊

org.apache.ibatis.exceptions.PersistenceException:

Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter ‘username’ not found. Available parameters are [arg1, arg0, param1, param2]
Cause: org.apache.ibatis.binding.BindingException: Parameter ‘username’ not found. Available parameters are [arg1, arg0, param1, param2]

Mybatis檢測到我們的引數有多個的時候,它會自動把引數放到Map集合中

如果想要獲得資料,就應該通過下面的方法

這裡有一個注意點:
剛剛的報錯資訊Available parameters are [arg1, arg0, param1, param2]
這就說明了,arg1,param1它們是儲存在一起的,所以我們其實是可以混合使用者兩個的

使用${}來獲取引數值的使用方式是一樣的,這裡就不演示了,大家可以自己試試,不過再次強調:${}本質是字串拼接,我們使用的時候記得加上單引號

總結:第二中方式就是通過mybatis自定義的key來存取資料,下面的第三種方式我們可以自定義key來存取

3.手動把引數放在map集合中

如果mapper介面中的方法的引數有多個的時候,我們可以手動把引數放在map集合中儲存

mapper介面中定義的方法
 User checkLoginByMap(Map<String,Object> map);

測試程式

InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
  SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
  SqlSession sqlSession = sqlSessionFactory.openSession(true);
  ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);

   Map<String, Object> map = new HashMap<>();
   map.put("username","張三");
   map.put("password","123456");
   User user=mapper.checkLoginByMap(map);
  System.out.println(user);

總結:第三種方式:我們可以自定義key來存取,技巧:mapper介面的方法引數是map集合,我們在測試程式的時候,儲存資料的時候,可以指定儲存的key的值

還有一種獲取引數值的形式就是,前端通過表單把完整資料傳給後端,我們可以獲取資料,並且把資料存到對應的實體類中, 這個時候,當我們呼叫service方法,那麼傳輸過來的資料應該就是實體類物件。實體類物件是屬性名=值這樣來儲存資料,map集合是key=value的形式來儲存資料,這兩種方式儲存資料其實是很像的

4.mapper介面方法的引數是實體型別的引數

  /**
     * 新增使用者資訊
     */
    int insertUser(User user);
 @Test
 public void testInsertUser() throws IOException {
  InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
  SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
  SqlSession sqlSession = sqlSessionFactory.openSession(true);
  ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
  User user=new User();
  user.setId(15);
  user.setUsername("錢七");
  user.setPassword("5613");
  int i = mapper.insertUser(user);
  System.out.println(i);
 }

總結:通過#{}或${}以屬性的方式來存取屬性值,再次強調${}的單引號問題,需要注意。如果我們#{}括號裡面的值不是屬性名那麼就會報錯

5.通過@Param註解命名引數(比較常用)

使用@Param註解來命名引數,此時Mybatis會把這些引數放在一個map集合中,以兩種方式來進行儲存
①@Param註解的值為鍵,引數為值
②以param1,param2…作為鍵,以引數為值
我們只需要通過#{}和${} 以鍵的形式來存取值就可以了

測試

username,@Param("password") String password);-->
    <select id="checkLoginByParam" resultType="com.atguigu.mybatis.pojo.User">
        select * from t_user where username=#{param1}  and password= #{password};
    </select> 

注意點:這個時候,儲存的key,value形式有兩種,一種形式的key是我們職工時候通過註解來命名的引數的名字,還有一種就是以param1,param2……作為key,所以這兩種形式都可以用來取資料,不可以用arg0,arg1的形式來獲取資料,要和情況2區分開

二、總結

上面講的五種情況,可以歸結為兩種情況,一種是引數型別為實體型別,第二種型別是通過@Param註解來命名引數

三、Param原始碼分析

由於我也是剛學習Mybatis的相關內容,所以理解可能不夠到位,這裡我推薦大家可以看這篇文章MyBatis原始碼解讀 - @Param註解。
以後,我還會回頭來更新Mybatis原始碼相關的內容,初學者的話,大家先以熟練使用為主,然後再慢慢的理解其中底層的原理,不要一下子就鑽進原始碼中,這樣可能導致畏難心理,這是我的一點體會。

到此這篇關於淺談Mybatis獲取引數值的方式的文章就介紹到這了,更多相關Mybatis獲取引數值內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com