论坛首页 入门技术论坛

在ibatis的入门例子中就被卡住了

浏览 4764 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-12  

近来开始学习ibatis,好不容易找了些入门资料,却没想到ibatis的第一个例子上就卡住,先是从ibatis官方下的petstore5在resin-pro-3.0.22上运行不起来。

然后就是《ibatis开发指南》(夏昕: xiaxin(at)gmail.com)的第一个例子,代码照着敲进来,也不见能起来。

然后在JE上找到了这个

http://www.iteye.com/post/148076 (温柔一刀

这个还不是很坏,能运行,然而getAllUser读出来的记录数总是0,而数据库是有数据的。

这个User.xml中查询的配置代码:

xml 代码
  1. <select id="getAllUser" resultClass="user">  
  2. <!----> 
  3.     select   
  4.       name,   
  5.       sex   
  6.     from t_user WHERE name=#name#  
  7. ]]>  
  8. select>  

 

java代码段如下:

java 代码
  1. try {   
  2.     sqlMap.startTransaction();                 
  3.     user=sqlMap.queryForList("getAllUser"null);   
  4.     sqlMap.commitTransaction();   
  5. catch (SQLException e) {   
  6.     System.out.println(e.getMessage());   
  7. finally {   
  8.     try {   
  9.         sqlMap.endTransaction();   
  10.     } catch (SQLException e) {   
  11.         e.printStackTrace();   
  12.     }   
  13. }  

 

测试了几次取不到结果。开始找原因,

先是把

java 代码
  1. user=sqlMap.queryForList("getAllUser"null);  

中的参数null改成user2(新创建的一个User对象,其他setName("数据库中已存在字段值")),可以取到那条记录。

可以这里有个小问题,放后面说!!!!!!

 

第二种尝试,把User.xml中ID为getAllUser的SQL改成查询所有记录,这样可以取到所以的记录。

xml 代码
  1. <select id="getAllUser" resultClass="user">  
  2. <!----> 
  3.     select   
  4.     name,   
  5.     sex   
  6.     from t_user  
  7. ]]>  
  8. select>  

上面只有条件“WHERE name=#name#”给去掉了。

到了这里,我想,问题是不是出在SQL上?一开始JAVA那边传递过来的参数是null,而ibatis最终生成的SQL还是

“select name, sex from t_user WHERE name=null” ?

不过,以前在JE上无意中看到有文章说IBATIS可以做到自动取舍WHERE子句的,难道是记错了,百度,结果出来了,要做到动态取舍WHERE子句,User.xml中有关SQL的配置应该是这样:

xml 代码
  1. <select id="getAllUser" resultClass="user">  
  2. <!----> 
  3.     select   
  4.     name,   
  5.     sex   
  6.     from t_user  
  7. ]]>  
  8. <dynamic prepend="WHERE">  
  9.     <isNotEmpty property="name">name like '%$name$%'isNotEmpty>  
  10. dynamic>  
  11. select>  

 

这里特殊(模糊查询)了一点,如果是精切查询,是#而不是$符号了。

 

===

说说那个小问题:

如果 User.xml的getAllUser的配置是:

xml 代码
  1. <select id="getAllUser" resultClass="user">  
  2.     <!----> 
  3.    select   
  4.      name,   
  5.      sex   
  6.    from t_user WHERE name=#name#  
  7.    ]]>  
  8. select>  

 

那么

java 代码
  1. user=sqlMap.queryForList("getAllUser""某条记录name的值");  

 

java 代码
  1. User user2 = new User();   
  2. user2.setName("某条记录name的值");   
  3. try {   
  4.     sqlMap.startTransaction();                 
  5.     user=sqlMap.queryForList("getAllUser", user2);   
  6.     sqlMap.commitTransaction();   
  7. catch (SQLException e) {   
  8.     System.out.println(e.getMessage());   
  9. finally {   
  10.     try {   
  11.         sqlMap.endTransaction();   
  12.     } catch (SQLException e) {   
  13.         e.printStackTrace();   
  14.     }   
  15. }  

 

这两个都可以正常取到那条记录。

如果User.xml是:

xml 代码
  1. <select id="getAllUser" resultClass="user">  
  2.     <!----> 
  3.    select   
  4.      name,   
  5.      sex   
  6.    from t_user  
  7.    ]]>  
  8. <dynamic prepend="WHERE">  
  9.     <isNotEmpty property="name">name = #name#isNotEmpty>  
  10. dynamic>  
  11. select>  

,只能传递User对象作为参数了,

java 代码
  1. user=sqlMap.queryForList("getAllUser", user2);  

 

否则报错:

xml 代码
  1. --- The error occurred in com/ctgusec/zhupan/maps/User.xml.     
  2. --- The error occurred while preparing the mapped statement for execution.     
  3. --- Check the getAllUser.     
  4. --- Check the parameter map.     
  5. --- Cause: com.ibatis.common.beans.ProbeException: There is no READABLE property named 'name' in class 'java.lang.String'   
  6. Exception in thread "main" java.lang.NullPointerException   
  7.     at com.ctgusec.zhupan.ExampleMain.main(ExampleMain.java:81)  

 

刚接触ibatis,有说错的地方恳请指正.

MySQL是4.1.22版本。

JDK1.6.0_02。

 

   发表时间:2007-07-13  
唉,不用那么麻烦,,是什么原因,是你的SQL语句写的有要传入一个参数,但你没有传入。<select id="getAllUser" resultClass="user>
你这里应该还要加一句 。<select id="getAllUser" resultClass="user parameterClass="java.lang.String">,,这里是说。你要出入一个String类型的参数,然后你user=sqlMap.queryForList("getAllUser", null); 你这里的user是什么类型的,queryForList这里查询出来的是LIST类型的,还有如果要传参数,你这里的null就要改为那个参数值,,其他,没注意看,如果还有什么问题,自己在找找。
0 请登录后投票
   发表时间:2007-09-27  
这个问题,我也遇到过,用java.lang.String作为动态查询的条件,时不能直接传入java.lang.String.
需要用HashMap封装一下。就可以了。
HashMap<String, String> map=new HashMap<String, String>();
map.put("id",id);

parameterClass="java.util.HashMap"

0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics