近来开始学习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中查询的配置代码:
- <select id="getAllUser" resultClass="user">
- select
- name,
- sex
- from t_user WHERE name=#name#
- ]]>
- select>
java代码段如下:
- try {
- sqlMap.startTransaction();
- user=sqlMap.queryForList("getAllUser", null);
- sqlMap.commitTransaction();
- } catch (SQLException e) {
- System.out.println(e.getMessage());
- } finally {
- try {
- sqlMap.endTransaction();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
测试了几次取不到结果。开始找原因,
先是把
- user=sqlMap.queryForList("getAllUser", null);
中的参数null改成user2(新创建的一个User对象,其他setName("数据库中已存在字段值")),可以取到那条记录。
可以这里有个小问题,放后面说!!!!!!
第二种尝试,把User.xml中ID为getAllUser的SQL改成查询所有记录,这样可以取到所以的记录。
- <select id="getAllUser" resultClass="user">
- select
- name,
- sex
- from t_user
- ]]>
- 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的配置应该是这样:
- <select id="getAllUser" resultClass="user">
- select
- name,
- sex
- from t_user
- ]]>
- <dynamic prepend="WHERE">
- <isNotEmpty property="name">name like '%$name$%'isNotEmpty>
- dynamic>
- select>
这里特殊(模糊查询)了一点,如果是精切查询,是#而不是$符号了。
===
说说那个小问题:
如果 User.xml的getAllUser的配置是:
- <select id="getAllUser" resultClass="user">
- select
- name,
- sex
- from t_user WHERE name=#name#
- ]]>
- select>
那么
- user=sqlMap.queryForList("getAllUser", "某条记录name的值");
- User user2 = new User();
- user2.setName("某条记录name的值");
- try {
- sqlMap.startTransaction();
- user=sqlMap.queryForList("getAllUser", user2);
- sqlMap.commitTransaction();
- } catch (SQLException e) {
- System.out.println(e.getMessage());
- } finally {
- try {
- sqlMap.endTransaction();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
这两个都可以正常取到那条记录。
如果User.xml是:
- <select id="getAllUser" resultClass="user">
- select
- name,
- sex
- from t_user
- ]]>
- <dynamic prepend="WHERE">
- <isNotEmpty property="name">name = #name#isNotEmpty>
- dynamic>
- select>
,只能传递User对象作为参数了,
- user=sqlMap.queryForList("getAllUser", user2);
否则报错:
- --- The error occurred in com/ctgusec/zhupan/maps/User.xml.
- --- The error occurred while preparing the mapped statement for execution.
- --- Check the getAllUser.
- --- Check the parameter map.
- --- Cause: com.ibatis.common.beans.ProbeException: There is no READABLE property named 'name' in class 'java.lang.String'
- Exception in thread "main" java.lang.NullPointerException
- at com.ctgusec.zhupan.ExampleMain.main(ExampleMain.java:81)
刚接触ibatis,有说错的地方恳请指正.
MySQL是4.1.22版本。
JDK1.6.0_02。