Hibernate的一些基本用法

开发 后端
使用Hibernate数据查询是一件简单的事,Java程序设计人员可以使用对象操作的方式来进行数据查询,查询时使用一种类似SQL的HQL来设定查询的条件。

本文主要简单介绍Hibernate数据查询、更新以及删除,查询时使用一种类似SQL的HQL来设定查询的条件,希望大家对大家的学习有所帮助。

基本Hibernate数据查询

使用Hibernate数据查询是一件简单的事,Java程序设计人员可以使用对象操作的方式来进行数据查询,查询时使用一种类似SQL的HQL(Hibernate Query Language)来设定查询的条件,与SQL不同的是,HQL是具备对象导向的继承、多型等特性的语言。直接使用范例来看看如何使用Hibernate进行数据库查询,在这之前,请先照之前介绍过的主题在数据库中新增几笔数据:在Hibernate中新增资料查询数据时,我们所使用的是Session的find()方法,并在当中指定HQL设定查询条件,查询的结果会装载在List对象中传回,您所需要的是将它们一一取出,一个最简单的例子如下:

HibernateTest.java

  1. import onlyfun.caterpillar.*;import net.sf.hibernate.*;import net.sf.hibernate.cfg.*;import java.util.*; public class HibernateTest {public static void main(String[] args) throws HibernateException {SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.openSession();List users = session.find("from User");session.close();sessionFactory.close();for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {User user = (User) iterator.next();System.out.println(user.getName() +"\n\tAge: " + user.getAge() +"\n\tSex: " + user.getSex());}}} 

find()中的“from User”即HQL,User指的是User类别,藉由映射文件,它将会查询USER表格中的数据,相当于SQL中的SELECT * FROM USER,实际上我们的User类别是位于onlyfun.caterpillar下,Hibernate会自动看看import中的package名称与类别名称是否符合,您也可以直接指定package名称,例如:

  1. session.find("from onlyfun.caterpillar.User"); 

这个程序的运行结果可能是这样的:

  1. log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).log4j:WARN Please initialize the log4j system properly.Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_caterpillarAge: 28Sex: MmomorAge: 25Sex: FBushAge: 25Sex: MBeckyAge: 35Sex: F   

上面所介绍的查询是最简单的,只是从数据表中查询所有的数据,Hibernate所查询得回的数据,是以对象的方式传回,以符合程序中操作的需要,我们也可以限定一些查询条件,并只传回我们指定的字段,例如:

  1. List names = session.find("select user.name from User as user where age = 25");for (ListIterator iterator = names.listIterator(); iterator.hasNext(); ) {String name = (String) iterator.next();System.out.println("name: " + name);}   

在find()中的HQL示范了条件限定的查询,User as user为User类别取了别名,所以我们就可以使用user.name来指定表格传回字段,where相当于SQL中的WHERE子句,我们限定查询age等于25的数据,这次查询的数据只有一个字段,而型态是String,所以传回的List内容都是String对象,一个运行的例子如下:

  1. log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).log4j:WARN Please initialize the log4j system properly.Hibernate: select user0_.name as x0_0_ from USER user0_ where (age=25 )name: momorname: Bush 

如果要传回两个以上的字段,也不是什么问题,直接来看个例子:

  1. List results = session.find("select user.name, user.age from User as user where sex = 'F'");for (ListIterator iterator = results.listIterator(); iterator.hasNext(); ) {Object[] rows = (Object[]) iterator.next();String name = (String) rows[0];Integer age = (Integer) rows[1];System.out.println("name: " + name + "\n\t" + age);}   

从上面的程序中不难看出,传回两个以上字段时,每一次ListIterator会以Object数组的方式传回一笔数据,我们只要指定数组索引,并转换为适当的型态,即可取得数据,一个查询的结果如下:

  1. log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).log4j:WARN Please initialize the log4j system properly.Hibernate: select user0_.name as x0_0_, user0_.age as x1_0_ from USER user0_ where (sex='F')name: momor25name: Becky35 

您也可以在HQL中使用一些函数来进行结果统计,例如:

  1. List results = session.find("select count(*), avg(user.age) from User as user");ListIterator iterator = results.listIterator();Object[] rows = (Object[]) iterator.next();System.out.println("资料笔数: " + rows[0] + "\n平均年龄: " + rows[1]); 

一个查询的结果如下所示:

  1. log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).log4j:WARN Please initialize the log4j system properly.Hibernate: select count(*) as x0_0_, avg(user0_.age) as x1_0_ from USER user0_资料笔数: 4平均年龄: 28.25   

unsaved-value

可以设定的值包括:

◆any - 总是储存

◆none - 总是更新

◆null - id为null时储存(预设)

◆valid - id为null或是指定值时储存

这样设定之后,您可以使用session.saveOrUpdate(updated);来取代上一个程序的session.update(updated);方法。

如果要删除数据,只要使用delete()方法即可,直接看个例子。

HibernateTest.java

  1. import onlyfun.caterpillar.*;import net.sf.hibernate.*;import net.sf.hibernate.cfg.*;import java.util.*;public class HibernateTest {public static void main(String[] args) throws HibernateException {SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.openSession();  List users = session.find("from User");User updated = null;for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {User user = (User) iterator.next();if(updated == null)updated = user;      System.out.println(user.getName() +"\n\tAge: " + user.getAge() +"\n\tSex: " + user.getSex());}session.delete(updated);users = session.find("from User");session.close();sessionFactory.close();for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {User user = (User) iterator.next();            System.out.println(user.getName() +"\n\tAge: " + user.getAge() +"\n\tSex: " + user.getSex());}       }} 

一个执行的结果范例如下:

  1. log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).log4j:WARN Please initialize the log4j system properly.Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, ser0_.age as age from USER user0_justinAge: 28Sex: MmomorAge: 25Sex: FBushAge: 25Sex: MBeckyAge: 35Sex: FHibernate: delete from USER where user_id=?Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, ser0_.age as age from USER user0_momorAge: 25Sex: FBushAge: 25Sex: MBeckyAge: 35Sex: FUser user = (User) session.load(User.class, id); 

Hibernate对于数据的更新、删除等动作,是依赖id值来判定,如果您已知id值,则可以使用load()方法来加载资料。这边我们先介绍的是一些简单的查询动作,将来有机会的话,再介绍一些进阶的查询,如果您想要先认识一些HQL,可以看看参考手册的第11章,当中对于HQL有详细的说明。

【编辑推荐】

  1. Hibernate3.1简单描述
  2. Hibernate save基础简介
  3. 浅析Hibernate 3二级缓存基础
  4. Hibernate流行架构浅析
  5. Hibernate update浅谈
责任编辑:仲衡 来源: host01
相关推荐

2009-06-18 13:42:48

Hibernate s

2009-06-18 10:53:52

Hibernate3.

2019-10-15 06:00:26

Google AnalAngularReact

2022-09-09 08:51:42

ShellLinux

2010-04-21 18:38:36

Unix网络

2017-09-05 09:17:47

Java编程用法总结

2012-01-18 10:13:50

Objective-CiOSself

2023-02-10 09:46:04

bash脚本变量

2011-11-08 21:12:35

2011-03-10 13:19:47

Oracle数据库

2021-09-28 06:28:51

EF错误用法

2019-07-09 09:31:50

操作系统电脑技术

2010-08-17 10:16:37

DIV样式

2009-06-14 17:08:11

ibmdw云计算

2020-02-03 16:03:36

疫情思考

2010-09-28 14:14:19

SQL语句

2011-06-01 16:50:21

JAVA

2009-06-25 09:50:32

JSF

2009-06-18 14:54:52

Spring AOP

2013-07-02 09:43:02

编程策略
点赞
收藏

51CTO技术栈公众号