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(); } }
MyBatis中mapper.xml命名空間錯誤
項目場景
使用mybatis配置完成基本的增加操作
問題描述
運行測試添加方法的時候報錯:
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Wrong namespace. Expected ‘com.lwy.mapper.CarMapper’ but found ‘com.lwy.pojo.Car’.
原因分析
進行翻譯瞭一下,可以粗略的知道命名空間錯瞭
解決方案
修改命名空間,找到mapper的xml文件修改名稱空間
修改前:我用的是實體類
修改後mapper接口類
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 淺談MyBatis執行SQL的兩種方式
- mybatis接口綁定失效的解決
- 解讀Mapper與Mapper.xml文件之間匹配的問題
- Spring整合Mybatis的全過程
- Spring Dao層@Repository與@Mapper的使用