(二)Mybatis多個mapper文件以及namespace命名問題

代碼直接放在Github倉庫【https://github.com/Damaer/Mybatis-Learning】,mybatis-02可直接運行,就不佔篇幅了。

上一篇入門文章:(一)Mybatis入門之第一個程序,裏面還有一些細節沒有提及,那就是多個mapper文件的時候怎麼處理,namespace又是幹什麼用的呢
首先我們來看創建數據庫語句:

#創建數據庫
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
#創建數據表
CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(20) NOT NULL ,
`age` INT NOT NULL , `score` DOUBLE NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM;

在這裏我們必須重新說一下Mybatis的運行大概過程:首先我們通過Resources.getResourceAsStream("mybatis.xml")讀取到mybatis.xml這個文件,這個文件裏面配置的都是整個項目與數據庫相關的配置,比如運行的時候的數據庫環境(連接哪一個數據庫,數據庫服務器的地址,用戶名,密碼),或者是配置外部配置文件等,最重要的是,這個文件註冊了映射文件,那麼我們使用SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);的時候,sqlSessionFactory回去讀取mybatis.xml裏面讀取的配置文件,並且會逐一獲取每一個配置文件讀取到的Mapper映射文件,當我們使用openSession獲取到sqlSession的實例的時候,比如我們使用sqlSession.insert("insertStudent",student);,就會去查找每一個mapper裏面的sql配置語句,也就是類似於下面這種:

<mapper namespace="mapper1">
    <insert id="insertStudent" parameterType="bean.Student">
        insert into student(name,age,score) values(#{name},#{age},#{score})
    </insert>
</mapper>

找到id一樣的就可以,那麼很多人會說,既然區分使用的是id,那我的mapper文件裏面的namespace屬性是幹什麼用的?

當我們有兩個或者以上相同的id的時候,我們必須使用namespace進行區分,如果只有一個mapper.xml文件,那麼我們namespace寫什麼都可以,在使用的時候,只需要:sqlSession.insert("insertStudent",student);就可以了,如果我們的id是相同的,那我們需要使用:sqlSession.insert("mapper1.insertStudent",student);在前面加上namspace。否則會出現以下錯誤,提示我們使用全稱包括namespace,或者重新定義一個id。
總的來說,要麼id不一樣,可以直接用,要麼id一樣,但是namespace不一樣,使用的時候加上namespace區分。否則會報以下錯誤:

發佈了123 篇原創文章 · 獲贊 57 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章