最近的一个项目使用到了Ibatis这个基于Java的持久层框架,着实让我费了不少心,现在把几个常遇到的几个问题列在下面:
1)对于与数据库表字段的映射,如果表字段命名中有下划线,这个时候如果做该字段的查询,发现每次都返回的是空值,即便是表中有该字段且不为空。
------为了解决这个问题,需要使用Ibatis的resultMap在其配置文件中进行映射的工作,这点倒和Hibernate相似,当然也更合常理,因为毕竟有的时候类属性的命名可能和数据库表字段的命名不一样,但是对于Ibatis来说,使用resultMap比较耗时,所以它采取的机制是使用和表字段相同的方式。
2)在使用ResultMap映射机制的时候,第一次出现的问题可能是以下这种错误(实例+错误):
- <sqlMap namespace="JobSOURCE">
- <resultMap id = "map" class="com.***。JobSource">
- <result property="source" column="Source"></result>
- <result property="job" column="Job"></result>
- </resultMap>
- <select id="getJobSourceRunInfo" resultMap="result"
- parameterClass="com.***。JobSource"
- >
- SELECT Job FROM Job_Source
- WHERE JOB_SYS = #jobSys# AND CONF = #conF#
- </select>
- Caused by: com.ibatis.sqlmap.client.SqlMapException: There is no result map named JobSOURCE.result in this SqlMap.
- at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.getResultMap(SqlMapExecutorDelegate.java:357)
- at com.ibatis.sqlmap.engine.builder.xml.SqlStatementParser.parseGeneralStatement(SqlStatementParser.java:72)
- at com.ibatis.sqlmap.engine.builder.xml.SqlMapParser$22.process(SqlMapParser.java:581)
- at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:121)
- ... 16 more
------这个问题主要是因为在sqlMap_***.xml配置文件中并没有添加resultMap机制或者还有就是你引用resultMap id的时候写错了。上面的出错的原因就是明明resultMap id=map,而自己却写成了result,这就是很典型的低级错误。改写后如下:
- <sqlMap namespace="JobSOURCE">
- <resultMap id = "map" class="com.***。JobSource">
- <result property="source" column="Source"></result>
- <result property="job" column="Job"></result>
- </resultMap>
- <select id="getJobSourceRunInfo" resultMap="map"
- parameterClass="com.***。JobSource"
- >
- SELECT Job FROM Job_Source
- WHERE JOB_SYS = #jobSys# AND CONF = #conF#
- </select>
- </sqlMap>
3)不幸地是,一个问题解决并不代表就没有问题了,现在又出现了下面这种错误:
- The error occurred in sqlMap_jobSource.xml.
- --- The error occurred while applying a result map.
- --- Check the JobSOURCE.map.
- --- Check the result mapping for the 'source' property.
- --- Cause: java.sql.SQLException: 列名无效
- at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:185)
- at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)
- at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:566)
- at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:541)
- at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
- at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:83)
-------搞了半天,才发现Ibatis resultMap这种字段映射机制存在这样的问题,就是当你在配置文件中定义了source和job这两个字段的映射,而在select语句中只需要选择job这一个字段,这时候就会出现source列名无效的问题,为了解决这个问题,有两种方式,第一种就是将source这个映射行去除;第二种就是将select语句改变,也就是将select job改成select *,这样就会将映射字段全部对应上。
每种架构都有其优势,当然也必然存在不合理的地方或是更加确切地说是对于新手不知道的其机制应用场景,所以多花时间研究研究就能发现和解决问题!
阅读(3034) | 评论(0) | 转发(0) |