在上一篇的對應檔中,Maps/ProductMap.xml 配置元素的根項目的開始標記如下所示:
<sqlMap namespace="EntityModel" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
namespace 是什麼呢?是不是 C# 中的命名空間呢?
其實不是的,這個命名空間與對應檔中的 statements 中配置的 SQL 陳述式的 id 有關。
在大型項目中,可能存在大量的 SQL 陳述式,這時候,為每個 SQL 陳述式起一個唯一的標識 id 就變得並不容易了。為瞭解決這個問題,在 mybatis 中,可以為每個對應檔起一個唯一的命名空間,這樣,定義在這個對應檔中的每個 SQL 陳述式就成了定義在這個命名空間中的一個 id。只要我們能夠保證每個命名空間是唯一的,即使在不同對應檔中的語句的 id 相同,也就不會衝突了。
與 C# 不同的是,這個通過命名空間管理語句標識的機制預設並不啟用,也就是說,預設並不考慮我們定義的命名空間,而是直接使用語句的 id 。
何時啟用命名空間機制,取決於 SqlMap.config 設定檔中定義的 useStatementNamespaces 配置參數的設定。此設定預設為 false.
<properties> <property key="useStatementNamespaces" value="false" /></properties>
只有當這個參數設定為 true 的時候,命名空間機制才會啟用,啟用之後,在代碼中,就必須使用帶有命名空間的標識來訪問 SQL 陳述式了。比如,原來的語句就需要修改為如下所示的代碼了。
IList<EntityModel.Product> productList = Mapper.QueryForList<EntityModel.Product>("EntityModel.GetAllProducts", null);