文档章节

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

Mercy_丶
 Mercy_丶
发布于 2016/02/04 09:37
字数 679
阅读 49
收藏 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
博文 39
码字总数 15485
作品 0
JFinal 整合 Shiro

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

小鲅鱼
2013/06/02
7.3K
10
spring osgi 依赖奇怪问题

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

lyos
2011/11/25
721
1
Httl和JFinal整合遇到的问题

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

亦剑灬
2015/04/15
645
1
iOS cocos2dx工程和原生工程整合

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

生姜可乐
2015/10/22
262
0
maven整合多个web工程

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

boy1064910
2013/04/20
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之JSX(一)

转发 TypeScript基础入门之JSX(一) 介绍 JSX是一种可嵌入的类似XML的语法。 它旨在转换为有效的JavaScript,尽管该转换的语义是特定于实现的。 JSX在React框架中越来越受欢迎,但此后也看到了...

durban
39分钟前
0
0
JavaScript使用原型判断对象类型

1. constructor属性 在JavaScript创建对象(二)——构造函数模式中,我们说过可以使用对象的constructor属性判断对象的类型:p1.constructor === Person,可能当时就有细心的读者会想,我们...

Bob2100
41分钟前
1
0
10-《深度拆解JVM》JVM是怎么实现invokedynamic的?(下)

一、问题引入 上回讲到,为了让所有的动物都能参加赛马,Java 7 引入了 invokedynamic 机制,允许调用任意类的“赛跑”方法。不过,我们并没有讲解 invokedynamic,而是深入地探讨了它所依赖...

飞鱼说编程
今天
2
0
457. Circular Array Loop

Description Difficulty : Medium You are given an array of positive and negative integers. If a number n at an index is positive, then move forward n steps. Conversely, if it's n......

52iSilence7
今天
1
0
MySQL SQL 常见用法

某字段重复记录 select a.fieldA from tableA a group by a.fieldA having count(a.fieldA)>1;==select * from (select a.fieldA, count(1) as faCount from tableA a group......

园领T
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部