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();
}
}