⚠️ mybatis使用package方式映射mapper报错
文章目录
在初学mybatis通过junit测试功能时系统一直报
Mapped Statements collection does not contain value for pers.dhx_.DAO.UserMapper.insertUser
大概意思是mybatis无法找到UserMapper的映射文件
也就是识别UserMapper.xml过程中出问题了
测试的代码如下:
@Test
public void test1() throws Exception{
// 获取核心配置文件的输入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
// 获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(is);
// 获取Sql 的会话对象 -- > SqlSession , 是mybatis提供操作数据库的核心对象
SqlSession sqlSession = sqlSessionFactory.openSession(true); // 将参数设置为true , 就是开启了自动提交
// 通过sqlSession获取UserMapper的代理实现对象 ,这个方法的底层 用的是代理模式, 实现的Mapper接口的一个代理实现类,重写了接口的方法(通过映射文件)
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
System.out.println(mapper.insertUser());
// sqlSession.commit(); // 提交事务
sqlSession.close(); // 关闭会话
}
- 原本是将UserMapper.xml放在resources目录下
UerMapper.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="pers.dhx_.mapper.UserMapper" > <!--对应 相应的接口-->
<!--
mapper 接口和映射文件一致
1.mapper接口的全类名要和mapper保持一致
2.接口中的方法名要和标签中的id 保持一致
-->
<!-- int insertUser() 方法名要和id 一致-->
<insert id="insertUser">
insert into t_user values(null,'admin1','123456',23,'男','12345@qq.com')
</insert>
</mapper>
后来查阅资料发现错误原因是, 如果使用package标签映射mapper文件 , resources目录和java目录中的 xml文件要与 接口对应
看图就明白了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0LaLpEUl-1658302227614)(E:\Typora\image\image-20220720151037375.png)]
教程里面的老师没有说这个 ,但是也应该注意
👉其他映射mapper的方法
1️⃣mapper标签使用resource映射
mybatis-config.xml
- resource
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--设置连接数据库的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="pers/dhx_/mapper/UserMapper.xml"/>
</mappers>
</configuration>
附上resources目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ocsQvtaj-1658302227615)(E:\Typora\image\image-20220720151516654.png)]
2️⃣mapper标签使用class映射
class 注意要写全类名
需要注意的是这里需要在接口的方法上面写上对应的注解
UserMapper.java
package pers.dhx_.mapper;
import org.apache.ibatis.annotations.Insert;
/**
* @author Dhx_
* @className UserMapper
* @description TODO
* @date 2022/7/20 15:09
*/
public interface UserMapper {
@Insert(value = "insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')")
int insertUser();
}
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--设置连接数据库的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper class="pers.dhx_.mapper.UserMapper"/>
</mappers>
</configuration>
3️⃣mapper标签使用url映射
其实就是使用绝对路径
- 一般情况下不会使用这种方式,了解即可
<configuration>
<mappers>
<mapper url="file:///C:/User/lenovo/Desktop/mappers/UserMapper" />
</mappers>
</configuration>