文档章节

Spring4+Mybatis3+PostgreSql整合中遇到的问题

Mercy_丶
 Mercy_丶
发布于 2016/02/04 09:37
字数 679
阅读 41
收藏 0
点赞 2
评论 0


1、首先说一下SqlSessionDaoSupport的问题,在mybatis-spring1.1的时候我们直接这样写:

@Repository
public class PersonnelDaoImpl extends SqlSessionDaoSupport implements
		PersonnelDao {

	@Override
	public Personnel getById(Integer id) {
		return this.getSqlSession().selectOne(
				"com.sanmina.tms.entity.Personnel.getById", id);

	}
}

只需加上@Respositry 就可以了。但是在mybatis-spring1.2以后SqlSessionDaoSupport的源码有所改动(具体改动自己看源码),也就是说用上面的这种做法就会报错,如下:

Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
	at org.springframework.util.Assert.notNull(Assert.java:112)
	at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:74)
	at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)
	... 12 more

所以我们就要在原来的代码上加上一点东西如下,自动加上sqlSessionFactory。

@Repository
public class PersonnelDaoImpl extends SqlSessionDaoSupport implements
		PersonnelDao {

	@Override
	public Personnel getById(Integer id) {
		return this.getSqlSession().selectOne(
				"com.sanmina.tms.entity.Personnel.getById", id);

	}

	@Override
	@Autowired
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
		super.setSqlSessionFactory(sqlSessionFactory);
	}
}

直接重写setSqlSessionFactory()方法,并加上@Autowired。Ok!

继续往下走,问题又来了:

2、mybatis 的mapping.xml中的resultMap和resultType的问题:

Caused by: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.sanmina.tms.entity.Personnel.getById'.  It's likely that neither a Result Type nor a Result Map was specified.
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.validateResultMapsCount(DefaultResultSetHandler.java:234)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:157)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:78)
	at org.apache.ibatis.executor.BatchExecutor.doQuery(BatchExecutor.java:91)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)

原因是我的xml里没有写resultMap或者resultType:

<select id="getById"  parameterType="Integer" >
		select * from tb_personnel where id = #{id}
</select>

于是我加上:

<select id="getById"  parameterType="Integer" resultMap="Personnel">
		select * from tb_personnel where id = #{id}
</select>

问题又来了:

Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.sanmina.tms.entity.Personnel.personnel
	at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:818)
	at org.apache.ibatis.session.Configuration.getResultMap(Configuration.java:570)
	at org.apache.ibatis.builder.MapperBuilderAssistant.setStatementResultMap(MapperBuilderAssistant.java:356)
	... 17 more

原因是resultMap需要自己配置,于是我又加上了如下的配置:

<resultMap type="Personnel" id="personnel">
</resultMap>
	<select id="getById"  parameterType="Integer" resultMap="personnel">
		select * from tb_personnel where
		id = #{id}
	</select>

心想这个TM总能走了吧。于是结果如下:

Personnel [id=1, employeeID=null, companyID=null, cnName=null, department=CDC IT, section=SFDC team, positonName=null, superiorName=null, remarkDesc=null, emClassic=null]

长吁一口气,终于出来结果了。。。TM再仔细一数据,怎么有的是null,在查数据库明明不是null啊。真是日了狗...于是接着走。终于找到问题所在:因为我的实体类的有的字段和数据表的字段不是对应的,所以我们要将字段配置对应关系: 如下

<resultMap type="Personnel" id="personnel">
		<id property="id" column="id"/>
		<result property="employeeID" column="employee_id"/>
		<result property="companyID" column="company_id"/>
		<result property="cnName" column="cn_name"/>
		<result property="positonName" column="position_name"/>
		<result property="superiorName" column="superior_name"/>
		<result property="remarkDesc" column="remark_desc"/>
		<result property="emClassic" column="em_classic"/>
	</resultMap>
	<select id="getById"  parameterType="Integer" resultMap="personnel">
		select * from tb_personnel where
		id = #{id}
	</select>

在走!:

Personnel [id=1, employeeID=1016969, companyID=22222, cnName=Mercy, department=CDC IT, section=SFDC team, positonName=programer, superiorName=Tommy, remarkDesc=XXX, emClassic=IDE]

终于TM的Ok了,容我喝口水先......

源码的git地址:https://git.oschina.net/mercy_yang/SMP-Demo   

© 著作权归作者所有

共有 人打赏支持
Mercy_丶
粉丝 7
博文 36
码字总数 15339
作品 0
JFinal 整合 Shiro

最近整合JFinal和Shiro遇到的问题,希望能给你们提示与帮助。 首先,JFinal和Shiro本人都是刚刚接触,JFinal上手很快,但Shiro上手比较费劲,看了很长时间的文档。 下面说一下整合JFinal配置...

小鲅鱼 ⋅ 2013/06/02 ⋅ 10

spring osgi 依赖奇怪问题

你好@bittyant: 看到你的一个帖子“spring osgi 依赖奇怪问题,大家有没遇到过?” 。我也遇到了同样的问题。我的工程是也是通过maven工程构建的,工程需要的jar包通过pom文件都已经获得,在...

lyos ⋅ 2011/11/25 ⋅ 1

Httl和JFinal整合遇到的问题

初学httl和JFinal,在整合时遇到了一些问题,希望碰到过的帮忙解答一下。 JFinal整合httl之后,在使用httl中的render()方法进行跳转时,总是提示不能初始化参数,错误代码如下, com.jfinal...

亦剑灬 ⋅ 2015/04/15 ⋅ 1

iOS cocos2dx工程和原生工程整合

在原生工程中需要用到一个动画场景画面,然后就用cocos2dx来实现了动画场景,现在想把原生的工程整合到cocos2dx里面去,但是原生工程里面引用的第三方库放到cocos2sx工程里面之后,遇到很多语...

生姜可乐 ⋅ 2015/10/22 ⋅ 0

maven整合多个web工程

最近在用maven实验,结果遇到一个问题,我有多个web模块的工程和多个jar工程,在用tomcat发布的时候,如何整合多个模块的web工程。 工程结构如下 总工程 p-all(tomcat运行) 子工程web(spr...

boy1064910 ⋅ 2013/04/20 ⋅ 0

SpringMVC,mybatis,spring整合

需求:使用SpringMVC和mybatis完成商品列表查询 一 整合思路 1 相关jar包(maven) 2 整合dao层 mybatis和springmvc整合,通过spring管理mapper接口 使用mapper的扫描器自动扫描mapper接口在...

Bbigbug ⋅ 04/25 ⋅ 0

关于axis2与j2EE整合的问题 求高人指点

按照网上的做法将axis2 整合到web工程中 不用打aar包 遇到了问题 将axis2.war解压将对应的文件拷贝到web工程中

Zofda ⋅ 2011/09/01 ⋅ 1

mongodb 做关键字查询 进来随便说说吧

rt,要在mongodb中查询关键字,有没有什么好的方案,尝试用solr整合mongodb,遇到了问题,求破。。。

Devqin ⋅ 2013/05/06 ⋅ 3

(spring)org/objectweb/asm/Type

调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/asm/Type 解决方法1: 原因是Spring中的cglib-nodep-2.x.x.jar与Hibernate中的cglib-2.2.jar相冲突! 两种框架整合时Spring中的cgl...

executor ⋅ 2014/12/15 ⋅ 0

spring使用context:property-placeholder载不进属性问题

环境:spring3.1.1+mybatis3.2.8+mybatis-spring1.2.3 今天整合了SpringMVC + MyBatis,发现了一个问题,在这里做个记录,各位如果遇到相同的问题,可以参考下。 <!-- 引入jdbc配置文件 --> ...

wangbiglei ⋅ 2015/08/08 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

服务网关过滤器

过滤器作用 我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会...

明理萝 ⋅ 15分钟前 ⋅ 1

【2018.06.21学习笔记】【linux高级知识 14.1-14.3】

14.1 NFS介绍 NFS服务全称是NetWork File System:网络文件系统,最早有sun公司开发的,4.0版本由Netapp公司开发,是基于RPC远程过程调用(Remote Procedure Call)协议的服务。 14.2 NFS服务...

lgsxp ⋅ 24分钟前 ⋅ 0

Day18 vim编辑模式、命令模式与练习

编辑模式 命令模式 :nohl 不高亮显示 :x与:wq类似,如果在更改文件之后操作,两者效果一样;如果打开文件,没有任何操作; :wq会更改mtime,但是:x不会。 练习题 扩展 vim的特殊用法 ht...

杉下 ⋅ 27分钟前 ⋅ 0

Enum、EnumMap、EnumSet

1、Enum 不带参数 public enum Car { AUDI { @Override public int getPrice() { return 25000; } }, MERCEDES { ......

职业搬砖20年 ⋅ 28分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 29分钟前 ⋅ 0

线程组和 ThreadLocal

前言 在上面文章中,我们从源码的角度上解析了一下线程池,并且从其 execute 方法开始把线程池中的相关执行流程过了一遍。那么接下来,我们来看一个新的关于线程的知识点:线程组。 线程组 ...

猴亮屏 ⋅ 31分钟前 ⋅ 0

相对路径和绝对路径

基本概念   文件路径就是文件在电脑中的位置,表示文件路径的方式有两种,相对路径和绝对路径。在网页设计中通过路径可以表示链接,插入图像、Flash、CSS文件的位置。   物理路径:物理路...

临江仙卜算子 ⋅ 35分钟前 ⋅ 0

消息队列属性及常见消息队列介绍

什么是消息队列? 消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储,一个队列的消息可以同时被多个消息消费者消费。分布式消息服务DMS则是分布式的队列系统,消...

中间件小哥 ⋅ 37分钟前 ⋅ 0

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器...

笔阁 ⋅ 37分钟前 ⋅ 0

vim编辑模式、vim命令模式

vim编辑模式 使用vim filename 进入的界面是一般模式,在这个模式下虽然我们能够查看,复制,剪切,粘贴,但是不能编辑新的内容,如何能直接写入东西呢?这就需要进入编辑模式了,从一般模式...

李超小牛子 ⋅ 40分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部