﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Kela's Blog-文章分类-我的笔记(Hibernate)</title><link>http://www.blogjava.net/kela/category/4821.html</link><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;前面的路很坎坷,但毕竟是条路.也许走过这一段就会发现,走过去就是梦想中的地方.因此坚持成为此刻唯一能做且必须去做的事情.
</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 19:12:34 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 19:12:34 GMT</pubDate><ttl>60</ttl><item><title>kela的笔记 ORM产品 ---- hibernate(5) </title><link>http://www.blogjava.net/kela/articles/22966.html</link><dc:creator>Kela</dc:creator><author>Kela</author><pubDate>Thu, 08 Dec 2005 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/kela/articles/22966.html</guid><wfw:comment>http://www.blogjava.net/kela/comments/22966.html</wfw:comment><comments>http://www.blogjava.net/kela/articles/22966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kela/comments/commentRss/22966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kela/services/trackbacks/22966.html</trackback:ping><description><![CDATA[<P><STRONG>Hibernate Query Language（HQL）<BR><BR></STRONG>相对于Criteria提供的符合面向对象风格的查询封装模式。HQL提供了更加丰富灵活的特性，它在涵盖Criteria功能范围的前提下，提供了更加强大的查询（在Hibernate3中增加了实体的更新，删除）能力。更多的HQL使用方法请参考Hibernate开发手册和其它网络资源。HQL为官方推荐查询模式。<BR>示例：StudentCriteriaQuery<STRONG>.</STRONG>java一个基于HQL的查询，更新，删除。<BR>/**<BR>&nbsp;* StudentHQL.java<BR>&nbsp;* Hibernate Query Language(HQL)<BR>&nbsp;*/<BR>package com.kela.hb.model;</P>
<P>import java.util.Iterator;<BR>import java.util.List;</P>
<P>import org.hibernate.HibernateException;<BR>import org.hibernate.Query;<BR>import org.hibernate.Session;<BR>import org.hibernate.Transaction;</P>
<P>import com.kela.hb.pojo.KelaStudent;<BR>import com.kela.hb.util.HibernateUtil;</P>
<P><BR>/**<BR>&nbsp;* @author kangfeng(<A href="mailto:kela.kf@gmail.com">kela.kf@gmail.com</A>)<BR>&nbsp;*<BR>&nbsp;*/<BR>public class StudentHQL {<BR>&nbsp;<BR>&nbsp; /*<BR>&nbsp;&nbsp; * 实体查询(查询数据库表中所有的纪录)<BR>&nbsp;&nbsp; */<BR>&nbsp; public void exampleSelect_1(){<BR>&nbsp;&nbsp;&nbsp; Session session;<BR>&nbsp;&nbsp;&nbsp; Query query;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; String hql;<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = HibernateUtil.currentSession();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查询符合相应编号和年龄大于25的学生纪录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;hql = " from com.kela.hb.pojo.KelaStudent as kelaStudent " +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " where kelaStudent.stuID = '402880fc07dfe16f0107dfe173640001' " +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " or kelaStudent.stuAge &gt; 25";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query = session.createQuery(hql);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = query.list();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it = list.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;while(it.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KelaStudent kelaStudent = (KelaStudent)it.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;&nbsp;&nbsp; 姓名:" + kelaStudent.getStuName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("&nbsp;&nbsp;&nbsp; 性别:" + kelaStudent.getStuSex());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.print("&nbsp;&nbsp;&nbsp; 年龄:" + kelaStudent.getStuAge());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;&nbsp;&nbsp; 地址:" + kelaStudent.getStuAddress());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp;&nbsp; } catch(HibernateException he) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("[提示]: 查询数据发生错误," + he.getMessage());<BR>&nbsp;&nbsp;&nbsp; } finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;/*<BR>&nbsp; * 属性查询(查询数据库表中需要的若干个字段)<BR>&nbsp; * 返回类型为数组方式<BR>&nbsp; */<BR>&nbsp;public void exampleSelect_2(){<BR>&nbsp;&nbsp; Session session;<BR>&nbsp;&nbsp; Query query;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; String hql;<BR>&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = HibernateUtil.currentSession();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//查询KELA_STUDENT中字段为StuName，StuAge，StuAddress的所有纪录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //同样也可以加一些条件<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;hql = " select kelaStudent.stuName, kelaStudent.stuAge, kelaStudent.stuAddress " +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " from com.kela.hb.pojo.KelaStudent as kelaStudent ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query = session.createQuery(hql);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = query.list();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it = list.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] rs = (Object[])it.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;&nbsp;&nbsp; 姓名:" + rs[0]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;&nbsp;&nbsp; 年龄:" + rs[1]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;&nbsp;&nbsp; 地址:" + rs[2]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.println();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; } catch(HibernateException he) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("[提示]: 查询数据发生错误," + he.getMessage());<BR>&nbsp;&nbsp;&nbsp; } finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp; }<BR>&nbsp;<BR>&nbsp;/*<BR>&nbsp; * 参数绑定(使用顺序占位符 ? ),相当于我们经常使用的：<BR>&nbsp;&nbsp;* select * from KELA_STUDENT where KelaID = ?&nbsp;&nbsp;&nbsp; and KelaAge &gt; ?<BR>&nbsp; */<BR>&nbsp; public void exampleSelect_3(){<BR>&nbsp;&nbsp;&nbsp; Session session;<BR>&nbsp;&nbsp; &nbsp;Query query;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; String hql;<BR>&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = HibernateUtil.currentSession();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查询符合相应编号和年龄大于20的学生纪录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hql = " from KelaStudent as kelaStudent " +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " where kelaStudent.stuID = ? or kelaStudent.stuAge &gt;= ?";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query = session.createQuery(hql);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //注意了是从0开始的<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setString(0, "402880fc07dfe16f0107dfe173640001");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;query.setInteger(1, 20);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = query.list();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it = list.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;while(it.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;KelaStudent kelaStudent = (KelaStudent)it.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.print("&nbsp;&nbsp;&nbsp; 姓名:" + kelaStudent.getStuName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.print("&nbsp;&nbsp;&nbsp; 性别:" + kelaStudent.getStuSex());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;&nbsp;&nbsp; 年龄:" + kelaStudent.getStuAge());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("&nbsp;&nbsp;&nbsp; 地址:" + kelaStudent.getStuAddress());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; } catch(HibernateException he) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("[提示]: 查询数据发生错误," + he.getMessage());<BR>&nbsp;&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;}<BR>&nbsp;<BR>&nbsp; /*<BR>&nbsp;&nbsp; * 参数绑定(使用引用占位符 : ),相当于我们经常使用的：<BR>&nbsp;&nbsp; * select * from KELA_STUDENT where KelaID = ? and KelaAge &gt; ?<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp; public void exampleSelect_4(){<BR>&nbsp;&nbsp;&nbsp;&nbsp; Session session;<BR>&nbsp;&nbsp;&nbsp;&nbsp; Query query;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp; String hql;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;session = HibernateUtil.currentSession();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查询符合相应编号的学生纪录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hql = " from KelaStudent as kelaStudent " +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " where kelaStudent.stuID = :stuID ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query = session.createQuery(hql);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //stuID 对应 :stuID<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setParameter("stuID", "402880fc07dfe16f0107dfe173640001");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = query.list();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it = list.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(it.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KelaStudent kelaStudent = (KelaStudent)it.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;&nbsp;&nbsp; 姓名:" + kelaStudent.getStuName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;&nbsp;&nbsp; 性别:" + kelaStudent.getStuSex());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.print("&nbsp;&nbsp;&nbsp; 年龄:" + kelaStudent.getStuAge());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp;&nbsp;&nbsp; 地址:" + kelaStudent.getStuAddress());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp; } catch(HibernateException he) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("[提示]: 查询数据发生错误," + he.getMessage());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;HibernateUtil.closeSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; }<BR>&nbsp;<BR>&nbsp; &nbsp;/*<BR>&nbsp;&nbsp;&nbsp; * 利用HQL的更新<BR>&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp; public void exampleUpdate() {<BR>&nbsp;&nbsp;&nbsp;&nbsp; Session session;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction tran;<BR>&nbsp;&nbsp;&nbsp;&nbsp; Query query;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String hql;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;session = HibernateUtil.currentSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tran = session.beginTransaction();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hql = " update KelaStudent " +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " set stuAge = 30 " +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " where stuID = '402880fc07dfe16f0107dfe173640001' ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query = session.createQuery(hql);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("更新的纪录条数是:" + query.executeUpdate());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tran.commit();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (HibernateException he) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("[提示]: 更新数据发生错误," + he.getMessage());<BR>&nbsp;&nbsp;&nbsp;&nbsp; } finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; }<BR>&nbsp;<BR>&nbsp; /*<BR>&nbsp;&nbsp; * 利用HQL的删除<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp;public void exampleDelete() {<BR>&nbsp;&nbsp; &nbsp;Session session;<BR>&nbsp;&nbsp;&nbsp; Transaction tran;<BR>&nbsp;&nbsp;&nbsp; Query query;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; &nbsp;String hql;<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = HibernateUtil.currentSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tran = session.beginTransaction();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;hql = "delete KelaStudent where stuID = '402880fc080437200108043725760001'";<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query = session.createQuery(hql);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("删除纪录的条数是：" + query.executeUpdate());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tran.commit();<BR>&nbsp;&nbsp;&nbsp;&nbsp; } catch(HibernateException he) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("[提示]: 删除数据发生错误," + he.getMessage());<BR>&nbsp;&nbsp;&nbsp;&nbsp; } finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args) {<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StudentHQL studentHQL = new StudentHQL();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; studentHQL.exampleSelect_1();<BR>&nbsp; }</P>
<P>}<BR></P><img src ="http://www.blogjava.net/kela/aggbug/22966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kela/" target="_blank">Kela</a> 2005-12-08 13:29 <a href="http://www.blogjava.net/kela/articles/22966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>kela的笔记 ORM产品 ---- hibernate(4)</title><link>http://www.blogjava.net/kela/articles/22706.html</link><dc:creator>Kela</dc:creator><author>Kela</author><pubDate>Tue, 06 Dec 2005 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/kela/articles/22706.html</guid><wfw:comment>http://www.blogjava.net/kela/comments/22706.html</wfw:comment><comments>http://www.blogjava.net/kela/articles/22706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kela/comments/commentRss/22706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kela/services/trackbacks/22706.html</trackback:ping><description><![CDATA[<P><STRONG>使用Criteria Query 进行数据查询</STRONG><BR><BR>Criteria Query 是一种通过对象化的查询，并将数据查询条件封装为一个对象。<BR>简单来看，可以看作是传统SQL的对象化表示，如：<BR>&nbsp;&nbsp; criteria = session.createCriteria(KelaStudent.class);<BR>&nbsp;&nbsp; criteria.add(Expression.eq("stuName", "邓立强"));<BR>这相当于SQL的 " select * from KELA_STUDENT where StuName = '邓立强' "<BR>&nbsp;<BR>这种方式的特点是比价符合Java程序员的编码习惯，非常的容易上手。</P>
<P>更多的使用方法和参数,参考Hibernate文档和深入浅出Hibernate等资料。</P>
<P>示例一：StudentCriteriaQuery.java 一个基本 Criteria Query 的查询<BR><BR>/**<BR>&nbsp;* StudentCriteriaQueryl.java<BR>&nbsp;* <BR>&nbsp;* 基于 Criteria Query 的对象化查询<BR>&nbsp;*/<BR>package com.kela.hb.model;</P>
<P>import java.util.Iterator;<BR>import java.util.List;</P>
<P>import org.hibernate.Criteria;<BR>import org.hibernate.HibernateException;<BR>import org.hibernate.Session;<BR>import org.hibernate.Transaction;<BR>import org.hibernate.criterion.Example;<BR>import org.hibernate.criterion.Expression;</P>
<P>import com.kela.hb.pojo.KelaStudent;<BR>import com.kela.hb.util.HibernateUtil;</P>
<P>/**<BR>&nbsp;* @author kangfeng(<A href="mailto:kela.kf@gmail.com">kela.kf@gmail.com</A>)<BR>&nbsp;* <BR>&nbsp;*/<BR>public class StudentCriteriaQuery {<BR>&nbsp;<BR>&nbsp;&nbsp;/*<BR>&nbsp; &nbsp;* 带有表达式的 Criteria 查询<BR>&nbsp;&nbsp; */<BR>&nbsp; &nbsp;public void exampleSelect_1() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Criteria criteria;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = HibernateUtil.currentSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria = session.createCriteria(KelaStudent.class);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关于Expression提供的对应查询限定机制, 可在Hibernate的文档中获得详细资料<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果没有一下的查询条件则查询所有的数据库 KELA_STUDENT 的纪录<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查询数据库表 KELA_STUDENT 中　StuName = '邓立强'的纪录, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查询条件中的stuName对应com.kela.hb.pojo.KelaStudent的属性stuName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //criteria.add(Expression.eq("stuName", "邓立强"));<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查询年龄大于25岁的学生纪录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add(Expression.gt("stuAge", new Integer(25)));<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果同时出现几个限定条件,如 StuName = '邓立强'; stuAge &gt; 25 则取交集<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KelaStudent kelaStudent = new KelaStudent();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = criteria.list();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it = list.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kelaStudent = (KelaStudent)it.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 编号:" + kelaStudent.getStuID());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 名称:" + kelaStudent.getStuName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 性别:" + kelaStudent.getStuSex());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 年龄:" + kelaStudent.getStuAge());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 地址:" + kelaStudent.getStuAddress());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (HibernateException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("[提示]: 查询没有成功," + e.getMessage());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;HibernateUtil.closeSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp; }<BR>&nbsp;<BR>&nbsp; /*<BR>&nbsp;&nbsp; * 示例查询,根据已有的对象，查询属性与之相符的其它对象<BR>&nbsp;&nbsp; */<BR>&nbsp; public List exampleSelect_2(KelaStudent kelaStudent) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Criteria criteria;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = HibernateUtil.currentSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; criteria = session.createCriteria(KelaStudent.class);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add(Example.create(kelaStudent));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return criteria.list();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (HibernateException he) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("[提示]: 查询发生错误," + he.getMessage());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp; }<BR>&nbsp;<BR>&nbsp; /*<BR>&nbsp;&nbsp; * 调用示例查询，并打印结果<BR>&nbsp;&nbsp; * 这种查询并不常用，但是在组合查询中非常的有用途。<BR>&nbsp;&nbsp; * 比如要查询的条件有多个，但不能确定的时候，可以按照下面的例子使用，直接设定查询的条件，<BR>&nbsp;&nbsp; * 然&nbsp;后将对象传入即可查询。<BR>&nbsp;&nbsp; */<BR>&nbsp;&nbsp; public void exampleSelect_3() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KelaStudent kelaStudent = new KelaStudent();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在这里可以设置多个条件，如年龄，地址等<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;kelaStudent.setStuName("邓立强");<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;List list = exampleSelect_2(kelaStudent);<BR>&nbsp;&nbsp;&nbsp;&nbsp; Iterator it = list.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;kelaStudent = (KelaStudent)it.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 编号:" + kelaStudent.getStuID());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 名称:" + kelaStudent.getStuName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 性别:" + kelaStudent.getStuSex());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 年龄:" + kelaStudent.getStuAge());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("&nbsp; 地址:" + kelaStudent.getStuAddress());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; }<BR>&nbsp;<BR>&nbsp;&nbsp; public static void main(String[] args) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StudentCriteriaQuery scq = new StudentCriteriaQuery();<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查询年龄大于25的学生纪录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scq.exampleSelect_1();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //按照给定的条件进行查询，这里为 name = '邓立强'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//scq.exampleSelect_3();<BR>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; </P>
<P>}<BR></P><img src ="http://www.blogjava.net/kela/aggbug/22706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kela/" target="_blank">Kela</a> 2005-12-06 13:31 <a href="http://www.blogjava.net/kela/articles/22706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>kela的笔记 ORM产品 ---- hibernate(3)</title><link>http://www.blogjava.net/kela/articles/20934.html</link><dc:creator>Kela</dc:creator><author>Kela</author><pubDate>Tue, 22 Nov 2005 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/kela/articles/20934.html</guid><wfw:comment>http://www.blogjava.net/kela/comments/20934.html</wfw:comment><comments>http://www.blogjava.net/kela/articles/20934.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/kela/comments/commentRss/20934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kela/services/trackbacks/20934.html</trackback:ping><description><![CDATA[<P>一个Hibernate版本的“Hello World”<BR><BR>1.&nbsp;搭建环境<BR>&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>建立项目：</STRONG>名称为HibernateProject，如下图：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG height=142 alt=hb001.BMP src="http://www.blogjava.net/images/blogjava_net/kela/hb001.BMP" width=240 border=0><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>下载Hibernate发行包：</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里使用 Hibernate3.X ，因为 Hibernate 在3.X 上性能有了更大的提升。（也可以采用 2. X的版本，3.X 和 2.X 之间的差异不多，这里的“不多”是从使用者的角度来看，在需要注意的地方，会注明，另附 3.X 和 2.X 差异表一张）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载地址：<A href="http://www.hibernate.org/">http://www.hibernate.org</A>&nbsp;在 <A href="http://www.redsaga.com/">http://www.redsaga.com</A> 的努力之下，Hibernate 的官方发行包中（ doc\reference 下），始终有高质量的中文官方文档，非常的感谢他们。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>在ClassPath 中设置系统开发需要的类库：<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在项目的lib目录下添加以下类包( .jar) 文件，并且将这些&nbsp;.jar 指定在系统&nbsp;ClassPath 中。（总之，无论在哪种环境中都必须保证系统能找到我们设置的 .jar 。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.数据库驱动程序<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据库使用 MS SQL SERVER&nbsp;，以下是MS 的 JDBC&nbsp;驱动。（ MS 的 JDBC 驱动不是 Hibernate 官方的推荐驱动，在实际的项目中，朋友们可以根据 Hibernate&nbsp;&nbsp;开发文档中的配置说明进行取舍）&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msbase.jar, &nbsp;mssqlserver.jar, msutil.jar<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.Hibernate 3.X 的类库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将发行包下的 hibernate3.jar 文件复制到 项目（HibernateProject）的 lib 目录下。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.Hibernate需要的第三方类库<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将发行包下 lib 目录下的 .jar 文件复制到项目（HibernateProject）的 lib 目录下。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要注意的是，我们这里将全部的 .jar&nbsp;放在了lib中，在实际的开发中可以根据文档配置的说明，进行选择。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>2. 建立数据库<BR>&nbsp;&nbsp;&nbsp; <STRONG>数据库名称：</STRONG>hbdb<BR>create database hbdb;<BR>&nbsp;&nbsp; &nbsp;<STRONG>数据表名称：</STRONG>KELA_STUDENT&nbsp;&nbsp; <BR>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[KELA_STUDENT]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)<BR>drop table [dbo].[KELA_STUDENT]<BR>GO</P>
<P>CREATE TABLE [dbo].[KELA_STUDENT] (<BR>&nbsp;[StuID] [varchar] (32) COLLATE Chinese_PRC_CI_AS NOT NULL ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- PK<BR>&nbsp;[StuName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --学生姓名<BR>&nbsp;[StuSex] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--学生性别<BR>&nbsp;[StuAge] [smallint] NULL ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --学生年龄<BR>&nbsp;[StuAddress] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--学生地址<BR>) ON [PRIMARY]<BR>GO<BR><BR>3.&nbsp;将 发行包下 ehcache.xml 文件复制到 src 下&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;在Hibernate3中, 如果没有这个文件会出现<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <U>WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the classpath: jar:file:/D:/J2eeProject/HibernateProject/lib/ehcache-1.1.jar!/ehcache-failsafe.xml<BR></U>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的错误。<BR>&nbsp;&nbsp;&nbsp; 该文件为 Hibernate 的本身的 Cache 配置。<BR>4. Hibernate 配置<BR>&nbsp;&nbsp;&nbsp; Hibernate 配置文件主要用于配置数据库连接和Hibernate运行时所需要的各种属性（如，连接池，SQL方言，是否现实SQL日志等）。<BR>&nbsp;&nbsp;&nbsp; Hibernate 同时支持&nbsp;xml&nbsp;格式的配置文件各传统的 properties 文件配置形式，这里采用 xml&nbsp;。<BR>&nbsp;&nbsp;&nbsp; 配置文件名默认为 hibernate.cfg.xml（或 hibernage.properties），Hibernate在初始化期间自动在 classPath中寻找这个文件，并读取其中的配置信息，并加载。<BR>&nbsp;&nbsp;&nbsp; 以下是 hibernate.cfg.xml&nbsp;文件（在项目 HibernateProject 的src 下放以下内容）：<BR>&lt;?xml version="1.0" encoding="GB2312"?&gt;<BR>&lt;!DOCTYPE hibernate-configuration PUBLIC<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Hibernate/Hibernate Configuration DTD 3.0//EN"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<A href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd</A>"&gt;</P>
<P>&lt;hibernate-configuration&gt;<BR>&nbsp;&lt;session-factory&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- 是否将运行期生成的SQL输出到日志以供调试 --&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.show_sql"&gt;<BR>&nbsp;&nbsp;&nbsp;true<BR>&nbsp;&nbsp;&lt;/property&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- SQL 方言--&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.dialect"&gt;<BR>&nbsp;&nbsp;&nbsp;org.hibernate.dialect.SQLServerDialect<BR>&nbsp;&nbsp;&lt;/property&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- 数据库用户 --&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.connection.username"&gt;<BR>&nbsp;&nbsp;&nbsp;sa<BR>&nbsp;&nbsp;&lt;/property&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- 数据库密码 --&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.connection.password"&gt;<BR>&nbsp;&nbsp;&nbsp;123456<BR>&nbsp;&nbsp;&lt;/property&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- 数据库 JDBC 驱动--&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;property name="hibernate.connection.driver_class"&gt;<BR>&nbsp;&nbsp;&nbsp;com.microsoft.jdbc.sqlserver.SQLServerDriver<BR>&nbsp;&nbsp;&lt;/property&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- 数据库 URL --&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.connection.url"&gt;<BR>&nbsp;&nbsp;&nbsp;jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hbdb<BR>&nbsp;&nbsp;&lt;/property&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- 事务管理类型 --&gt;<BR>&nbsp; &lt;!-- Hibernate 3 对包名做了修改 （ net.sf.hibernate&nbsp; =&gt; org.hibernate ）--&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.transaction.factory_class"&gt;<BR>&nbsp;&nbsp;&nbsp;org.hibernate.transaction.JDBCTransactionFactory<BR>&nbsp;&nbsp;&lt;/property&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- c3p0 连接池 --&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.connection.provider_class"&gt;org.hibernate.connection.C3P0ConnectionProvider&lt;/property&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.max_size"&gt;2&lt;/property&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.min_size"&gt;2&lt;/property&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.timeout"&gt;50000&lt;/property&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.max_statements"&gt;100&lt;/property&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.idle_test_period"&gt;3000&lt;/property&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.acquire_increment"&gt;2&lt;/property&gt;<BR>&nbsp;&nbsp;&lt;property name="hibernate.c3p0.validate"&gt;false&lt;/property&gt;<BR>&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!-- 映射的配置文件，对应数据库表 KELA_STUDENT 的映射文件，在后面将看到这个文件的配置 --&gt;<BR>&nbsp;&nbsp;&lt;mapping resource="com/kela/hb/pojo/KelaStudent.hbm.xml"/&gt;<BR>&nbsp;&lt;/session-factory&gt;<BR>&lt;/hibernate-configuration&gt;<BR><BR>5. 日志配置<BR>在Hibernate发行包的etc目录下找到 log4j.properties 示例配置文件，可以修改其中的日志级别，也可直接使用。<BR>在src下，放置 log4j.properties 文件，内容如下：<BR># log4j #<BR>log4j.appender.stdout=org.apache.log4j.ConsoleAppender<BR>log4j.appender.stdout.Target=System.out<BR>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n</P>
<P>log4j.rootLogger=warn, stdout</P>
<P>#设置显示 error以上级别log<BR>log4j.logger.org.hibernate=error&nbsp;<BR><BR>6. 构建 POJO 类和Hibernate映射( .hbm.xml)文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明：根据数据库定义导出表结构，并自动生成对应的映射文件和POJO java代码，是实际开发当中最常用的方式，也是专家所推荐的。可以使用 MiddleGen -- Hibernate，Hibernate -- Extensions 等的工具，这些工具的使用非常的方便，只修修改相应的 ant 构建文件即可，在网络上可以很容易的找到这些工具的使用方法。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里采用手工编写 POJO 和映射文件的方法，是基于开发者更好理解 Hibernate 运作机制而考虑。付出手工编写会产生疏漏和错误的代价，我觉得在学习阶段是值得的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下是这两个文件，他们的位置都在&nbsp;<STRONG>&nbsp; com.kela.hb.pojo </STRONG>下面。<BR><STRONG>POJO类：com.kela.hb.pojo.KelaStudent</STRONG><BR>&nbsp;/**<BR>&nbsp; * KelaStudent.java<BR>&nbsp; */<BR>package com.kela.hb.pojo;</P>
<P>import java.io.Serializable;</P>
<P>public class KelaStudent implements Serializable {</P>
<P>&nbsp;private static final long serialVersionUID = 8365163573354176897L;<BR>&nbsp;<BR>&nbsp;String stuID;<BR>&nbsp;String stuName;<BR>&nbsp;String stuSex;<BR>&nbsp;Integer stuAge;<BR>&nbsp;String stuAddress;<BR>&nbsp;<BR>&nbsp;public KelaStudent() {<BR>&nbsp;&nbsp;<BR>&nbsp;}</P>
<P>&nbsp;public String getStuAddress() {<BR>&nbsp;&nbsp;return stuAddress;<BR>&nbsp;}</P>
<P>&nbsp;public void setStuAddress(String stuAddress) {<BR>&nbsp;&nbsp;this.stuAddress = stuAddress;<BR>&nbsp;}</P>
<P>&nbsp;public Integer getStuAge() {<BR>&nbsp;&nbsp;return stuAge;<BR>&nbsp;}</P>
<P>&nbsp;public void setStuAge(Integer stuAge) {<BR>&nbsp;&nbsp;this.stuAge = stuAge;<BR>&nbsp;}</P>
<P>&nbsp;public String getStuID() {<BR>&nbsp;&nbsp;return stuID;<BR>&nbsp;}</P>
<P>&nbsp;public void setStuID(String stuID) {<BR>&nbsp;&nbsp;this.stuID = stuID;<BR>&nbsp;}</P>
<P>&nbsp;public String getStuName() {<BR>&nbsp;&nbsp;return stuName;<BR>&nbsp;}</P>
<P>&nbsp;public void setStuName(String stuName) {<BR>&nbsp;&nbsp;this.stuName = stuName;<BR>&nbsp;}</P>
<P>&nbsp;public String getStuSex() {<BR>&nbsp;&nbsp;return stuSex;<BR>&nbsp;}</P>
<P>&nbsp;public void setStuSex(String stuSex) {<BR>&nbsp;&nbsp;this.stuSex = stuSex;<BR>&nbsp;}<BR>}<BR><BR><STRONG>映射文件：KelaStudent.hbm.xml<BR></STRONG>&lt;?xml version="1.0" encoding="GB2312"?&gt;<BR>&lt;!DOCTYPE hibernate-mapping<BR>&nbsp;&nbsp;&nbsp; PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<BR>&nbsp;&nbsp;&nbsp; "<A href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</A>"&gt;</P>
<P>&lt;hibernate-mapping&gt;<BR>&nbsp;<BR>&nbsp;&lt;class name="com.kela.hb.pojo.KelaStudent" table="KELA_STUDENT"&gt;<BR>&nbsp;&nbsp;<BR>&nbsp; &lt;!-- id 节点配置了表的主键--&gt;<BR>&nbsp;&nbsp;&lt;id <BR>&nbsp;&nbsp;&nbsp;name="stuID"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //POJO类指的ID<BR>&nbsp;&nbsp;&nbsp;column="StuID"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据库中的主键名称<BR>&nbsp;&nbsp;&nbsp;type="java.lang.String"&nbsp;&nbsp;&nbsp; //字符类型<BR>&nbsp;&nbsp;&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;generator class="uuid.hex"/&gt;&nbsp;&nbsp; //这里的uuid.hex代表了一种主键的生成方式<BR>&nbsp;&nbsp;&lt;/id&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;property <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="stuName"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //POJO中的属性<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column="StuName"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//属性对应数据库字段的名称<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="java.lang.String" //属性类型<BR>&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;property <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="stuSex"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column="StuSex"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="java.lang.String"<BR>&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;property <BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;name="stuAge"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column="StuAge"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="java.lang.Integer"<BR>&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;property <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="stuAddress"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column="StuAddress"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="java.lang.String"<BR>&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&lt;/class&gt;<BR>&lt;/hibernate-mapping&gt;<BR><BR>7. 测试代码<BR><STRONG>HelloTest&nbsp; . java</STRONG><BR><BR>package com.kela.test;</P>
<P>import org.hibernate.HibernateException;<BR>import org.hibernate.Session;<BR>import org.hibernate.Transaction;</P>
<P>import com.kela.hb.pojo.KelaStudent;<BR>import com.kela.hb.util.HibernateUtil;</P>
<P>public class HelloTest {<BR><BR>&nbsp;&nbsp;&nbsp; Session session = null;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;public void testInsert() {</P>
<P>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Transaction tran = null;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从&nbsp; HibernateUtil 得到 hibernate的session,&nbsp; HibernateUtil .java&nbsp;文件在后<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = HibernateUtil.currentSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //启动事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tran = session.beginTransaction();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KelaStudent kelaStudent = new KelaStudent();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //插入数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kelaStudent.setStuName("王小二");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;kelaStudent.setStuSex("T");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; kelaStudent.setStuAge(new Integer(26));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;kelaStudent.setStuAddress("甘肃兰州");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //保存并提交事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.save(kelaStudent);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; session.flush();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tran.commit();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; } catch (HibernateException he){<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("运行中发生了错误");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;HibernateUtil.closeSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;} catch (HibernateException he2) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("关闭 session 没有成功");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" ========= 开始测试 ==========");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HelloTest helloTest = new HelloTest();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;helloTest.testInsert();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" ========= SUCCESS ==========");<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>}<BR><BR><STRONG>下面是 HibernateUtil&nbsp; . java</STRONG><BR>/**<BR>&nbsp;* HibernateUtil.java<BR>&nbsp;*/<BR>package com.kela.hb.util;</P>
<P>import org.apache.commons.logging.Log;<BR>import org.apache.commons.logging.LogFactory;<BR>import org.hibernate.Session;<BR>import org.hibernate.SessionFactory;<BR>import org.hibernate.cfg.Configuration;</P>
<P>public class HibernateUtil {</P>
<P>&nbsp;&nbsp; private static Log log = LogFactory.getLog(HibernateUtil.class);</P>
<P>&nbsp;&nbsp; private static final SessionFactory sessionFactory;</P>
<P>&nbsp;&nbsp; static {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = new Configuration().configure().buildSessionFactory();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable ex) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("初始化 SessionFactory 发生错误.", ex);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ExceptionInInitializerError(ex);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; &nbsp;public static final ThreadLocal session = new ThreadLocal();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static Session currentSession() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session s = (Session) session.get();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (s == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = sessionFactory.openSession();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;session.set(s);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; return s;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; public static void closeSession() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session s = (Session) session.get();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (s != null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.set(null);<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>}<BR><BR>8. 运行结果<BR>&nbsp;&nbsp;&nbsp; 运行 <STRONG>HelloTest.java </STRONG>文件，观察数据库中的结果，可以看到一条数据被添加了进来。<BR><BR>&nbsp;&nbsp; 数据库结果：<BR>&nbsp;&nbsp; <STRONG>402880fc07c68f690107c68f6dfd0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;王小二&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 甘肃兰州<BR></STRONG>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp; 在控制台看到如下日志：<BR>&nbsp;&nbsp;&nbsp; <STRONG>Hibernate:<BR>&nbsp;&nbsp;&nbsp; insert into KELA_STUDENT (StuName, StuSex, StuAge, StuAddress, StuID) values (?, ?, ?, ?, ?)<BR></STRONG>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 就是这么神奇。不需要指定 SQL 语句一样能实现SQL的功能。<BR><BR>9. 关于测试代码的解释<BR>&nbsp;&nbsp;&nbsp; 在Hibernate中session完成持久化操作，要创建一个Session实例大致需要3个步骤：<BR>&nbsp;&nbsp;&nbsp; A. 初始化Hibernate配置管理类Configuration<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读入默认的配置文件(hibernate.cfg.xml 或 hibernate.properties)来创建一个Configuration<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration config = new Configuration().configure();&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; B. 通过Configuration类的实例来创建 Session 的工厂类 SessionFactory：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionFactory sessionFactory = config.buildSessionFactory();<BR><BR>&nbsp;&nbsp;&nbsp; C. 通过SessionFactory得到Session实例：<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = sessionFactory.openSession();<BR><BR>&nbsp;&nbsp;&nbsp; D. 通过Session实例完成持久化操作：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //启动事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tran = session.beginTransaction();<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KelaStudent kelaStudent = new KelaStudent();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //插入数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kelaStudent.setStuName("王小二");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;kelaStudent.setStuSex("T");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; kelaStudent.setStuAge(new Integer(26));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;kelaStudent.setStuAddress("甘肃兰州");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //保存并提交事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.save(kelaStudent);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; session.flush();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tran.commit();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明：由于SessionFactory采取了线程安全的设计，可以有多个线程并发调用，大多数情况下，一个应用中针对一个数据库共享一个SessionFactory实例即可。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session（这里的Session是Hibernate的Session）可以理解成相当于JDBC 的Connection），它的设计是非线程安全的也就是说一个Session实例只可以由一个线程使用。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有了以上两点的考虑，在 HelloTest.java中在得到Session实例使用了：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>&nbsp;&nbsp;//从&nbsp; HibernateUtil 得到 hibernate的session,&nbsp; HibernateUtil .java&nbsp;文件在后<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session = HibernateUtil.currentSession();</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在HibernateUtil.java 文件中创建Session，关闭Session。（这段代码来自于Hibernate文档）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这就相当于我们平时从数据库连接池中得到 Connection，用完了 close.conn() 是一样的道理。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR></P><img src ="http://www.blogjava.net/kela/aggbug/20934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kela/" target="_blank">Kela</a> 2005-11-22 13:02 <a href="http://www.blogjava.net/kela/articles/20934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>kela的笔记 ORM产品 ----  hibernate(2) </title><link>http://www.blogjava.net/kela/articles/19895.html</link><dc:creator>Kela</dc:creator><author>Kela</author><pubDate>Tue, 15 Nov 2005 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/kela/articles/19895.html</guid><wfw:comment>http://www.blogjava.net/kela/comments/19895.html</wfw:comment><comments>http://www.blogjava.net/kela/articles/19895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kela/comments/commentRss/19895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kela/services/trackbacks/19895.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate有那么多的优点，那么这些优点在我们的应用开发中是如何体现呢，确切的说我们不是因为他流行而用它而是因为它能给我们的开发带来帮助，能提高系统的性能。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate是持久层的框架，那就的先从持久层说起。看看我们通常的持久层是如何做的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 关于持久层的介绍：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MVC作为主流的系统架构模式，已被越来越多的开发者所使用。MVC中的M，也就是Model则包含着大量的业务逻辑和数据逻辑，持久层作为Model中的重要组成，其设计的优劣将对系统的整体表现产生至关重要的影响。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “持久层”，也就是在系统逻辑层面上，专注于实现数据持久化（对内存的数据进行固化，通常指保存至住据库）的一个相对独立的领域。也就意味着，我们的系统架构中，因该有一个相对独立的逻辑层面，专注于数据持久化逻辑的实现，与系统其他部门相对而言，这个层面应该拥有一个较为清晰和严格的逻辑边界。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 持久层的设计<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;场景：（在“深入浅出Hibernate”中一个非常好的例子），用户进入网上商店进行购物结算，那么他有以下的业务处理逻辑。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）根据客户ID取出客户当前等级（如，普通会员，VIP）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）根据客户等级获得打折比率。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）根据总金额 × 打着比率计算到实际支付的金额。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4）将本次实际的支付的金额累积到客户累计消费金额的字段中。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5）返回实际金额。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A方法，有的朋友可能这样处理：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public calss NetShop {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;/*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 购物结算<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public BigDecimal balance(String userID) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = ......<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取当前等级， select<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch () {&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得打折比率， select<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//计算实际支付金额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch () { }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将支付的金额累计到累积消费中， update<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //修改客户现有的余额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch () {}</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回实际的消费金额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return new BigDecimal(****);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B. 那另外的一些朋友他们会说，在A里面混杂的业务逻辑和数据访问代码极大的干扰了阅读程序的人，而且这样的代码将给日后的维护带来极大的困难（我也是这样认为哦 ~ ~）。如果我们的实际应用当中的业务逻辑变得非常庞大和复杂的时候，A的做法显然有忧缺点的。于是，就有了下面的改造：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public calss NetShop {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;......</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 购物结算<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public BigDecimal balance(String userID) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A a = new A();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String gradeStr = null;&nbsp; //客户级别<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long agioLong = 0.0;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获取当前等级<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;gradeStr = a.getUserGarde(userID);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //根据等级计算打折比率<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;agioLong = a.getAgio(gradeStr);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//累计客户消费金额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;a.updateCustMoney(userID, agioLong);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //修改客户余额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.updateUserBalance(userID, agioLong);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回消费金额<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new BigDecimal(****);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class A {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //去实现上面对方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以说B的实现方式，是我（呵呵，大多数可不敢乱说）经常使用的方式，在实际的应用当中结合一些数据库性能上的优化（连接池，预编译语句之类的），基本上已经实现了，业务和数据层的分离。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然而，在现在客户的应用需求和公司考虑可重用等因素的影响下，我们有不得不去考虑，我们的应用能不能实现严格意义上的跨数据库使用，或者说，我们的应用从一个数据迁移到另外一个数据的时候，是不是只做很少的改动（因为，现在有很多的项目需要引入第三方的产品，它山之石可以攻玉嘛）。带着这样的疑问，那我们是不是会写很多的基于特定数据库的数据层处理代码（当然了，这也是个好办法）。现在我们就要引入Hibernate了，我觉得选择一个比我们自己的实现方式更好的实现方式，是一个更加聪明的决策。那么Hibernate能干什么？<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）减少乏味的代码<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无论是A方法还是B方法我们都少不了大量的数据库连接，查询，关闭等代码，写得多了也就觉得烦了，Hibernate封装了数据库持久层大多数技术细节，如事物管理，连接管理，sql执行等。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至少这点，我们是需要的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）更加面向对象的设计<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就是说像设计对象一样的去设计和操作数据库。这条可能现在还不能理解。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3）更好的性能<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我觉得这条好理解多了，系出名门和专家之手的框架，肯定提供了非常优秀的性能优化机制。比如，对连接池，PreparedSatatement 缓存，数据缓存等。这点我们可以大可放心，因为使用者决定了它的优秀。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4）更好的移植性<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们只需要简单得修改其的配置参数，即可实现底层数据库的良好切换（这也是有前提的哦，可不能使用特定数据库都有的特性）。这条的好处是显而易见的。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于引入Hibernate有什么好处，我觉得以上就足够了，它确实能帮助我们。</P><img src ="http://www.blogjava.net/kela/aggbug/19895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kela/" target="_blank">Kela</a> 2005-11-15 15:19 <a href="http://www.blogjava.net/kela/articles/19895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>kela的笔记 ORM产品 ---- hibernate(1)</title><link>http://www.blogjava.net/kela/articles/19678.html</link><dc:creator>Kela</dc:creator><author>Kela</author><pubDate>Mon, 14 Nov 2005 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/kela/articles/19678.html</guid><wfw:comment>http://www.blogjava.net/kela/comments/19678.html</wfw:comment><comments>http://www.blogjava.net/kela/articles/19678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kela/comments/commentRss/19678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kela/services/trackbacks/19678.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. &nbsp;一直未能将自己零零散散的hibernate做一次整理，总觉有些底气不足。这些笔记记录自己学习hibernate的一些过程，实际也是自己对书本，电子书，网络文章（有夏昕的 Hibernate Development Guide, *米小国*奇想世界的一份Hibernate学习笔记,国内开发者翻译的Hibernate官方文档，夏昕，曹晓刚，唐勇的深入浅出Hibernate, Hibernate in Action, 以及很多网友的文章，这些参考都能从网上找到，呵呵，书当然要花钱了）的笔记。目的在于帮助自己更好的理解ORM，并为自己的实际开发工作提供更好的思路和解决方法，欢迎大家的批评指正。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. Hibernate的说明<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作为一个产品应用的开发者了解一些产品本身的信息也是必要的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2001年末，Hibernate第一个正式版本对外发布，之后的两年时间Hibernate迅速成长起来，2003.6.8 Hibernate2的发布为Hibernate奠定了成功的基石。2003年末，Hibernate获得了Jolt 2004大奖以及Hibernate被业内知名开源组织JBoss收纳，成为从属于JBoss组织的子项目之一。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate是一个面向Java环境的ORM组件（解决方案，持久层框架），用来把对象模型表示的对象映射到基于SQL的关系模型结构中去。也就是说我们将对象与对象的关系对应到关系型数据库中的表格于表格之间的关系，也可以理解成像操作对象一样的去操作数据库。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate不仅仅管理Java类到数据库表的映射，还提供数据查询，事物管理，缓存管理，延迟加载等的实现。可以大幅度的减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate的目标是对于开发者通常的数据持久化相关的编程任务，解放其中的95%。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的中间层应用中，它们实现面向对象的业务模型和商业逻辑的应用，Hibernate是最有用的。不管怎样，Hibernate一定可以帮助你消除或者包装那些针对特定厂商的SQL代码，并且帮你把结果集从表格式的表示形式转换到一系列的对象去。<BR><img src ="http://www.blogjava.net/kela/aggbug/19678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kela/" target="_blank">Kela</a> 2005-11-14 13:23 <a href="http://www.blogjava.net/kela/articles/19678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>