SSH框里简单删除问题!案例里传一个ID,delete方法里居然就能直接删除user了。是怎么实现的,好神奇

页面<s:iteratorvalue="#userList"var="u"><tr><td><s:propertyvalue="#u.id"/></td><td><s:p... 页面
<s:iterator value="#userList" var="u">
<tr>
<td><s:property value="#u.id"/></td>
<td><s:property value="#u.name"/></td>
<td><s:property value="#u.password"/></td>
<td><s:property value="#u.dept.deptname"/></td>
<s:a href="user!delete?id=%{#u.id}">删除</s:a>

struts xml
<action name="user" class="userAction">
<result>/list.jsp</result>
<result name="add">/add.jsp</result>
<result name="addSuccess" type="redirectAction">user</result>
<result name="toUpdate">/update.jsp</result>
<result name="delete" type="redirectAction">user</result>
</action>

ACTION类
//删除
public String delete(){
userBiz.delete(user);
return "delete";
}

接着biz省略,直接daoImpl
//删除
public void delete(User user) {
this.getHibernateTemplate().delete(user);
}
完全没有看到user,居然传一个ID就能删除
展开
 我来答
帐号已注销
推荐于2017-11-25 · TA获得超过4630个赞
知道大有可为答主
回答量:1345
采纳率:50%
帮助的人:1609万
展开全部
试想,hibernate封装了jdbc,而jdbc是通过普通的sql去操作数据表的。如果hibernate想要操作数据库,必然也要转化成相应的sql才能实现。有没有想过,在hibernate的配置中,为什么必须要告诉hibernate一个javabean对应的表是哪个,哪个属性又对应了这张表的主键。显然,当hibernate执行类似于delete、update、save等操作时,是根据传入参数的类,来查找对应要操作的表,然后根据id,来执行sql的。执行的真正sql,应该是delete from 表 where 对象.getId(),显然除了那个对象外,其它的信息都可以通过配置来得到,所以,只要你传入一个对象,而这个对象的主键对应属性不为空,就可以操作对应的数据。

而执行update和save时则需要注意,如果你只想更新一个字段,而你new了一个对象,然后给这个字段赋值,执行update,此时其它字段都会被清空。这显然不是你想要的。所以update的时候,通常是从数据库load一个对象,然后给这个load到的对象的某个属性重新赋值,再去update,才能达到更新某一字段的效果。

多想想hibernate的某一配置是为了什么来配置的,能帮助你理解hibernate的原理。
追问
id和user相关联 在哪里配置怎么配。
追答
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="tang.cms.entity.User" table="t_user">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="username"></property>
</class>
</hibernate-mapping>

上面是一个User.hbm.xml的配置文件。一般的列与属性的对应,使用的是property标签,如上面的username,但作为id是一个特殊的情况,所以它有专门的标签来标注。当执行delete的时候,你传入了一个对象,假设是User类的一个实例,hibernate就回去User.hbm.xml去查找关于User类的配置。

因为是删除,它会去找这个id标签,然后发现id标签的name值是id,这样的话,再反射去获取你传的对象的id属性的值,假设这个值为idval。然后继续去查找column属性,这个属性是对应的就是整个User类所对应的那张表的主键字段名,上面的查找结果就是,t_user表的主键是id,所以,它就可以确定,你要删除的是t_user表里的id值等于传入的那个对象的id值,也就是idval,转化成sql就是delete from t_user where id = idval。显然,如果要执行delete,需要取得几个关键属性。第一是从哪张表删除,这个可以根据参数对象的类型来判断,比如传入的是User类的实例,它就去User.hbm.xml中查找table属性,这里是t_user;第二是删除的依据是什么,也就是,一张表有那么多字段,哪个字段才是主键,这个从上面的分析可以得到,主键是id。而在表中删除一条数据,知道主键值就完全可以了,因为主键是唯一的,通过主键,可以确定删除的行。第三点就是,要删除的这条数据,它的主键值是多少。而这个值就在你传递的那个参数对象中,hibernate会通过反射,调用参数对象的get方法,取得这个值。最后,将以上数据代替到sql语句delete from table where 主键 = 主键值 中,执行这个sql语句,就完成了删除操作。

pws22
2013-04-02
知道答主
回答量:34
采纳率:0%
帮助的人:11万
展开全部
你删除这个链接是传到 struts 中 delete 其中delete重定向到user对象 其中它含有 id这个成员变量 所以就能删除了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
boby_1206
2013-04-02 · TA获得超过100个赞
知道答主
回答量:203
采纳率:0%
帮助的人:67万
展开全部
因为id是这张表中唯一标识的啊。。所以传入一个id就能删除整条user数据啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式