关于SQL Mapper的namespace
视频总结笔记:
在SQL Mapper配置文件中<mapper>标签的namespace属性可以翻译为命名空间,这个命名空间主要是为了防止SQL id 冲突的。
创建CarMapper2.xml文件,代码如下:
CarMapper2.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="car2"><select id="selectCarAll" resultType="com.powernode.mybatis.pojo.Car">selectid, car_num as carNum, brand, guide_price as guidePrice, produce_time as produceTime, car_type as carTypefromt_car</select>
</mapper>
不难看出,CarMapper.xml和CarMapper2.xml文件中都有 id="selectCarAll"
将CarMapper2.xml配置到mybatis-config.xml文件中。
mybatis-config.xml:
<mappers><mapper resource="CarMapper.xml"/><mapper resource="CarMapper2.xml"/>
</mappers>
编写Java代码如下:
CarMapperTest.testNamespace:
@Test
public void testNamespace(){// 获取SqlSession对象SqlSession sqlSession = SqlSessionUtil.openSession();// 执行SQL语句List<Object> cars = sqlSession.selectList("selectCarAll");// 输出结果cars.forEach(car -> System.out.println(car));
}
运行结果如下:
异常信息:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IllegalArgumentException: selectCarAll is ambiguous in Mapped Statements collection (try using the full name including the namespace, or rename one of the entries) 【翻译】selectCarAll在Mapped Statements集合中不明确(请尝试使用包含名称空间的全名,或重命名其中一个条目)【大致意思是】selectCarAll重名了,你要么在selectCarAll前添加一个名称空间,要有你改个其它名字。
ava代码修改如下:
CarMapperTest.testNamespace:
@Test
public void testNamespace(){// 获取SqlSession对象SqlSession sqlSession = SqlSessionUtil.openSession();// 执行SQL语句//List<Object> cars = sqlSession.selectList("car.selectCarAll");List<Object> cars = sqlSession.selectList("car2.selectCarAll");// 输出结果cars.forEach(car -> System.out.println(car));
}
运行结果如下: