我尝试了一种新的开发方法。 在mybatis3中,我通常会编写mapper.java和mapper.xml。 我知道,sql语句对应于sqlId(namespace + id)。 我想像这样执行sql语句:
SqlSession sqlSession = sessionFactory.openSession();
return sqlSession.selectList(sqlId, param);
但是我收到了错误:
Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for mapper.JinBoot.test
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at cn.tianyustudio.jinboot.dao.BaseDao.select(BaseDao.java:20)
at cn.tianyustudio.jinboot.service.BaseService.select(BaseService.java:10)
at cn.tianyustudio.jinboot.controller.BaseController.test(BaseController.java:21)
这是我的BaseDao.java
public class BaseDao {
private static SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
public static List<Map> select(String sqlId, Map param) {
try {
factoryBean.setDataSource(new DruidDataSource());
SqlSessionFactory sessionFactory = factoryBean.getObject();
SqlSession sqlSession = sessionFactory.openSession();
return sqlSession.selectList(sqlId, param);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
这里是UserMapper.xml
<mapper namespace="mapper.JinBoot">
<select id="test" parameterType="hashMap" resultType="hashMap">
select * from user
</select>
</mapper>
application.properties
mybatis.mapperLocations=classpath:mapper/*.xml
我启动项目,发送一个http请求,在控制器和服务之后,param&#39; sqlId&#39;在BaseDao中是mapper.JinBoot.test&#39; (见错误信息)。
在方法&#39; BaseDao.select&#39;中,参数和结果类型都是Map。
所以我不想创建UserMapper.java,我想尝试一下。
我该如何解决?这种弊端是什么?
答案 0 :(得分:0)
这不起作用,因为spring boot会创建自己的SqlSessionFactory
。 application.properties
中指定映射器应该在哪里查找的选项仅设置为SqlSessionFactory
。您正在DAO中创建不相关的会话工厂,并且它不知道在何处加载映射器定义。
如果你想让它工作,你需要DAO是弹簧管理的,这样你就可以将mybatis会话工厂注入其中并在select
中使用它。这还需要您将select
转换为非静态方法。
据我所知,你想在你的DAO类中只有一个方法,并在个别特定的DAO类中使用它。我想说这没什么意义。如果该方法返回Map
,则会有一些地方实际将此泛型类型映射到某些特定于应用程序的类型。这可能是在儿童DAO中。因此,您仍然需要使用使用某些输入参数的签名创建子DAO的API并返回一些域对象。而这正是你想通过不创建mybatis映射器类来避免的。
问题是您可以将mytabis地图制作者视为DAO。那就是你的映射器将是你的DAO。而且你不需要另一层。据我所知,你现在有两个独立的层 - DAO和映射器,你想删除样板代码。我认为删除DAO类更好。它们是真正的样板,mybatis映射器可以完美地充当DAO。您直接将它注入服务和服务仅依赖于mapper类。映射的逻辑在mapper xml文件中。另请参阅此问题的答案Can Spring DAO be merged into Service layer?