小黑J2EE学习ing
我很会努力
BlogJava
首页
新随笔
联系
聚合
管理
随笔-21 评论-29 文章-0 trackbacks-0
小黑Hibernate学习(五)
以上实例有一个限制,即查询对象只能根据id值来查询。
我们可以通过完善HibernateUtil来实现更多更能。
package
cn.itcast.hibernate;
import
java.io.Serializable;
import
org.hibernate.HibernateException;
import
org.hibernate.Session;
import
org.hibernate.SessionFactory;
import
org.hibernate.Transaction;
import
org.hibernate.cfg.Configuration;
public
final
class
HibernateUtil
{
private
static
SessionFactory sessionFactory ;
private
HibernateUtil()
{}
static
{
Configuration cfg
=
new
Configuration() ;
cfg.configure();
sessionFactory
=
cfg.buildSessionFactory();
}
public
static
SessionFactory getSessionFactory()
{
return
sessionFactory;
}
public
static
Session getSession()
{
return
sessionFactory.openSession();
}
public
static
void
add(Object entity)
{
Session s
=
null
;
Transaction tx
=
null
;
try
{
s
=
HibernateUtil.getSession();
tx
=
s.beginTransaction();
s.save(entity);
tx.commit();
}
finally
{
if
(s
!=
null
)
s.close();
}
}
public
static
void
update(Object entity)
{
Session s
=
null
;
Transaction tx
=
null
;
try
{
s
=
HibernateUtil.getSession();
tx
=
s.beginTransaction();
s.update(entity);
tx.commit();
}
finally
{
if
(s
!=
null
)
s.close();
}
}
public
static
void
delete(Object entity)
{
Session s
=
null
;
Transaction tx
=
null
;
try
{
s
=
HibernateUtil.getSession();
tx
=
s.beginTransaction();
s.delete(entity);
tx.commit();
}
finally
{
if
(s
!=
null
)
s.close();
}
}
public
static
Object get(Class clazz,Serializable id)
{
Session s
=
null
;
try
{
s
=
HibernateUtil.getSession();
Object obj
=
s.get(clazz, id);
return
obj ;
}
finally
{
if
(s
!=
null
)
s.close();
}
}
}
以上代码就能实现常用的增、删、改以及根据id查询的功能了!
HQL(Hibernate Query Language)
面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是表,并且支持多态;
HQL主要通过Query接口来操作,Query的创建方式:
Query q = session.createQuery(hql);
from Person
from User user where user.name =: name
from User user where user.name =: name and user.birthday<:birthday
Criteria
Criteria是一种比HQL更面向对象的查询方式。Criteria的创建方式:
Criteria crit = session.createCriteria(DomainClass.class);
简单属性条件如: criteria.add(Restrictions.eq(propertyName,value));
criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName));
实例操作
新建一QueryTest类
package
cn.itcast.hibernate;
import
java.util.Date;
import
java.util.List;
import
org.hibernate.Query;
import
org.hibernate.Session;
import
cn.itcast.hibernate.domain.User;
public
class
QueryTest
{
public
static
void
main(String[] args)
{
User user
=
new
User();
user.setBirthday(
new
Date());
user.setName(
"
name
"
);
HibernateUtil.add(user);
query(user.getName());
}
static
void
query(String name)
{
Session s
=
null
;
try
{
s
=
HibernateUtil.getSession();
String hql
=
"
from User as user where user.name=?
"
;
//
from Object
Query query
=
s.createQuery(hql);
query.setString(
0
, name);
List
<
User
>
list
=
query.list();
//
list作用类似于executeQuery
//
User u = (User)query.uniqueResult();
//
当查询结构唯一的时候可以使用
//
System.out.print(u);
for
(User user : list)
{
System.out.println(user.getName());
}
}
finally
{
if
(s
!=
null
)
s.close();
}
}
}
观察输出结果
Oracle中
实体类或属性名与数据库关键字冲突问题
以上是User.hbm.xml原来的代码
<?
xml version="1.0"
?>
<!
DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<
hibernate-mapping
package
="cn.itcast.hibernate.domain"
>
<
class
name
="User"
table
="user"
>
<
id
name
="id"
>
<
generator
class
="native"
/>
</
id
>
<
property
name
="name"
column
="name"
/>
<
property
name
="birthday"
/>
</
class
>
</
hibernate-mapping
>
User类默认关联的表名为user,但是user在oracle中是关键字
我们可以设置表名为tuser。
如果tuser已经存在,给表明加一对反引号,`user` 即可。不过最好还是只改表明。
如果是字段名(属性名)和关键字相冲突,其处理方法也是一样的!
HQL的命名参数
String hql
=
"
from User as user where user.name=?
"
;
//
from Object
Query query
=
s.createQuery(hql);
query.setString(
0
, name);
以上语句中,如果where后面的属性有多个,就需要多个问号,而且在set方法里面容易犯错,比如记错顺序等。不利于维护。
为解决这个问题,我们可以使用HQL的命名参数来解决,代码如下:
String hql
=
"
from User as user where user.name=:name
"
;
//
from Object
Query query
=
s.createQuery(hql);
query.setString(
"
name
"
, name);
Query接口的两个方法实现分页查询
query.setFirstResult(
200
);
//
从第200条记录开始
query.setMaxResults(
10
);
//
共set 10条记录
利用方言可以实现各个数据库的分页查询。
posted on 2009-05-04 15:11
特立独行
阅读(298)
评论(0)
编辑
收藏
所属分类:
Hibernate框架
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
小黑Hibernate学习(六)
小黑Hibernate学习(五)
小黑Hibernate学习(四)
小黑Hibernate学习(三) Session接口及get、load、persist方法
小黑hibernate学习(二)
小黑hibernate学习(一)
小黑J2EE学习之路 欢迎大家观临! 希望大家能多指教哦!
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
Hibernate框架(6)
J2EE核心技术(1)
Java 技术
Java面试题
Spring框架(5)
Struts框架(7)
数据库
随笔档案
2010年6月 (2)
2009年6月 (1)
2009年5月 (17)
2009年4月 (1)
搜索
最新评论
1. re: struts2实现文件上传和下载[未登录]
下载做来直接就在页面把文件打开了。。
--小菜
2. re: struts2实现文件上传和下载
你这代码量有点多,STRUTS2封装好了,顶多15行搞定
--你这代码量有点多
3. re: struts2实现文件上传和下载
怎么将上传的东西在页面上显示出来啊
--边城
4. re: struts2实现文件上传和下载
配置的文件 有关键字, 把action 中的name 换下就可以了 @陈
--采用
5. re: struts2实现文件上传和下载
大侠 ……怎么实现点一个文件下载一个文件,而不是固定的文件?
--pppppppppp
阅读排行榜
1. struts2实现文件上传和下载(17507)
2. 小黑struts学习(五) Action Mapping、ActionForward和ActionForm组件学习(1592)
3. 小黑Hibernate学习(三) Session接口及get、load、persist方法(1004)
4. ASSH框架的技术基础和设计(756)
5. Spring 框架的设计理念与设计模式分析(646)
评论排行榜
1. struts2实现文件上传和下载(27)
2. Spring 框架的设计理念与设计模式分析(1)
3. 很开心加入BlogJava 就像找到了组织一样(1)
4. Spring 框架的设计理念与设计模式分析(2)(0)
5. JFreeChart的中文乱码问题 知道的帮忙解决一下(0)