文档章节

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

Mercy_丶
 Mercy_丶
发布于 2016/02/04 09:37
字数 679
阅读 45
收藏 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
码字总数 15400
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spark core基础

Spark RDD的五大特性 RDD是由一系列的Partition组成的,如果Spark计算的数据是在HDFS上那么partition个数是与block数一致(大多数情况) RDD是有一系列的依赖关系,有利于Spark计算的容错 RDD中每...

张泽立
35分钟前
0
0
如何搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已...

Java大蜗牛
50分钟前
0
0
ffplay 播放 rtsp地址

D:\ffmpeg\ffmpeg\bin ffplay.exe 播放rtsp地址: ffplay.exe -rtsp_transport tcp "rtsp://ip:port/pag://172.16.0.11:7302:33000000001310001748:1:SUB:TCP?cnid=2&pnid=2&auth=50&streamf......

yizhichao
55分钟前
3
0
[Jekyll] permalink -- 修改文章的链接地址

在我的个人博客中访问这篇文章时,你有注意到地址栏中显示的地址吗?它应该是这样的: https://cometeme.github.io/jekyll/2018/08/Jekyll-为文章设置永久链接.html 。打开其他的文章,可以看...

cometeme
56分钟前
0
0
启动mango数据库批处理

::启动mango数据库set dbdir=c:\mongodb\dataif not exist %dbdir% md %dbdir%c:cd c:\mongodbmongod.exe --dbpath %dbdir%...

江湖令
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部