实际上前面已经实现了怎么insert数据,怎么update数据.现在了解怎么查询数据.在hibernate中叫加载数据.有两个方法,分别是get和load.
package net.knight.hibernate.test;
import net.knight.hibernate.User;
import net.knight.hibernate.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;
import junit.framework.TestCase;
public class SessionTest extends TestCase {
/**
* 如果在能查询到数据的情况下正常,如果没有查询到数据的时候
* user对象会返回null,所以只需要判断user是否为null就可以了.
*/
public void testSelectByGet() {
Session session = null;
Transaction ts = null;
User user = null;
try {
session = HibernateUtils.getSession();
ts = HibernateUtils.getTransaction(session);
// 使用session的get接口,ID参数是实现了序列化的对象,只有实现序列化的对象才能存在磁盘上.
// 在这个接口传入需要加载的类,后面则是传入的ID值(只支持主键),get方法就会自动生成SQL语句.
// 返回的是一个对象,直接强制转换就可以了.
user = (User)session.get(User.class, "40284b8120516a1b0120516a1dac0001");
System.out.println("Username= " + user.getName());
ts.commit();
}catch(Exception e) {
e.printStackTrace();
ts.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 使用的是一个代理类,使用的第三方的类CGlib
* 如果查询没有数据的时候不会有任何反应,
* 只有在真正使用的时候会抛出ObjectNotFoundException
*/
public void testSelectByLoad() {
Session session = null;
Transaction ts = null;
User user = null;
try {
session = HibernateUtils.getSession();
ts = HibernateUtils.getTransaction(session);
// load使用了lazy(延迟加载或称懒加载)的方式加载数据.
user = (User)session.load(User.class, "40284b8120516a1b0120516a1dac0001");
// 也就是只有执行这条语句的时候才会加载(发出SQL语句).
System.out.println("Username= " + user.getName());
ts.commit();
}catch(Exception e) {
e.printStackTrace();
ts.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
update数据还可以手工建立一个对象,再更新数据.但是这个方法会有问题,更新数据的时候把其他没有赋值的内容都清空.
public void testByUpdtae() {
Session session = null;
Transaction ts = null;
try {
session = HibernateUtils.getSession();
ts = HibernateUtils.getTransaction(session);
// 现在这个对象是手动构造的Detached对象.
// 在数据库中是有这个ID的,所以这个执行会成功.
User user = new User();
user.setId("40284b8120516a1b0120516a1dac0001");
user.setName("张三");
// 但是其他没有更新的数据会被清空成NULL.
session.update(user);
ts.commit();
}catch(Exception e) {
e.printStackTrace();
ts.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
其他没有赋值的内容会被清空,所以不要这样更新数据.
最后看删除数据如何操作.
public void testByDelete() {
Session session = null;
Transaction ts = null;
try {
session = HibernateUtils.getSession();
ts = HibernateUtils.getTransaction(session);
// 不要手工构造这个对象去删某条记录,应该先加载,再删除.
User user = (User)session.load(User.class, "40284b8120516a1b0120516a1dac0001");
session.delete(user);
ts.commit();
}catch(Exception e) {
e.printStackTrace();
ts.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
CRUD操作,加载Session,再调用Session的方法就可以了.这里只是查询到数据表中的某一条记录,再对这条记录进行操作.如果要处理一批数据应该要用HQL来处理.
分享到:
相关推荐
### Hibernate4实战之第五部分:Hibernate的事务与并发 #### 一、事务基础概念 **事务(Transaction)** 是一组逻辑上紧密相连的操作集合。在数据库领域,事务具备ACID特性: - **原子性(Atomicity)**:事务内的所有...
**第四步:创建数据库表** - 在SQL Server中创建一个名为`emp`的表: ```sql CREATE TABLE emp ( eid INT IDENTITY PRIMARY KEY, ename VARCHAR(50), address VARCHAR(100) ); ``` **第五步:配置Hibernate...
在第14部分,我们将深入探讨如何在Hibernate中执行查询以及如何管理数据库事务,特别是在并发环境中。 **描述:**描述为空,但我们可以推测博客内容可能包含实际示例、最佳实践以及对Hibernate查询API和事务管理...
04 04Hibernate_Composite : 复合主键的使用,在开发中很少用到,一般良好的设计都会为一个表添加一个自动增长的主键标识列。其中重点配置方法和Hibernate中普遍采用的方法链编程的使用。还需注意可以将组合主键构建...
- **第一部分**:介绍了如何创建第一个Hibernate应用程序,包括设置环境、编写实体类、创建映射文件等步骤。 - **设置**:配置Hibernate所需的环境和依赖库。 - **第一个class**:创建一个简单的Java类作为持久化...
**第四次课:高级特性与最佳实践** 最后,我们会探讨Hibernate的一些高级特性和最佳实践,以便在实际项目中更高效地使用: 1. 缓存机制:了解Hibernate的L1和L2缓存,以及如何配置和使用缓存。 2. Criteria API与...
- **文档章节**:主要包括Hibernate的基础知识、高级特性、数据访问、事务管理、缓存管理等核心内容。 - **具体章节内容概览**: - **准备工作**:介绍了开发环境的搭建,包括Ant的安装和配置等。 - **构建...
1. 插入数据:调用Session的save()或saveOrUpdate()方法,Hibernate会自动为无ID的对象生成ID,并将其保存到数据库。 2. 更新数据:使用update()或saveOrUpdate()方法更新已存在的实体状态。 3. 删除数据:调用...
- **构建Hibernate基础代码**: 介绍了如何通过Hibernate生成基本的数据访问代码。 - **Hibernate配置**: 涵盖了配置文件的设置和解释。 - **第一段代码**: 展示了简单的Hibernate应用示例。 - **Hibernate基础...
**hibernate学习笔记第四天源码解析** 在hibernate学习的过程中,第四天通常会深入探讨实体类、映射文件、配置文件以及查询语言等方面的内容。这些是hibernate框架的基础,也是开发者掌握持久化操作的关键。让我们...
9. **Caching**:Hibernate支持二级缓存,可以使用第三方缓存如 EhCache 提高性能。 10. **事务处理**:Hibernate支持JTA和JDBC两种事务处理方式,保证数据的一致性和完整性。 11. **关联映射**:包括一对一、一对...
4. 第二级缓存:通过配置缓存插件(如Ehcache或Infinispan),提高数据读取效率。 5. 异常处理:Hibernate将SQL异常转换为特定的HibernateException,便于理解和处理。 总之,Hibernate 5.4.25为Java开发者提供了...
6. **实体生命周期管理**:Hibernate自动管理对象的状态,包括瞬态、持久化、托管和脱管四种状态,以及它们之间的转换。 7. **多对一、一对多、多对多关系映射**:Hibernate支持复杂的关联关系映射,如单向关联、...
1. **单个对象加载(Single Entity Loading)**:通过`Session.get()`或`Session.load()`方法加载单个对象,前者会立即从数据库中取数据,后者创建代理对象,数据在第一次访问时加载。 2. **集合加载(Collection ...
- **Hibernate定义**:Hibernate是一种开源的对象关系映射(Object Relational Mapping,ORM)框架,它为Java应用程序提供了强大的数据库交互功能,并且简化了数据持久化层的开发工作。 - **Hibernate特点**: - ...
- Hibernate提供了第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存),提高数据读取效率。 - 可以集成第三方缓存系统,如Ehcache,实现分布式缓存。 8. **关联映射**: - 一对一...
### Hibernate开发指南...通过阅读本书,读者不仅可以学习到如何使用Hibernate来解决常见的数据持久化问题,还可以了解到如何利用Hibernate与其他框架(如Spring)进行高效集成,以构建高性能、高可用性的企业级应用。
4. 第四步 Hibernate 中的类型 * Java Type * Hibernate Type Hibernate 类型 * Java Type:Hibernate 内部直接提供了 Java 类型到数据库的对照表 * Hibernate Type:需要查找该 Hibernate 类型对应的 Java 类型...
第四步:编写测试类,体验Hibernate的二级缓存. 第五步:二级缓存的数据并发策略. 当我们使用二级缓存的时候,如果并发策略为:read-only,那么只能对持久化对象进行查询,不能对其进行修改.这...