有关ibatis的一点疑问,朋友请进来看看

哒哒路 2010-01-13 05:50:16
今天配置了一个spring+ibatis,在运用的过程遇到了一个疑问,请大家赐教,
例如我要调用一个查询方法:
List<Product> listProduct = getSqlMapClientTemplate().queryForList(
"getAllProduct");

但是我在网上看到这样写也可以
List<Product> listProduct = getSqlMapClientTemplate().queryForList(
"product.getAllProduct");

不知道什么时候该用第一种,什么时候用第二种
...全文
158 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
道光2008 2010-01-13
  • 打赏
  • 举报
回复
List<Product> listProduct = getSqlMapClientTemplate().queryForList(
"getAllProduct");


但是我在网上看到这样写也可以
Java code
List<Product> listProduct = getSqlMapClientTemplate().queryForList(
"product.getAllProduct");

;
useStatementNamespaces="false"


seStatementNamespaces="false"
是否使用Statement命名空间。
这里的命名空间指的是映射文件中, sqlMap节点
的namespace属性,如在上例中针对t_user
表的映射文件sqlMap节点:
<sqlMap namespace="User">
这里,指定了此sqlMap节点下定义的操作均从
属于"User"命名空间。
在useStatementNamespaces="true"的情
况下,Statement调用需追加命名空间,如:
sqlMap.update("User.updateUser",user);
否则直接通过Statement名称调用即可,如:
sqlMap.update("updateUser",user);
但请注意此时需要保证所有映射文件中,
Statement定义无重名。
villagehead 2010-01-13
  • 打赏
  • 举报
回复
实际调用的时候,sql的名字分2部分,也就是
<sqlMap的namespace>.<各个bean中的id>

在ibatis的sql-map.xml里面,
有个参数是定义是否必须使用全名来调用标签的,
好像叫“enhancementEnabled”
默认的是false,也就是不用<sqlMap的namespace>,
而直接用id的值就可以。

但是因为大项目可能有id重复的情况,
所以建议设置成true,就是用全限定名来访问

lz自己翻翻资料吧

good luck
wenjjing2lianee 2010-01-13
  • 打赏
  • 举报
回复
呵呵,就是楼上说的:命名空间.

在我们写SQL Map文件时,如下行

<sqlMap namespace="User">

基本上我们是按照每个表一个命名空间(namespace)的。

在这个命名空间内有如下的SQLID行

<select id="getUserById" parameterClass="java.lang.Integer" resultClass="user">
<![CDATA[
SELECT id, username, password FROM users WHERE id = #id#
]]>
</select>

请注意这里的 id="getUserById" 在同一个命名空间中是不允许重复的,那么也就意味着在不同的命名空间中

是允许重复的。

通常状况下在DAO中我们这么引用

smc.queryForList("getUserById");

这一行中的getUserById就是SQLMap中的getUserById。

如果SQLMap中不同命名空间中出现了重复的ID我们怎么用?

我们可以这么用smc.queryForList("User.getUserById");

也就是在getUeserById前加上我们需要的命名空间即可正确的访问我们期望的SQL。



本文来自CSDN博客,转载请标明出处:

http://blog.csdn.net/bukebushuo/archive/2008/06/06/2517010.aspx
酱油Coder 2010-01-13
  • 打赏
  • 举报
回复
一个加了命名空间
一个没加
配置了useStatementNamespaces="true" ,应加命名空间
wenjjing2lianee 2010-01-13
  • 打赏
  • 举报
回复
我以为你得到结果是一样的,呵呵,那你getAllProduct方法是写在那里啊.
哒哒路 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wenjjing2lianee 的回复:]
两个结果如果是一样的,那我相信没多大差别
为什么queryForList("product.getAllProduct");和queryForList("getAllProduct");一样,

我想只有当工程中存在唯一个getAllProduct方法才能用第二种调.而第一种就不同了,带了包名.
ibatis不是很了解...

[/Quote]
但是我用第一种不报异常,第二种就报异常,说找不到这个product.getAllProduct
wenjjing2lianee 2010-01-13
  • 打赏
  • 举报
回复
两个结果如果是一样的,那我相信没多大差别
为什么queryForList("product.getAllProduct");和queryForList("getAllProduct");一样,

我想只有当工程中存在唯一个getAllProduct方法才能用第二种调.而第一种就不同了,带了包名.
ibatis不是很了解...
哒哒路 2010-01-13
  • 打赏
  • 举报
回复
谁来帮帮我呀

81,091

社区成员

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

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