Mybatis中接口和对应的mapper文件不同目录的配置解决

本文分享了作者在学习MyBatis一二级缓存过程中遇到的问题及解决方案,包括mapper配置错误排查、mybatis配置文件调整、XML映射文件打包设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学习mybatis的一二级缓存时,根据网上视频使用select查询语句操作遇到的一些问题,我是单独用mybaits(版本3.5.1)的测试时(没有和spring集成),遇到如下报错:

 Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for  你的项目中mapper的接口方法。报错的意思是说在mapper.xml中没有找到mapper接口中的方法。

通过在网上寻找解决方法时,根据踩坑经历总结的方法如下:

(1)mapper的xml文件中是否配置了namespace,配置是否正确(需要写到类名),同时保证mapper.java和mapper.xml的文件名相同。如我的项目中使用如截图。

(2)mapper.xml文件中方法的id与mapper接口文件中的方法名一致,方法名不能重复。

(3)mapper.xml文件方法的resultType,resultMap等参数配置是否正确。

(4)在项目中创建mapper接口和mapper.xml的文件是否在同一目录。因为两者文件在同一目录和不同目录的配置是有差异的。我就是在这问题上找了好久的blog才解决。

如果两者文件在同一目录,mybatis配置文件如下:

<?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>
	<properties resource="jdbc.properties"/>
    <settings>
        <!-- 打印mybatis执行的日志信息-->
		<setting name="logImpl" value="STDOUT_LOGGING" />
	</settings>
	<!-- 通过包扫描的方式配置别名 -->
    <typeAliases>
        <package name="com.tfq.springaop.entity"></package>
    </typeAliases>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!-- UNPOOLED是没有数据库连接池的,每执行一次操作,打开一次数据库,关闭一次数据库.效率较为低下
            	 POOLED是存在数据库连接池的,没有操作数据库从数据库连接池中拿取连接
            	 JNDI这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上
             -->            
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- mapper映射器,映射包下所有接口(较为常用)-->
    <mappers>
    	<!-- 扫描包下的接口文件 -->
        <package name="com.tfq.springaop.dao"/>
    </mappers>
    
</configuration>

我的项目的结构如下:

如果你的mapper接口和mapper.xml的文件不在同一目录,mybatis配置文件如下:

<?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>
	<properties resource="jdbc.properties"/>
    <!-- 打印mybatis执行的日志信息-->
    <settings>
		<setting name="logImpl" value="STDOUT_LOGGING" />
	</settings>
	<!-- 通过包扫描的方式配置别名 -->
    <typeAliases>
        <package name="com.tfq.springaop.entity"></package>
    </typeAliases>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!-- UNPOOLED是没有数据库连接池的,每执行一次操作,打开一次数据库,关闭一次数据库.效率较为低下
            	 POOLED是存在数据库连接池的,没有操作数据库从数据库连接池中拿取连接
            	 JNDI这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上
             -->            
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- mapper映射器,映射包下所有接口(较为常用)-->
    <mappers>
    	<!-- 扫描路径下的mapper映射文件 -->
        <mapper resource="com/tfq/springaop/mapper/UserMapper.xml"/>
    </mappers>
    
</configuration>

我的项目的结构如下:

如果mapper.xml文件在src/main/java目录下,由于maven默认在此目录下不打包xml文件,所以在pom.xml中要配置如下代码:

<build>
  <resources>
    <!-- maven把java文件夹下的代码打包到class文件目录 -->
    <resource>
		<directory>src/main/java</directory>
		<includes>
			<include>**/*.xml</include>					
		</includes>
		<filtering>false</filtering>
	</resource>
  </resources>
</build>

我的测试类代码:

package com.tfq.springaop;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.tfq.springaop.controller.CarController;
import com.tfq.springaop.entity.User;

/**
 *
 * @description 测试mybatis的一二级缓存demo
 * @author tangfq;
 * @version 2020年6月20日 下午12:05:48
 *
 **/

public class TestMybatis {

	private static Logger logger = LoggerFactory.getLogger(TestMybatis.class);
	
	@Test
	public void test() throws IOException {
		InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
				.build(inputStream);
		SqlSession sqlSession=sqlSessionFactory.openSession();
		User u1=sqlSession.selectOne("com.tfq.springaop.dao.UserMapper.getById",1);
		logger.info("打印对象u1,{}",u1);
		System.out.println("打印对象u1="+u1);
		User u2=sqlSession.selectOne("com.tfq.springaop.dao.UserMapper.getById",1);
		logger.info("打印对象u2,{}",u2);
		System.out.println("打印对象u2="+u2);
		
	}

}

执行结果如下:

以上为单独使用mybatis的总结。如果写得有纰漏之处,请大家留言指正。

 

 

MyBatis配置mapper接口XML文件的关联,通常需要遵循以下步骤: 1. 创建Mapper接口:首先,你需要创建一个普通的Java接口,这个接口中定义了各种你需要执行的数据库操作方法。例如,如果你要操作用户表,可以定义一个名为UserMapper接口。 2. 编写XML映射文件:接着,你需要编写一个与Mapper接口同名的XML文件,通常放在与Mapper接口相同的包路径下。在这个XML文件中,你需要配置具体的SQL语句,并通过`<select>`、`<insert>`、`<update>`、`<delete>`等标签来定义各个方法对应的SQL操作。例如,如果UserMapper接口中有一个方法是获取用户信息,那么在UserMapper.xml中就会有一个`<select>`标签对应的SQL查询语句。 3. 配置文件关联:为了让MyBatis知道mapper接口XML文件之间的关系,你需要在MyBatis的全局配置文件(通常是mybatis-config.xml)中,使用`<mappers>`标签来注册mapper接口的位置。可以通过`<mapper resource="完整路径/UserMapper.xml"/>`来指定XML文件的位置。 4. 使用SqlSessionFactoryBuilder构建SqlSessionFactory:MyBatis使用SqlSessionFactory来构建SqlSession,而SqlSession负责实际的数据库操作。你需要使用SqlSessionFactoryBuilder来根据MyBatis全局配置文件构建SqlSessionFactory。 5. 通过SqlSession获取Mapper代理:通过SqlSession对象,你可以调用getMapper()方法,并传入Mapper接口的Class对象,从而获取到这个接口的动态代理对象。之后就可以直接调用接口方法,MyBatis会根据提供的信息完成SQL的执行。 示例代码如下: **UserMapper.java** ```java public interface UserMapper { User selectUserById(int id); int insertUser(User user); // 其他方法... } ``` **UserMapper.xml** ```xml <mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="com.example.model.User"> SELECT * FROM users WHERE id = #{id} </select> <insert id="insertUser"> INSERT INTO users(name, age) VALUES (#{name}, #{age}) </insert> <!-- 其他SQL配置... --> </mapper> ``` **mybatis-config.xml** ```xml <configuration> <!-- 其他配置... --> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> <!-- 其他mapper配置... --> </mappers> </configuration> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值