因為語言慣性,大部分的namespace 在語言級別*來說是作為一種限定性標識來用,起到唯一或一類的標識。來看看語言(以PHP語言為例)上的namespace的作用實例
一、namespace 在PHP中的作用(引自:http://www.php.net/manual/zh/language.namespaces.rationale.php)
在PHP中,命名空間用來解決在編寫類庫或應用程序時創建可重用的代碼如類或函數時碰到的兩類問題:
- 用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。
- 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。
PHP 命名空間提供了一種將相關的類、函數和常量組合到一起的途徑。下面是一個說明 PHP 命名空間語法的示例:
Example #1 命名空間語法示例
1 <?php 2 namespace my\name; // 參考 "定義命名空間" 小節 3 4 class MyClass {} 5 function myfunction() {} 6 const MYCONST = 1; 7 8 $a = new MyClass; 9 $c = new \my\name\MyClass; // 參考 "全局空間" 小節 10 11 $a = strlen('hi'); // 參考 "使用命名空間:后備全局函數/常量" 小節 12 13 $d = namespace\MYCONST; // 參考 "namespace操作符和__NAMESPACE__常量” 小節 14 15 $d = __NAMESPACE__ . '\MYCONST'; 16 echo constant($d); // 參考 "命名空間和動態語言特征" 小節 17 ?>
二、namespace 在mybatis mapper 中的作用
由於之前對namespace 的理解一直停留在如上的理解中,導致在編寫mybatis的mapper時namespace也理解為限定類作用,就以當前文件所在包名為命名空間
編譯通過沒有收到Warning類提示,但在調用對應的dao時會報
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.*******.dao.UserDao.userExists
一開始還在懷疑是不是mybaits配置文件是否有問題,但MapperCounfigure中掃描包確定是沒有問題,后來查找了mybatis入門指南中關於namespace的解釋才明白
1.mapper中的namespace用於綁定dao接口的,即面向接口編程。
2.看一下入門指南是如何解釋的
命名空間的一點注釋(引自:http://www.mybatis.org/mybatis-3/zh/getting-started.html)
命名空間(Namespaces)在之前版本的 MyBatis 中是可選的,容易引起混淆因此是沒有益處的。現在的命名空間則是必須的,目的是希望能比只是簡單的使用更長的完全限定名來區分語句更進一步。
命名空間使得你所見到的接口綁定成為可能,盡管你覺得這些東西未必用得上,你還是應該遵循這里的規定以防哪天你改變了主意。出於長遠考慮,使用命名空間,並將它置於合適的 Java 包命名空間之下
,你將擁有一份更加整潔的代碼並提高了 MyBatis 的可用性。
命名解析:為了減少輸入量,MyBatis 對所有的命名配置元素(包括語句,結果映射,緩存等)使用了如下的命名解析規則。
1.完全限定名(比如“com.mypackage.MyMapper.selectAllThings”)將被直接查找並且找到即用。
2.短名稱(比如“selectAllThings”)如果全局唯一也可以作為一個單獨的引用。如果不唯一,有兩個或兩個以上的相同名稱(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings”),
那么使用時就會收到錯誤報告說短名稱是不唯一的,這種情況下就必須使用完全限定名。
3.正確的namspace指定
總結:Mybatis中namespace用於綁定dao接口,dao接口的方法對應mapper中的sql語名。
*:關於這一理解純屬個人理解可能namespace在其他方面也有相應的作用,可能有點以偏概全。