Hibernate用法十分简单,当我们在Java项目中引入Hibernate框架之后,就能以面向对象的方式来操作关系数据库了。
下载:
登陆Hibernate官网,下载Hibernate压缩包,windows平台下载.zip包,Linux平台下载.tar包。
解压压缩包,可以看到如下目录结构:
documentation:该路径下存放Hibernate的相关文档,包括Hibernate的参考文档和API文档等。
lib:该路径下存放Hibernate 编译和运行所依赖的第三方类库 其中require目录中是必需的jar包。
project:该路径下存放了Hibernate各种相关项目的源代码。
由于Hibernate底层依然是基于JDBC的,因此在应用程序中使用Hibernate执行持久化时,一定少不了对应数据库的JDBC驱动包。
Hibernate的数据库操作:
在所有的ORM框架中都有一个什么重要的媒介:PO(Persistent Object) 持久化对象。Hibernate是低侵入式的设计,完全采用普通的Java Bean对象来作为持久化对象
使用。该持久化对象的类 不需要继承任何的父类,或者实现任何的接口。
Hibernate的XML文件有两类:映射文件和配置文件
映射文件:
文件名:XXXX.hbm.xml (若干)
映射文件完成持久化类和数据库表,持久化类属性(Field)与数据库表列字段之间的对应关系。
配置文件:
文件名;hibernate.cfg.xml (一个)
配置文件完成连接哪个数据库,连接数据库的用户名和密码,以及连接数据库时使用的连接池,以及要使用的映射文件。
Hibernate的配置文件默认文件名是hibernate.cfg.xml,当程序调用Configuration对象的configure()方法时,Hibernate会自动加载该文件。
持久化操作代码:
1 public class NewsManager 2 { 3 public static void main(String[] args) 4 { 5 Configuration conf = new Configuration().configure(); 6 SessionFactory sf = conf.buildSessionFactory(); 7 Session sess = sf.openSession(); 8 Transaction tran = sess.beginTransaction(); 9 10 News new = new News(); 11 new.setTitle("Hibernate"); 12 new.setContent("First Hibernate Demo"); 13 14 sess.save(new); 15 tran.commit(); 16 sess.close(); 17 sf.close(); 18 19 } 20 }
持久化类:
1 public class News 2 { 3 private Integer id; 4 private String title; 5 private String content; 6 //id属性的setter和getter方法 7 ..... 8 //title属性的setter和getter方法 9 ...... 10 //content属性的setter和getter方法 11 ...... 12 13 }
所以完成一次持久化操作,大概有如下步骤:
1.开发持久化类 , 配置映射文件
2.配置配置文件 , 连接数据库
3.在操作类中,获取Configuration类的实例对象
4.获取SessionFactory类的实例对象
5.获取Session类对象
6.获取Transaction类对象 ,打开事务
6.通过Session类对象,以面向对象的方式操作数据库
7.提交事务,关闭Session.
可见,对于持久化对象的操作必须在Session类的实例对象调用相应方法才能同步到数据库。Session类的实例对象,由SessionFactory工厂产生。SessionFactory是
数据库编译后的内存镜像,通常一个应用对应一个SessionFactory类实例对象。SessionFactory类实例对象,由Configuration类实例对象产生,而Configuration类实例对象通过configure()方法加载默认的配置文件hibernate.cfg.xml。
上面就是通过Hibernate进行了一次持久化操作,对比Hibernate和JDBC两种操作数据库的方式,可以发现Hibernate有两大优点:
1.不需要手写SQL语句,以面向对象的方式操作数据库
2.Hibernate把使用JDBC访问数据库过程中产生的大量checked异常包装成了runtime异常,从而不必显示捕捉或者抛出,保证了代码的简洁性。