??xml version="1.0" encoding="utf-8" standalone="yes"?>
相对于Criteria提供的符合面向对象风格的查询装模式。HQL提供了更加丰富灵zȝҎ,它在늛Criteria功能范围的前提下Q提供了更加强大的查询(在Hibernate3中增加了实体的更斎ͼ删除Q能力。更多的HQL使用Ҏ请参考Hibernate开发手册和其它|络资源。HQL为官Ҏ荐查询模式?BR>CZQStudentCriteriaQuery.java一个基于HQL的查询,更新Q删除?BR>/**
* StudentHQL.java
* Hibernate Query Language(HQL)
*/
package com.kela.hb.model;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.kela.hb.pojo.KelaStudent;
import com.kela.hb.util.HibernateUtil;
/**
* @author kangfeng(kela.kf@gmail.com)
*
*/
public class StudentHQL {
/*
* 实体查询(查询数据库表中所有的U录)
*/
public void exampleSelect_1(){
Session session;
Query query;
String hql;
try {
session = HibernateUtil.currentSession();
//查询W合相应~号和年龄大?5的学生纪?BR> hql = " from com.kela.hb.pojo.KelaStudent as kelaStudent " +
" where kelaStudent.stuID = '402880fc07dfe16f0107dfe173640001' " +
" or kelaStudent.stuAge > 25";
query = session.createQuery(hql);
List list = query.list();
Iterator it = list.iterator();
while(it.hasNext()) {
KelaStudent kelaStudent = (KelaStudent)it.next();
System.out.print(" 姓名:" + kelaStudent.getStuName());
System.out.print(" 性别:" + kelaStudent.getStuSex());
System.out.print(" q龄:" + kelaStudent.getStuAge());
System.out.print(" 地址:" + kelaStudent.getStuAddress());
System.out.println();
}
} catch(HibernateException he) {
System.out.println("[提示]: 查询数据发生错误," + he.getMessage());
} finally {
HibernateUtil.closeSession();
}
}
/*
* 属性查?查询数据库表中需要的若干个字D?
* q回cd为数l方?BR> */
public void exampleSelect_2(){
Session session;
Query query;
String hql;
try {
session = HibernateUtil.currentSession();
//查询KELA_STUDENT中字DؓStuNameQStuAgeQStuAddress的所有纪?BR> //同样也可以加一些条?BR> hql = " select kelaStudent.stuName, kelaStudent.stuAge, kelaStudent.stuAddress " +
" from com.kela.hb.pojo.KelaStudent as kelaStudent ";
query = session.createQuery(hql);
List list = query.list();
Iterator it = list.iterator();
while(it.hasNext()) {
Object[] rs = (Object[])it.next();
System.out.print(" 姓名:" + rs[0]);
System.out.print(" q龄:" + rs[1]);
System.out.print(" 地址:" + rs[2]);
System.out.println();
}
} catch(HibernateException he) {
System.out.println("[提示]: 查询数据发生错误," + he.getMessage());
} finally {
HibernateUtil.closeSession();
}
}
/*
* 参数l定(使用序占位W?? ),相当于我们经怋用的Q?BR> * select * from KELA_STUDENT where KelaID = ? and KelaAge > ?
*/
public void exampleSelect_3(){
Session session;
Query query;
String hql;
try {
session = HibernateUtil.currentSession();
//查询W合相应~号和年龄大?0的学生纪?BR> hql = " from KelaStudent as kelaStudent " +
" where kelaStudent.stuID = ? or kelaStudent.stuAge >= ?";
query = session.createQuery(hql);
//注意了是?开始的
query.setString(0, "402880fc07dfe16f0107dfe173640001");
query.setInteger(1, 20);
List list = query.list();
Iterator it = list.iterator();
while(it.hasNext()) {
KelaStudent kelaStudent = (KelaStudent)it.next();
System.out.print(" 姓名:" + kelaStudent.getStuName());
System.out.print(" 性别:" + kelaStudent.getStuSex());
System.out.print(" q龄:" + kelaStudent.getStuAge());
System.out.print(" 地址:" + kelaStudent.getStuAddress());
System.out.println();
}
} catch(HibernateException he) {
System.out.println("[提示]: 查询数据发生错误," + he.getMessage());
} finally {
HibernateUtil.closeSession();
}
}
/*
* 参数l定(使用引用占位W?: ),相当于我们经怋用的Q?BR> * select * from KELA_STUDENT where KelaID = ? and KelaAge > ?
*/
public void exampleSelect_4(){
Session session;
Query query;
String hql;
try {
session = HibernateUtil.currentSession();
//查询W合相应~号的学生纪?BR> hql = " from KelaStudent as kelaStudent " +
" where kelaStudent.stuID = :stuID ";
query = session.createQuery(hql);
//stuID 对应 :stuID
query.setParameter("stuID", "402880fc07dfe16f0107dfe173640001");
List list = query.list();
Iterator it = list.iterator();
while(it.hasNext()) {
KelaStudent kelaStudent = (KelaStudent)it.next();
System.out.print(" 姓名:" + kelaStudent.getStuName());
System.out.print(" 性别:" + kelaStudent.getStuSex());
System.out.print(" q龄:" + kelaStudent.getStuAge());
System.out.print(" 地址:" + kelaStudent.getStuAddress());
System.out.println();
}
} catch(HibernateException he) {
System.out.println("[提示]: 查询数据发生错误," + he.getMessage());
} finally {
HibernateUtil.closeSession();
}
}
/*
* 利用HQL的更?BR> */
public void exampleUpdate() {
Session session;
Transaction tran;
Query query;
String hql;
try {
session = HibernateUtil.currentSession();
tran = session.beginTransaction();
hql = " update KelaStudent " +
" set stuAge = 30 " +
" where stuID = '402880fc07dfe16f0107dfe173640001' ";
query = session.createQuery(hql);
System.out.println("更新的纪录条数是:" + query.executeUpdate());
tran.commit();
} catch (HibernateException he) {
System.out.println("[提示]: 更新数据发生错误," + he.getMessage());
} finally {
HibernateUtil.closeSession();
}
}
/*
* 利用HQL的删?BR> */
public void exampleDelete() {
Session session;
Transaction tran;
Query query;
String hql;
try {
session = HibernateUtil.currentSession();
tran = session.beginTransaction();
hql = "delete KelaStudent where stuID = '402880fc080437200108043725760001'";
query = session.createQuery(hql);
System.out.println("删除U录的条数是Q? + query.executeUpdate());
tran.commit();
} catch(HibernateException he) {
System.out.println("[提示]: 删除数据发生错误," + he.getMessage());
} finally {
HibernateUtil.closeSession();
}
}
public static void main(String[] args) {
StudentHQL studentHQL = new StudentHQL();
studentHQL.exampleSelect_1();
}
}
更多的用方法和参数,参考Hibernate文档和深入浅出Hibernate{资料?/P>
CZ一QStudentCriteriaQuery.java 一个基?Criteria Query 的查?BR>
/**
* StudentCriteriaQueryl.java
*
* Z Criteria Query 的对象化查询
*/
package com.kela.hb.model;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Expression;
import com.kela.hb.pojo.KelaStudent;
import com.kela.hb.util.HibernateUtil;
/**
* @author kangfeng(kela.kf@gmail.com)
*
*/
public class StudentCriteriaQuery {
/*
* 带有表达式的 Criteria 查询
*/
public void exampleSelect_1() {
Session session;
Criteria criteria;
try {
session = HibernateUtil.currentSession();
criteria = session.createCriteria(KelaStudent.class);
//关于Expression提供的对应查询限定机? 可在Hibernate的文中获得详细资料
//如果没有一下的查询条g则查询所有的数据?KELA_STUDENT 的纪?BR>
//查询数据库表 KELA_STUDENT 中 StuName = '邓立?的纪?
//查询条g中的stuName对应com.kela.hb.pojo.KelaStudent的属性stuName
//criteria.add(Expression.eq("stuName", "邓立?));
//查询q龄大于25岁的学生U录
criteria.add(Expression.gt("stuAge", new Integer(25)));
//如果同时出现几个限定条g,?StuName = '邓立?; stuAge > 25 则取交集
KelaStudent kelaStudent = new KelaStudent();
List list = criteria.list();
Iterator it = list.iterator();
while(it.hasNext()) {
kelaStudent = (KelaStudent)it.next();
System.out.print(" ~号:" + kelaStudent.getStuID());
System.out.print(" 名称:" + kelaStudent.getStuName());
System.out.print(" 性别:" + kelaStudent.getStuSex());
System.out.print(" q龄:" + kelaStudent.getStuAge());
System.out.print(" 地址:" + kelaStudent.getStuAddress());
System.out.println();
}
} catch (HibernateException e) {
System.out.println("[提示]: 查询没有成功," + e.getMessage());
} finally {
HibernateUtil.closeSession();
}
}
/*
* CZ查询,Ҏ已有的对象,查询属性与之相W的其它对象
*/
public List exampleSelect_2(KelaStudent kelaStudent) {
Session session;
Criteria criteria;
try {
session = HibernateUtil.currentSession();
criteria = session.createCriteria(KelaStudent.class);
criteria.add(Example.create(kelaStudent));
return criteria.list();
} catch (HibernateException he) {
System.out.println("[提示]: 查询发生错误," + he.getMessage());
return null;
} finally {
HibernateUtil.closeSession();
}
}
/*
* 调用CZ查询Qƈ打印l果
* q种查询q不常用Q但是在l合查询中非常的有用途?BR> * 比如要查询的条g有多个,但不能确定的时候,可以按照下面的例子用,直接讑֮查询的条Ӟ
* ?nbsp;后将对象传入卛_查询?BR> */
public void exampleSelect_3() {
KelaStudent kelaStudent = new KelaStudent();
//在这里可以设|多个条Ӟ如年龄,地址{?BR> kelaStudent.setStuName("邓立?);
List list = exampleSelect_2(kelaStudent);
Iterator it = list.iterator();
while(it.hasNext()) {
kelaStudent = (KelaStudent)it.next();
System.out.print(" ~号:" + kelaStudent.getStuID());
System.out.print(" 名称:" + kelaStudent.getStuName());
System.out.print(" 性别:" + kelaStudent.getStuSex());
System.out.print(" q龄:" + kelaStudent.getStuAge());
System.out.print(" 地址:" + kelaStudent.getStuAddress());
System.out.println();
}
}
public static void main(String[] args) {
StudentCriteriaQuery scq = new StudentCriteriaQuery();
//查询q龄大于25的学生纪?BR> scq.exampleSelect_1();
//按照l定的条件进行查询,q里?name = '邓立?
//scq.exampleSelect_3();
}
}
CREATE TABLE [dbo].[KELA_STUDENT] ( <hibernate-configuration> log4j.rootLogger=warn, stdout #讄昄 error以上U别log import java.io.Serializable; public class KelaStudent implements Serializable { private static final long serialVersionUID = 8365163573354176897L; public String getStuAddress() { public void setStuAddress(String stuAddress) { public Integer getStuAge() { public void setStuAge(Integer stuAge) { public String getStuID() { public void setStuID(String stuID) { public String getStuName() { public void setStuName(String stuName) { public String getStuSex() {
[StuID] [varchar] (32) COLLATE Chinese_PRC_CI_AS NOT NULL , -- PK
[StuName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , --学生姓名
[StuSex] [char] (1) COLLATE Chinese_PRC_CI_AS NULL , --学生性别
[StuAge] [smallint] NULL , --学生q龄
[StuAddress] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL --学生地址
) ON [PRIMARY]
GO
3. ?发行包下 ehcache.xml 文g复制?src ?nbsp;
在Hibernate3? 如果没有q个文g会出?BR> WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in
the classpath: jar:file:/D:/J2eeProject/HibernateProject/lib/ehcache-1.1.jar!/ehcache-failsafe.xml
的错误?BR> 该文件ؓ Hibernate 的本w的 Cache 配置?BR>4. Hibernate 配置
Hibernate 配置文g主要用于配置数据库连接和Hibernateq行时所需要的各种属性(如,q接池,SQL方言Q是否现实SQL日志{)?BR> Hibernate 同时支持 xml 格式的配|文件各传统?properties 文g配置形式Q这里采?xml ?BR> 配置文g名默认ؓ hibernate.cfg.xmlQ或 hibernage.propertiesQ,Hibernate在初始化期间自动?classPath中寻找这个文Ӟq读取其中的配置信息Qƈ加蝲?BR> 以下?hibernate.cfg.xml 文gQ在目 HibernateProject 的src 下放以下内容Q:
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"
<session-factory>
<!-- 是否运行期生成的SQL输出到日志以供调?-->
<property name="hibernate.show_sql">
true
</property>
<!-- SQL 方言-->
<property name="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</property>
<!-- 数据库用?-->
<property name="hibernate.connection.username">
sa
</property>
<!-- 数据库密?-->
<property name="hibernate.connection.password">
123456
</property>
<!-- 数据?JDBC 驱动-->
<property name="hibernate.connection.driver_class">
com.microsoft.jdbc.sqlserver.SQLServerDriver
</property>
<!-- 数据?URL -->
<property name="hibernate.connection.url">
jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hbdb
</property>
<!-- 事务理cd -->
<!-- Hibernate 3 对包名做了修?Q?net.sf.hibernate => org.hibernate Q?->
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<!-- c3p0 q接?-->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.max_size">2</property>
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.timeout">50000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>
<!-- 映射的配|文Ӟ对应数据库表 KELA_STUDENT 的映文Ӟ在后面将看到q个文g的配|?-->
<mapping resource="com/kela/hb/pojo/KelaStudent.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5. 日志配置
在Hibernate发行包的etc目录下找?log4j.properties CZ配置文gQ可以修改其中的日志U别Q也可直接用?BR>在src下,攄 log4j.properties 文gQ内容如下:
# log4j #
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.logger.org.hibernate=error
6. 构徏 POJO cdHibernate映射( .hbm.xml)文g
说明Q根据数据库定义导出表结构,q自动生成对应的映射文g和POJO java代码Q是实际开发当中最常用的方式,也是专家所推荐的。可以?MiddleGen -- HibernateQHibernate -- Extensions {的工具Q这些工L使用非常的方便,只修修改相应?ant 构徏文g卛_Q在|络上可以很Ҏ的找到这些工L使用Ҏ?BR> q里采用手工~写 POJO 和映文件的ҎQ是Z开发者更好理?Hibernate q作机制而考虑。付出手工编写会产生疏漏和错误的代hQ我觉得在学习阶D|值得的?BR> 以下是这两个文gQ他们的位置都在 com.kela.hb.pojo 下面?BR>POJOc:com.kela.hb.pojo.KelaStudent
/**
* KelaStudent.java
*/
package com.kela.hb.pojo;
String stuID;
String stuName;
String stuSex;
Integer stuAge;
String stuAddress;
public KelaStudent() {
}
return stuAddress;
}
this.stuAddress = stuAddress;
}
return stuAge;
}
this.stuAge = stuAge;
}
return stuID;
}
this.stuID = stuID;
}
return stuName;
}
this.stuName = stuName;
}
return stuSex;
}
/*
* 购物l算
*/
public BigDecimal balance(String userID) {
conn = ......
try {
//获取当前{Q?select
......
} catch () { }
try {
//获得打折比率Q?select
//计算实际支付金额
......
} catch () { }
try {
//支付的金额累计到篏U消费中Q?update
//修改客户现有的余?BR> ......
} catch () {}
//q回实际的消贚w?BR> return new BigDecimal(****);
}
}
B. 那另外的一些朋友他们会_在A里面h的业务逻辑和数据访问代码极大的q扰了阅ȝ序的人,而且q样的代码将l日后的l护带来极大的困难(我也是这栯为哦 ~ ~Q。如果我们的实际应用当中的业务逻辑变得非常庞大和复杂的时候,A的做法显然有忧缺点的。于是,有了下面的攚w:
public calss NetShop {
......
/*
* 购物l算
*/
public BigDecimal balance(String userID) {
A a = new A();
String gradeStr = null; //客户U别
long agioLong = 0.0;
//获取当前{
gradeStr = a.getUserGarde(userID);
//Ҏ{计算打折比率
agioLong = a.getAgio(gradeStr);
//累计客户消费金额
a.updateCustMoney(userID, agioLong);
//修改客户余额
a.updateUserBalance(userID, agioLong);
//q回消费金额
return new BigDecimal(****);
}
}
public class A {
//dC面对Ҏ
}
可以说B的实现方式,是我Q呵呵,大多数可不敢pQ经怋用的方式Q在实际的应用当中结合一些数据库性能上的优化Q连接池Q预~译语句之类的)Q基本上已经实现了,业务和数据层的分R?BR> 然而,在现在客L应用需求和公司考虑可重用等因素的媄响下Q我们有不得不去考虑Q我们的应用能不能实C格意义上的跨数据库用,或者说Q我们的应用从一个数据迁Ud另外一个数据的时候,是不是只做很的改动Q因为,现在有很多的目需要引入第三方的品,它山之石可以ȝ嘛)。带着q样的疑问,那我们是不是会写很多的基于特定数据库的数据层处理代码Q当然了Q这也是个好办法Q。现在我们就要引入Hibernate了,我觉得选择一个比我们自己的实现方式更好的实现方式Q是一个更加聪明的决策。那么Hibernate能干什么?
1Q减乏味的代码
无论是AҎq是BҎ我们都少不了大量的数据库q接Q查询,关闭{代码,写得多了也就觉得烦了QHibernate装了数据库持久层大多数技术细节,如事物管理,q接理Qsql执行{?BR> 臛_q点Q我们是需要的?BR> 2Q更加面向对象的设计
是说像设计对象一L去设计和操作数据库。这条可能现在还不能理解?BR> 3Q更好的性能
我觉得这条好理解多了Q系出名门和专家之手的框Ӟ肯定提供了非怼U的性能优化机制。比如,对连接池QPreparedSatatement ~存Q数据缓存等。这Ҏ们可以大可放心,因ؓ使用者决定了它的优秀?BR> 4Q更好的UL?BR> 我们只需要简单得修改其的配置参数Q即可实现底层数据库的良好切换(q也是有前提的哦Q可不能使用特定数据库都有的Ҏ)。这条的好处是显而易见的?BR>
关于引入Hibernate有什么好处,我觉得以上就_了,它确实能帮助我们?/P>