dao-新人关于DAO的一些疑问

问题描述

新人关于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对象保存了要使用的对象过后就可以对其进行增删改查吗?
具体是怎么实现的?能不能稍微详细点解释一下。。谢谢了

解决方案

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

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

解决方案二:

hibernate中find就相当于数据库select

解决方案三:

刚刚查了下,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()方法进行持久化

解决方案四:

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

解决方案五:

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

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

解决方案六:

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

解决方案七:

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

时间: 2024-11-10 07:26:50

dao-新人关于DAO的一些疑问的相关文章

使用dao.Processor管理数据持久化对象

对象|数据 原文 dao.Processor是在多数据库多实体环境下以JAVA对象的数据对象化和持久化的核心类,它的使用方 法总结如下: 一.与Entity绑定: 针对dao.entity对象,可与EJB.entity设置兼容.与entity兼容的典型使用方法是: Processor pro =ProcessorFactory.getProcessorInstance(ent); 或: Processor pro  =Processor.getInstance(ent); 或: processo

javaBean高级内容:DAO设计模式

既然已经学习了javabean了,就应该了解dao模式了.也就步入了mvc高级开发的轨道了.关于dao我们一起来看一下它是个什么东西.看一下面向企业开发的模式的意义. dao设计模式简介 dao全称是data access object,数据库访问对象,主要的功能就是用于进行数据操作的,在程序的标准开发架构中属于数据层的操作 企业分层架构 客户层:因为现在都采用了B/S开发架构,所以一般都使用浏览器进行访问. 显示层:使用JSP/Servlet进行页面效果的显示 业务层:(Business Ob

Dao对象模型

DAO提供了两种不同的对象模型,一种对象模型是通过Jet引擎来访问数据,如下图所示.另一种对象模型是通过ODBCDirect来访问数据.这两种对象模型都是层次结构的.现在分别对这两种对象模型进行介绍. DBEngine是一个基于对象,它包含了两个重要的集合(Collection),一个是Errors集合,另一个是Workspaces集合.对DAO的操作总会产生一些错误,每产生一个错误,DAO就生成一个Error对象,这些Error对象都放在Errors集合中,可以用Errors.Count来计算

高级DAO编程

在过去 18 个月中,我参加了一个由有才华的软件工程师组成的小组,构建定制的.基于 Web 的供应链管理应用程序.我们的应用程序访问范围广泛的持久性数据,包括配送状态.供应链衡量(metrics).库存.货运发票.项目管理数据和用户信息.我们用 JDBC API 连接到我们公司的不同数据库平台上,并在整个应用程序中使用 DAO 设计模式. 图 1 显示了应用程序和数据源之间的关系: 图 1. 应用程序和数据源 在整个应用程序中使用数据访问对象(DAO)使我们可以将底层数据访问逻辑与业务逻辑分离开

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

[正文] 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据访问者)模式和 Active Domain Object(领域对象)模式.Data Accessor 模式实现了数据访问和业务逻辑的分离:Active Domain Object 模式实现了业务数据的对象化封装. 需要注意的是,DAO设计模式是Java EE中的设计模式

Java+MyEclipse+Tomcat (五)DAO和Java Bean实现数据库和界面分开操作

        正如前面一篇文章的介绍,当使用Servlet提交表单和JSP数据库查询时,总是相互交叉着的处理,要么在JSP中通过<%...%>内嵌Java代码操作数据库,要么JSP中通过Post方法提交表单Form,在Java中通过Servlet获取请求/响应,再通过Java中out.println("<HTML>...")输出数据库中值.         此篇文章主要讲述通过DAO和Java Bean操作数据库,把链接数据库.数据库操作.前端界面显示分模块化

Spring 与 Hibernate 的延迟加载和 Dao 模式

Hibernate 与延迟加载: Hibernate 对象关系映射提供延迟的与非延迟的对象初始化.非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来.这有时会导致成百的(如果不是成千的话) select 语句在读取对象的时候执行.这个问题有时出现在使用双向关系的时候,经常会导致整个数据库都在初始化的阶段被读出来了.当然,你可以不厌其烦地检查每一个对象与其他对象的关系,并把那些最昂贵的删除,但是到最后,我们可能会因此失去了本想在 ORM 工具中获得的便利. 一个明显的解决方

注解+反射+JDBC,实现一个简易的泛型DAO接口

一.实现思路        1.定义3个Annotation(注解):Entity.Id.Column,Entity作用于Type级别,用于标识JavaBean与数据库表名的映射关系.Id作用于Field级别,用于标识JavaBean中ID属性与表中ID字段的映射关系,Column作用于Field级别,用于标识JavaBean中除ID属性外的其它属性与表中字段的映射关系.      2.在Dao实现类中,通过反射API获得JavaBean中注解和属性的信息,如:表名.字段.JavaBean属性的

【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发

使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder.SqlSessionFactroy.SqlSession. 小伙伴们都知道,SqlSession中封装了对数据库的操作,如:增删改查,通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建的