1. 程式人生 > >[MyBatis] Mapper.xml中的名稱空間及命名解析

[MyBatis] Mapper.xml中的名稱空間及命名解析

Mapper.xml相關使用

名稱空間(Namespaces)

名稱空間(Namespaces) 在之前版本的MyBatis中是可選的,這樣容易引起混淆因此毫無益處。現在名稱空間則是必須的,且易於簡單地用更長的完完全限定名來隔離語句。
名稱空間使得你所見到的介面繫結成為可能,儘管你覺得這些東西未必用得上,你還是應該遵循這裡的規定以防哪天你改變了主意。出於長遠考慮,使用名稱空間,並將它置於合適的Java包名稱空間之下,你將擁有一份更加整潔的程式碼並提高了MyBatis的可用性

com/jianglei/example/bean/UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper>

    <select id="findById" resultType="User" parameterType="String">
        SELECT * FROM user_test where id = #{id}
    </select>

</mapper>

則啟動時則會丟擲org.apache.ibatis.builder.BuilderException: Mapper's namespace cannot be empty異常

命名解析

命名解析: 為了減少輸入量,MyBatis對所有的命名配置元素(包括語句,結果對映,快取等)使用瞭如下的命名解析規則。

  • 完全限定名(比如"com.mypackage.MyMapper.selectAllThings")將被直接查詢並且找到即用。
  • 短名稱(比如"selectAllThings")如果全域性唯一也可以作為一個單獨的引用。如果不唯一,有兩個或兩個以上的相同名稱(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings”), 那麼使用時就會收到錯誤報告說短名稱是不唯一的,這種情況下就必須使用完全限定名。

如果使用短名稱,且不唯一則會丟擲以下異常

com/jianglei/example/bean/UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.jianglei.example.bean.UserMapper">
    <select id="findById" resultType="User" parameterType="String">
        SELECT * FROM user_test where id = #{id}
    </select>
</mapper>

com/jianglei/example/bean/UserMapper2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jianglei.example.bean.UserMapper2">

    <select id="findById" resultType="User" parameterType="String">
        SELECT * FROM user_test where id = #{id}
    </select>

</mapper>

以下程式碼則會丟擲java.lang.IllegalArgumentException: findById is ambiguous in Mapped Statements collection (try using the full name including the namespace, or rename one of the entries)異常

    @Test
    public void testNamespace02() {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            User user = session.selectOne("findById", "1");
            System.out.println("---------------------");
            System.out.println(user);
        }finally {
            session.close();
        }
    }