解決Mybatis報Type interface *.*Mapper is not known to the MapperRegis
- 問題發現
- 問題解決
- 方法一:檢查Mapper文件的namespace路徑是否正確
- 方法二:使用其他方法是否正確
問題發現
在學習MyBatis框架的時候,不使用 XML 構建 SqlSessionFactory,調用Mapper的接口,報類型接口沒有注冊。
示例代碼如下:
public class Test {public static void main(String[] args) throws IOException {DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/spring_data?characterEncoding=utf-8&useSSL=false", "root", "123456");TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(environment);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> users = userMapper.selectByUser();// 關閉 SqlSessionsqlSession.close();}
}
public interface UserMapper {List<User> selectByUser();
}
<?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.example.mybatisstudy.dao.UserMapper"><select id="selectByUser" resultType="com.example.mybatisstudy.User">select * from user;</select>
</mapper>
網上說都是命名空間的錯誤,發現命名空間也沒問題。然后進行一系列的問題排查。
問題解決
方法一:檢查Mapper文件的namespace路徑是否正確
這也是網上解決方法最多的一種,貌似大部分人都是遇到這種錯誤。
- 先確認映射的類名是否正確。
- 在確認包路徑使用的
.
點(com.*.*.Object
)而不是/
左斜杠(com/*/*/Object
)或\
右斜杠(com\*\*\Object
),如果錯誤請修改為.
點。 - 如果鼠標懸浮到路徑上,顯示下劃線說明配置正確。
如圖所示
方法二:使用其他方法是否正確
后面切換到,使用XML 中構建 SqlSessionFactory方法,示例代碼如下:
public class Test {public static void main(String[] args) throws IOException {DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/spring_data?characterEncoding=utf-8&useSSL=false", "root", "123456");TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(environment);configuration.addMapper(UserMapper.class);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);SqlSession sqlSession = sqlSessionFactory.openSession();List<User> selectByUser = sqlSession.selectList("selectByUser");// 關閉 SqlSessionsqlSession.close();}
}
運行成功,如圖所示
然后逐個代碼排除,根據錯誤提示(未注冊)發現少了configuration.addMapper()
方法的代碼,加上后,運行成功。
示例代碼如下
public class Test {public static void main(String[] args) throws IOException {DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/spring_data?characterEncoding=utf-8&useSSL=false", "root", "123456");TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(environment);configuration.addMapper(UserMapper.class);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> users = mapper.selectByUser();// 關閉 SqlSessionsqlSession.close();}
}
問題解決。
最開始看官網給的代碼片段,以為可以去掉addMapper的步驟,后來才想起不注冊的話怎么獲取呢?嘖~還是太粗心了呀!!!