MyBatis Mapper.xml中的命名空間及命名方式
Mapper.xml相關(guān)使用
命名空間(Namespaces)
命名空間(Namespaces) 在之前版本的MyBatis中是可選的,這樣容易引起混淆因此毫無益處?,F(xiàn)在命名空間則是必須的,且易于簡單地用更長的完完全限定名來隔離語句。
命名空間使得你所見到的接口綁定成為可能,盡管你覺得這些東西未必用得上,你還是應(yīng)該遵循這里的規(guī)定以防哪天你改變了主意。
出于長遠(yuǎn)考慮,使用命名空間,并將它置于合適的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>
則啟動(dòng)時(shí)則會(huì)拋出
org.apache.ibatis.builder.BuilderException: Mapper's namespace cannot be empty異常
命名解析
命名解析: 為了減少輸入量,MyBatis對所有的命名配置元素(包括語句,結(jié)果映射,緩存等)使用了如下的命名解析規(guī)則。
- 完全限定名(比如"com.mypackage.MyMapper.selectAllThings")將被直接查找并且找到即用。
- 短名稱(比如"selectAllThings")如果全局唯一也可以作為一個(gè)單獨(dú)的引用。如果不唯一,有兩個(gè)或兩個(gè)以上的相同名稱(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings”), 那么使用時(shí)就會(huì)收到錯(cuò)誤報(bào)告說短名稱是不唯一的,這種情況下就必須使用完全限定名。
如果使用短名稱,且不唯一則會(huì)拋出以下異常
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>
以下代碼則會(huì)拋出
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命名空間錯(cuò)誤
項(xiàng)目場景
使用mybatis配置完成基本的增加操作
問題描述
運(yùn)行測試添加方法的時(shí)候報(bào)錯(cuò):
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'.
原因分析
進(jìn)行翻譯了一下,可以粗略的知道命名空間錯(cuò)了

解決方案
修改命名空間,找到mapper的xml文件修改名稱空間
修改前:我用的是實(shí)體類

修改后mapper接口類

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Rxjava+Retrofit+MVP實(shí)現(xiàn)購物車功能
這篇文章主要為大家詳細(xì)介紹了Rxjava+Retrofit+MVP實(shí)現(xiàn)購物車功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Java實(shí)戰(zhàn)個(gè)人博客系統(tǒng)的實(shí)現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+springboot+mybatis+redis+vue+elementui+Mysql實(shí)現(xiàn)一個(gè)個(gè)人博客系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01
SpringBoot攔截器與文件上傳實(shí)現(xiàn)方法與源碼分析
其實(shí)spring boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要注意下就ok了。本文主要給大家介紹了關(guān)于如何在Springboot實(shí)現(xiàn)登陸攔截器與文件上傳功能,需要的朋友可以參考下2022-10-10
使用Spring Initializr創(chuàng)建Spring Boot項(xiàng)目沒有JDK1.8的解決辦法
很久沒創(chuàng)建springboot項(xiàng)目,今天使用idea的Spring Initializr 創(chuàng)建 Spring Boot項(xiàng)目時(shí),發(fā)現(xiàn)java版本里,無法選擇jdk1.8,只有17、21、22,所以本文介紹了使用Spring Initializr創(chuàng)建Spring Boot項(xiàng)目沒有JDK1.8的解決辦法,需要的朋友可以參考下2024-06-06
分析xxljob登入功能集成OIDC的統(tǒng)一認(rèn)證
這篇文章主要為大家介紹分析xxljob登入功能集成OIDC的統(tǒng)一認(rèn)證的詳解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
spring aop之@AfterReturning不生效問題及解決
這篇文章主要介紹了spring aop之@AfterReturning不生效問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
freemarker簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
FreeMarker是一個(gè)模板引擎,一個(gè)基于模板生成文本輸出的通用工具,使用純Java編寫,有興趣的可以了解一下2017-08-08
Java隊(duì)列同步器之CountDownLatch實(shí)現(xiàn)詳解
這篇文章主要介紹了Java隊(duì)列同步器之CountDownLatch實(shí)現(xiàn)詳解,CountDownLatch是一個(gè)同步工具類,它允許一個(gè)或多個(gè)線程一直等待,直到其他線程執(zhí)行完后再執(zhí)行,例如,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動(dòng)框架服務(wù)的線程已經(jīng)啟動(dòng)所有框架服務(wù)之后執(zhí)行,需要的朋友可以參考下2023-12-12

