2 u014337927 u014337927 于 2015.06.26 09:56 提问

新人关于DAO的一些疑问

package com.huake.dao.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;

import com.huake.dao.UserDao;
import com.huake.model.User;

@Component("userDao")
public class UserDaoImpl implements UserDao {

@Resource
private HibernateTemplate us;

public void add(User user) {
    us.save(user);
}

public List<User> queryUser(String username, String password) {
    List<User> users = us.find("from User u where u.username = '"
            + username + "' and  u.password = '" + password + "'");

    return users;
}

}

新手在自学SSH有很多不明白的地方,想问一下
public List queryUser(String username, String password) {
List users = us.find("from User u where u.username = '"
+ username + "' and u.password = '" + password + "'");
这段话具体执行了什么操作
是向hibernatetemplate对象保存了要使用的对象过后就可以对其进行增删改查吗?
具体是怎么实现的?能不能稍微详细点解释一下。。谢谢了

7个回答

u011202628
u011202628   2015.06.26 10:14
已采纳

这段代码执行的操作可能是在数据库中找出 User表中 username为”username“ password为“password“的数据,赋值给List型users对象
其中引号中的username和password可能为赋值过的变量,用于存储所要查询的用户名和密码,这里你只贴出部分代码,我不是很确定。
Hibernate框架需要你创建一系列的持久化类,每个类的属性都可以简单的看做和一张数据库表的属性一一对应,当然也可以实现关系数据库的各种表件关联的对应。当我们需要相关操作时,不用再关注数据库表。我们不用再去一行行的查询数据库,只需要持久化类就可以完成增删改查的功能。
简单来说hibernate的持久化类是数据库中表的一个映射,让你不需要面向混乱的代码进行编程。

个人见解,不到之处各位大牛轻喷..指出错误。

CSDNXiaoF
CSDNXiaoF 回复cd86254081: 非常聪明。
2 年多之前 回复
u014337927
u014337927 你好,我刚开始看这个 感觉不是很懂,也就是说通过通过hibernatetemplate的实例就可以直接对数据库进行操作吗?us.save(user)是不是就是在配置好的路径下创建user表..这个映射就是让我们可以直接用代码进行增删改查吗。。
2 年多之前 回复
u011738778
u011738778   2015.06.26 10:11

hibernate中find就相当于数据库select

u012736907
u012736907   2015.06.26 15:25

刚刚查了下,hibernate的方法如下:

1、delete(Object entity) 删除指定的持久化实例
在程序中一般先用 Assert.notNull和 Assert.isTrue断言entity是否为空 和 entity的id是否大于0若
否则事务回滚。再用get(Class entityClass,Serializable id,LockMode lockMode)加锁查询出持久
化实例,一般用lockMode.update悲观锁,最后用delete(Object entity)来删除此实例。

2、deleteAll(Collection entities) 删除集合内全部持久化实例
entities必须为持久化实例,否则报数据库异常错误。

3、find(String queryString) 根据HQL查询字符串来返回实例集合
find方法在执行时会先查找缓存,如果缓存找不到再查找数据库,如果再找不到就会返回null。

4、get(Class entityClass,Serializable id)根据主键加载特定持久化实例
在程序中一般先用 Assert.isTrue断言id是否大于0,若大于0继续执行,若查到数据则返回实例,否则返回空
不同于load,load若有数据则返回实例,否则报出ObjectNotFoundEcception异常,相比来说get效率高些

5、save(Object entity) 保存新的实例
在程序中一般先用 Assert.notNull断言实体是否为空,在进行保存。

6、saveOrUpdate(Object entity)根据实例的状态选择保存或者是更新
此方法同时包含了save与update方法的功能,如果传入的参数是临时对象vo 没有id,就调用save方法;如果传
入的参数是游离对象有id,就调用update()方法;如果传入的参数是持久化对象po,就直接返回。

7、update(Object entity) 更新实例的状态 实例必须为持久化状态
在程序中一般先用 Assert.notNull和 Assert.isTrue断言entity是否为空 和 entity的id是否大于0,
然后在更新实例,entity必须含有id否则不能更新。

8、Object execute(hibetnateCallback action)是HibernateCallback接口类。
当dao中的方法不能满足程序需要时可以考虑用此方法。如:根据几个不同参数需要返回唯一实体时用uniqueResult()返回。
HibernateCallback里面定义了一个doInHibernate的方法,这个方法是可变的。如果要查找数据方法应该就
是:session.load()。删除数据就是session.delete().这样的话查询数据库的方法用execute方法。

9、bulkUpdate()通过语句直接增加、更新、删除实体
一般有bulkUpdate(String sqlString) 和 bulkUpdate(String sqlString,Object[] object)两个
方法,返回增加,更新,或者删除的数量一般用于批量。

10、hibernate主键生成策略

(1)Assigned: 在插入数据的时候主键由用户自己添加。如:
(2)sequence: 调用数据库的sequence来生成主键,要设定序列名,否则hibernate无法找到。
如:ENTTY_NAME_SEQ
(3)increment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,
所以在多个实例运行的时候不能使用这个方法。

11、实体对象的三种状态
Session的生命周期绑定在一个物理的事务(tansaction)上面。
Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作
(1)自由状态(transient): 不曾进行持久化,未与任何Session相关联
(2)持久化状态(persistent): 仅与一个Session相关联
持久化实例可以通过调用 delete()变成游离状态。通过get()或load()方法得到的实例都是持久化状态的
(3)游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联
游离状态的实例可以通过调用update(),lock(),replicate(),save(),persist()或者saveOrUpdate()方法进行持久化

u014337927
u014337927 谢谢
2 年多之前 回复
ys_qiuzhi2012_163
ys_qiuzhi2012_163   2015.06.26 10:27

这段代码相当于在数据库上执行了select * from User u where u.username = '"+ username + "' and u.password = '" + password + "'",然后将查询出来的每条记录分别持久化到User对象上,形成List

u010430838
u010430838   2015.06.26 10:47

这段话具体执行了的操作是:你获取用户输入的用户名和密码 然后带着参数到数据库去查询是否存在该密码的用户 然后返回给list

如果list有一个值证明这个用户存在并且密码是正确的 如果没有返回值则相反

B_qxzb
B_qxzb   2015.06.26 13:11

1.find()方法就是查询的意思
2.find()方法里的sql语句就是查询语句
3.要知道为什么先要看jdbc,再看hibernate

u012736907
u012736907   2015.06.26 15:24

前面正解,,,从JDBC过渡过来就会好理解的多

Csdn user default icon
上传中...
上传图片
插入图片