转载自:http://blog.csdn.net/fb281906011/article/details/17628111

一:下载hibernate:http://hibernate.org/orm/downloads/并且进行解压,里面有个lib文件夹,里面全是Hibernate所依赖的jar包,当然,不能缺少的核心包hibernate3.jar(这里我用到的是hibernate3),至于和现在的hibernate4有啥区别,自己也不清楚(希望有大牛能给我指正);
二:jar包都准备好后,就可以新建一个Javaproject,将刚才的的jar包全部导入(当然可能不是所有jar包都需要,但是本屌也不清楚哪些可以不要,为了以防万一,都进行导入,安全起见嘛);
三:工程建好后,我们就可以来进行我们的开发练习咯:
首先,我们先在src目录下新建一个hibernate.cfg.xml文件(至于为啥在src目录下,因为src目录最终会编译到一个bin文件夹中也就是类路径下(classpath下面),服务器启动时会自己在classpath下寻找该文件进行解析加载进来);
其次,就开始进行对hibernate.cfg.xml文件配置进行讲解(我连接的是MySQL5数据库,这里必须将MySQL-connector-Java.jar驱动包导入):

  1. <span style="font-size:14px;"><hibernate-configuration>
  2. <session-factory>
  3. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- mysql驱动 -->
  4. <property name="hibernate.connection.url">jdbc:mysql:///test</property><!-- mysql默认连接数据库test以及默认端口3306 -->
  5. <property name="hibernate.connection.username">root</property><!-- 用户名 -->
  6. <property name="hibernate.connection.password">root</property><!-- 密码 -->
  7. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- mysql方言 -->
  8. <property name="hbm2ddl.auto">create</property><!-- 更新数据库方式 -->
  9. <property name="show_sql">true</property><!-- 是否后台打印语句 -->
  10. <mapping resource="toone/com/cn/bo/User.hbm.xml"/><!--映射文件-->
  11. </session-factory>
  12. </hibernate-configuration></span>

以上属性(property)我们都可以在之前下载的Hibernate解压包中的etc文件夹下的hibernate.properties文件中找到()。这里对hbm2ddl.auto进行说明一下(有四个值):

create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
validate::启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新。

四:接下来我们就可以来进行我们的实体开发了:

User.java

  1. <span style="font-size:14px;">package toone.com.cn.bo;
  2. import java.util.Date;
  3. public class User {
  4. private int id;//必须有主键,因为hibernate很多方法都需要用到主键id
  5. private String name;
  6. private Date birthday;//必须提供默认的构造方法,这里没有,但是所有类都带有默认的构造方法;</span>
  1. <span style="font-size:14px;">  public int getId() {
  2. return id;
  3. }
  4. public void setId(int id) {
  5. this.id = id;
  6. }
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public Date getBirthday() {
  14. return birthday;
  15. }
  16. public void setBirthday(Date birthday) {
  17. this.birthday = birthday;
  18. }
  19. }</span><span style="font-size: 24px;">
  20. </span>

User.hbm.xml(映射文件)

  1. <span style="font-size:14px;"><hibernate-mapping package="toone.com.cn.bo.domain">
  2. <class name="User" table="user"><!--这里的table值对应数据库中的表名;如果没有table值,默认等于类名小写 -->
  3. <id name="id" column="id">
  4. <generator class="native"></generator><!--采用主键自增长方式-->
  5. </id>
  6. <property name="name" column="name"/><!-- 这里的column值对应数据库中的属性名;如果没有column值,默认等于属性名 -->
  7. <property name="birthday" column="birthday"/>
  8. </class>
  9. </hibernate-mapping></span>

五:最后我们就可以来进行我们的业务开发了(主要进行user的增删改查操作):

以前的采用jdbc来进行连接数据库的方式是很烦琐的,这里就充分发挥了hibernate的方便与优势了:

Main.java

  1. <span style="font-size:14px;">package toone.com.cn;
  2. import java.util.Date;
  3. import org.hibernate.HibernateException;
  4. import org.hibernate.Session;
  5. import org.hibernate.SessionFactory;
  6. import org.hibernate.Transaction;
  7. import org.hibernate.cfg.Configuration;
  8. import toone.com.cn.bo.User;
  9. public class Main {
  10. public static void main(String[] args){
  11. //这里千万注意,不能写成Configuration cfg = new Configuration();否则会报Hibernate Dialect must be explicitly set 错误信息将我们误导
  12. //;实际上前面我们已经配置了mysql的方言;
  13. Configuration cfg = new Configuration().configure();//对于configure()方法,我们可以引入其源代码进行查看,其会在类路
  14. //径下自动去加载一个默认的hibernate.cfg.xml文件;如果我们想换其他名字,可以使用其重载方法,具体可以查看其源代码(下载的压缩包中有)
  15. SessionFactory factory = cfg.buildSessionFactory();
  16. User user = new User();
  17. user.setName("Kobi");
  18. user.setBirthday(new Date());
  19. Session session = null;
  20. Transaction tx = null;
  21. try {
  22. session = factory.openSession();
  23. tx = session.beginTransaction();//开启事务
  24. session.save(user);//进行保存
  25. tx.commit();//提交事务
  26. } catch (HibernateException e) {
  27. if(tx!=null){
  28. tx.rollback();//回滚事务
  29. }
  30. throw e;//必须抛出异常
  31. }finally{
  32. if(session!=null){
  33. session.close();//关闭session
  34. }
  35. }
  36. }
  37. }</span>

好了,一个添加功能就已经实现,但是写到这里,我们可能发现我们每进行一次操作,比如添加,修改,删除,查找都需要执行这段代码:

  1. Configuration cfg = new Configuration().configure();
  2. SessionFactory factory = cfg.buildSessionFactory();

这段代码非常耗性能,因为它每次都需要去加载解析配置文件hibernate.cfg.xml,并且每次都需要创建session;因此我们不妨自己创建一个工具类,采用单利的方式来进行实现,并且该工具类实现实体的增删改查,代码如下:

HibernateUtils.java

  1. <span style="font-size:14px;">package toone.com.cn.util;
  2. import java.io.Serializable;
  3. import org.hibernate.HibernateException;
  4. import org.hibernate.Session;
  5. import org.hibernate.SessionFactory;
  6. import org.hibernate.Transaction;
  7. import org.hibernate.cfg.Configuration;
  8. public class HibernateUtils {
  9. private static SessionFactory sessionfactory;
  10. private HibernateUtils(){}
  11. static{
  12. Configuration cfg = new Configuration().configure();
  13. sessionfactory = cfg.buildSessionFactory();
  14. }
  15. public static Session getSession(){
  16. return sessionfactory.openSession();
  17. }
  18. //添加
  19. public static void add(Object obj){
  20. Session session = null;
  21. Transaction tx = null;
  22. try {
  23. session = HibernateUtils.getSession();
  24. tx = session.beginTransaction();
  25. session.save(obj);//区别:save()方法如果没有开启事务,它会执行一条插入语句,但之后由于没有提交事务,它又进行
  26. //session.persist(obj);//回滚了,而persist()方法在没有开启事务的时候,它根本不会去执行,即没有那条插入语句
  27. tx.commit();
  28. }finally{
  29. if(session!=null){
  30. session.close();
  31. }
  32. }
  33. }
  34. //修改
  35. public static void update(Object obj){
  36. Session session = null;
  37. Transaction tx = null;
  38. try {
  39. session = HibernateUtils.getSession();
  40. tx = session.beginTransaction();
  41. session.update(obj);
  42. tx.commit();
  43. }finally{
  44. if(session!=null){
  45. session.close();
  46. }
  47. }
  48. }
  49. //删除
  50. public static void delete(Object obj){
  51. Session session = null;
  52. Transaction tx = null;
  53. try {
  54. session = HibernateUtils.getSession();
  55. tx = session.beginTransaction();
  56. session.delete(obj);
  57. tx.commit();
  58. }finally{
  59. if(session!=null){
  60. session.close();
  61. }
  62. }
  63. }
  64. //查找 不需要开启事务
  65. public static Object findById(Class clazz,Serializable id){
  66. Session session = null;
  67. try {
  68. session = HibernateUtils.getSession();
  69. //这里需要区分一下get()与load()的区别,load()不会立即//去访问数据库只有在第一次使用的时候才会去加载(懒加载);
  70. //load方法永远不可能返回空对象(如果不存在,其会产生一个user的子类)具体可以去查资料区别这两个方法
  71. //Object obj = session.load(clazz, id);
  72. Object obj = session.get(clazz, id);return obj;}finally{if(session!=null){session.close();}}}}
  73. </span>

最后,一个实体的增删改查操作就完成了,下面我们可以重写Main.java文件来使用HibernateUtils工具类来对实体进行操作了:

Main.java

  1. <span style="font-size:14px;">package toone.com.cn;
  2. import java.util.Date;
  3. import toone.com.cn.bo.User;
  4. import toone.com.cn.util.HibernateUtils;
  5. public class Main {
  6. public static void main(String[] args){
  7. User user = new User();
  8. user.setName("Kobi");
  9. user.setBirthday(new Date());
  10. HibernateUtils.add(user);//添加
  11. user.setName("Jams");
  12. HibernateUtils.update(user);//修改
  13. HibernateUtils.delete(user);//删除
  14. User user1 = (User) HibernateUtils.findById(User.class, user.getId());//查找
  15. System.out.println(user1.getName());
  16. }
  17. }</span>

总结:了解了Hibernate的基本作用,学会了使用其来进行增删改查操作,算是工作之余的一点收获吧,以后还得继续坚持发帖,不断学习!

hibernate基础学习的更多相关文章

  1. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  2. Hibernate基础学习(五)—对象-关系映射(下)

    一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...

  3. Hibernate基础学习(四)—对象-关系映射(上)

    一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...

  4. Hibernate基础学习(七)—检索方式

    一.概述      Hibernate有五种检索方式. 1.导航对象图检索方式      根据已经加载的对象,导航到其他对象. Order order = (Order)session.get(Ord ...

  5. Hibernate基础学习(六)—Hibernate二级缓存

    一.概述      Session的缓存是一块内存空间,在这个内存空间存放了相互关联的Java对象,这个位于Session缓存内的对象也被称为持久化对象,Session负责根据持久化对象的状态来同步更 ...

  6. Hibernate基础学习(三)—Session

    一.概述      Session接口是Hibernate向应用程序提供的操纵数据库最主要的接口,它提供了基本的保存.更新.删除和加载Java对象的方法.      Session具有一个缓存,位于缓 ...

  7. Hibernate基础学习(二)—Hibernate相关API介绍

    一.Hibernate的核心接口      所有的Hibernate应用中都会访问Hibernate的5个核心接口.      (1)Configuration接口: 配置Hibernate,启动Hi ...

  8. Hibernate基础学习(一)—初识Hibernate

    一.对象的持久化 狭义的理解: 持久化仅仅指把对象永久的保存到数据库中. 广义的理解: 持久化包括和数据库相关的各种操作.         保存: 把对象永久保存到数据库中.         更新: ...

  9. hibernate基础学习---hierbnate2级缓存

    1:开启二级缓存sessionFactory需要安装jar包 2:在实体类配置文件添加(配置二级缓存).我的配置文件是Account.hbm.xml <?xml version="1. ...

随机推荐

  1. day-10 sklearn库实现SVM支持向量算法

    学习了SVM分类器的简单原理,并调用sklearn库,对40个线性可分点进行训练,并绘制出图形画界面. 一.问题引入 如下图所示,在x,y坐标轴上,我们绘制3个点A(1,1),B(2,0),C(2,3 ...

  2. 配置Android应用开发环境

    详解JRE.JDK.SDK.ADT请点击辨析ADK&JVM&JRE&JDK&ADT 一.安装JDK 开发 Android应用程序的时候,仅有Java运行环境(Java ...

  3. LCA(最近公共祖先)——dfs+ST 在线算法

    一.前人种树 博客:浅谈LCA的在线算法ST表 二.沙场练兵 题目:POJ 1330 Nearest Common Ancestors 题解博客:http://www.cnblogs.com/Miss ...

  4. 使用HashOperations操作redis

    方法 c参数 s说明 Long delete(H key, Object... hashKeys); H key:集合key Object... hashKeys:key对应hashkey  删除ma ...

  5. php serialize讲解与json性能测试

    [序列化的概念] 序列化是将对象状态转换为可保持或可传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 将对象的状态信息转换为可以存储或传输的 ...

  6. Hadoop Yarn on Docker

    搭建Hadoop Yarn on Docker 一.概览 Docker基于Linux Container技术整合了一堆易用的接口用于构建非常轻量级的虚拟机.Docker Container Execu ...

  7. 8086汇编语言 调用声卡播放wav文件(sound blaster)

    开更 大概最后做了一个能播放无损音乐(无压缩.不需解码)的播放器 原理是基于dosbox的模拟声卡,通过硬件之间的相互通讯做到的 关于详细内容接下来再讲. 一.从dosbox入手 我们知道cpu可以直 ...

  8. 【题解】APIO2007动物园

    首先一眼感受到这题特别的性质……5个?这么小的,感觉就像是状压.脑补了一下,如果没有环的话应该很好做吧……有环怎么办?5真的很小的,随便乱搞肯定也可以.那就放在外面暴力枚举吧.然后正解就出来了. 然而 ...

  9. WIN7服务优化,别关太多,小心启动不

    原文链接地址:http://blog.csdn.net/civilman/article/details/51423972 Adaptive brightness 监视周围的光线状况来调节屏幕明暗,如 ...

  10. 【bzoj2756 奇怪的游戏】

    Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4403  Solved: 1226[Submit][Status][Discuss] Descript ...