ibatis简单例子求助。

失落夏天
Android领域优质创作者
博客专家认证
2013-04-08 02:43:37
以前没学过ibatis的,虽然知道这东西将要被淘汰,但是现在的工作环境下用的就是ibatis。所以想想还是学学吧。以前只是调用人家写好的现成的dao层的。
今天试了一个例子,报错空指针,求助。
xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD sql Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="test/test_user">
<typeAlias alias="user" type="test.entity.User" />
<!-- Use primitive wrapper type (e.g. Integer) as parameter and allow results
to be auto-mapped results to Person object (Java Bean) properties -->
<select id="getUser" parameterClass="int" resultClass="user">
SELECT id,name,descs,address
FROM test_user
WHERE id = #value#
</select>
</sqlMap>

sql数据库:

执行代码:

public static void main(String[] args) {
try {
com.ibatis.sqlmap.client.SqlMapClient sqlMap = null;
String resource = "sqlmap.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
// 显示一条记录
//getNameSpace() + "." + sqlName
//第一种方式,
List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser","10");
System.out.println(list.get(0).getName());
//第二种方式
// User user = (User) sqlMap.queryForObject("test/test_user.getUser","10");
// System.out.println(user.getName());

} catch (Exception e) {
e.printStackTrace();
}
}


最后报错:
java.lang.NullPointerException
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.endTransaction(SqlMapExecutorDelegate.java:734)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.endTransaction(SqlMapSessionImpl.java:176)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.endTransaction(SqlMapClientImpl.java:153)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.autoEndTransaction(SqlMapExecutorDelegate.java:835)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:574)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:541)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:94)
at test.IbatisTest.main(IbatisTest.java:21)
求助!
...全文
448 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenilu2011 2015-08-25
  • 打赏
  • 举报
回复
同样遇到这个问题,具体怎么实现的,能贴代码吗,
失落夏天 2013-04-20
  • 打赏
  • 举报
回复
这个问题最终解决了,其实不是我sql文的错误,错误的本身是借用了人家配置好的spring,但是我只是使用了dao层的对象,但是这个对象其实并没有被注入。所以报错。
forgetsam 2013-04-12
  • 打赏
  • 举报
回复
引用 13 楼 AA5279AA 的回复:
引用 11 楼 forgetsam 的回复:断点看sqlMap是不是null,是就是你主文件的问题。 断点进入到jar包中的class里面,可以确定应该是配置文件的问题。。
那就是 主文件配置错误或者路径错误或者jar包版本错误。
十年彩虹 2013-04-11
  • 打赏
  • 举报
回复
配置文件问题。用了spring? 你说下需求吧。是一个表的查询。单独用ibatis是吗。
失落夏天 2013-04-11
  • 打赏
  • 举报
回复
引用 10 楼 k_scott 的回复:
Java code?12345678910111213141516171819202122232425262728<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD sql Map 2.0//EN" "http://ibatis.apache.org/dtd/s……
结果测试了,报错一样的。。。 而且其实我需要的就是resultClass类型的
失落夏天 2013-04-11
  • 打赏
  • 举报
回复
引用 11 楼 forgetsam 的回复:
断点看sqlMap是不是null,是就是你主文件的问题。
断点进入到jar包中的class里面,可以确定应该是配置文件的问题。。
失落夏天 2013-04-11
  • 打赏
  • 举报
回复
引用 7 楼 ay2q9071 的回复:
引用 3 楼 bingLoVezi 的回复:Map args = new HashMap(); args.put("value", "10"); List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser",args); <select id="getUser" parameterClass="……
那样的话是返回值为空,应该这一句报错的:System.out.println(list.get(0).getName()); 应该不是这个原因,我是照着别的例子改的,而且基本上每种输入类型我都试过的
失落夏天 2013-04-11
  • 打赏
  • 举报
回复
引用 16 楼 liuxianqiu 的回复:
我在用ibatis的时候 我记得调用的话是select语句的ID吧,而不是namespace List<User> list = (List<User>) sqlMap.queryForList("getUser","10");
那是配置的问题,可以配置不带namespace,也可以配置带的
tianma630 2013-04-11
  • 打赏
  • 举报
回复
看代码 应该没有用到ibatis的事物 为什么会在endTransction里包空指针
liuxianqiu 2013-04-11
  • 打赏
  • 举报
回复
我在用ibatis的时候 我记得调用的话是select语句的ID吧,而不是namespace List<User> list = (List<User>) sqlMap.queryForList("getUser","10");
forgetsam 2013-04-09
  • 打赏
  • 举报
回复
断点看sqlMap是不是null,是就是你主文件的问题。
十年彩虹 2013-04-09
  • 打赏
  • 举报
回复

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD sql Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="test/test_user">
	<typeAlias alias="user" type="" />
	<!-- Use primitive wrapper type (e.g. Integer) as parameter and allow results 
		to be auto-mapped results to Person object (Java Bean) properties -->

<resultMap id="user" class="test.entity.User" >     
<result column="id" property="id" jdbcType="DOUBLE" />    
<result column="name" property="name" jdbcType="VARCHAR" />      
<result column="descs" property="descs" jdbcType="VARCHAR" />     
<result column="address" property="address" jdbcType="VARCHAR" />    
</resultMap> 


	<select id="getUser" parameterClass="int" resultClass="user">
		SELECT id,name,descs,address
		FROM test_user
		WHERE id = #value#
	</select>
        <select id="getUser" parameterClass="int" resultMap="user">
		SELECT id,name,descs,address
		FROM test_user
		WHERE id = #value#
	</select>
</sqlMap>

resultClass 改成 resultMap
十年彩虹 2013-04-09
  • 打赏
  • 举报
回复
resultClass 改成 resultMap
十年彩虹 2013-04-09
  • 打赏
  • 举报
回复


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD sql Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="test/test_user">
	<typeAlias alias="user" type="test.entity.User" />
	<!-- Use primitive wrapper type (e.g. Integer) as parameter and allow results 
		to be auto-mapped results to Person object (Java Bean) properties -->
	<select id="getUser" parameterClass="int" resultClass="user">
		SELECT id,name,descs,address
		FROM test_user
		WHERE id = #value#
	</select>
        <select id="getUser" parameterClass="int" resultMap="user">
		SELECT id,name,descs,address
		FROM test_user
		WHERE id = #value#
	</select>
</sqlMap>

resultClass 改成 resultMap
飞翔的猪头 2013-04-09
  • 打赏
  • 举报
回复
引用 3 楼 bingLoVezi 的回复:
Map args = new HashMap(); args.put("value", "10"); List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser",args); <select id="getUser" parameterClass="map" resu……
这里说的是接收返回,就算没对应也只是接收不到值而已, 报空指针是因为 sql 里面value 没有传 parameterClass="java.lang.Integer" List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser","10"); 改成List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser",value); 自己搞个int value=10,就可以了,现在报空指针是入参的错误,
FunnyRabbit87 2013-04-08
  • 打赏
  • 举报
回复
引用 5 楼 FunnyRabbit87 的回复:
parameterClass="int" 改成parameterClass="Integer" 试一试吧
不好意思加上包名 parameterClass="java.lang.Integer"
FunnyRabbit87 2013-04-08
  • 打赏
  • 举报
回复
parameterClass="int" 改成parameterClass="Integer" 试一试吧
失落夏天 2013-04-08
  • 打赏
  • 举报
回复
引用 2 楼 ay2q9071 的回复:
不好意思,没看清楚,貌似 这里的入参 List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser","10"); 要和 <select id="getUser" parameterClass="int" resultClass="user"> SELEC……
List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser","10"); 和 List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser",10);都试过。 不行的 报错空指针,而不是类型错误,感觉应该是哪里未实例化
洋小葱 2013-04-08
  • 打赏
  • 举报
回复
Map args = new HashMap(); args.put("value", "10"); List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser",args); <select id="getUser" parameterClass="map" resultClass="user"> SELECT id,name,descs,address FROM test_user WHERE id = #value# </select> id,name,descs,address这个值要跟user严格对应才行的!
飞翔的猪头 2013-04-08
  • 打赏
  • 举报
回复
不好意思,没看清楚,貌似 这里的入参 List<User> list = (List<User>) sqlMap.queryForList("test/test_user.getUser","10"); 要和 <select id="getUser" parameterClass="int" resultClass="user"> SELECT id,name,descs,address FROM test_user WHERE id = #value# </select> 的参数名称对应
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧