从四月份开始SSH的总结,其中五月份穿插着准备了一个月的软件设计师考试,总结完Struts和一部分Hibernate后,就中断了,Struts在上几篇博客中根据自己的理解已做了小结,Hibernate没有及时归仓,因此这两天做了一些必要的回顾,Hibernate在用dotNet开发项目的时候就接触过,当时理解Hibernate是为了不用手动写SQL语句而出现的,是SQLHelper的加强版。
那Hibernate到底为何物呢?随着学习的不断深入,我也在一层层的揭开Hibernate神秘的面纱,其实,Hibernate并没有让人喜爱的长相,巴掌大的脸蛋,以及和脸比例相称的大眼睛。但她让序员童鞋从大量相同的数据持久层相关编程工作中解放出来,随心所欲的使用对象编程思维来操纵数据库,极大地缩短了手动处理SQL和JDBC上的开发时间,并且她封装的足够彻底,平台的移植性足够的强大,最最最主要是她Free 和 OpenSource,是居家旅行,升职加薪的必备框架,不管你信不信,反正我已是不淡定了。
好了,废话一筐,进入正题。不管是看美女还是学习知识首先要从整体入手,那么我们先把Hibernate放到整体架构中去理解消化,Java中最经典的架构莫过于MVC了,Model层中又可以分为业务逻辑层和持久化逻辑层,Hibernate处在持久化逻辑层,主要负责和底层数据库打交道,持久化数据。如下图:
类似Hibernate的框架还有很多,比如IBatis,Spring JDBC template,Apache DBUtils等,他们各自的侧重点不同,但道理相通,先透过一个小例子从应用方面来了解Hibernate,开始由表及里的学习,步骤如下:
第0步:创建数据库(MySQL),名称为Hibernate_first;创建Java项目,加入依赖包;具体过程略。
第1步:创建一个User实体类,代码如下:
package com.snail.hibernate; import java.util.Date; public class User { private String id; private String name; private String password; private Date createTime; private Date expireTime; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getExpireTime() { return expireTime; } public void setExpireTime(Date expireTime) { this.expireTime = expireTime; } }
此类不用过多的解释。
第2步:根据User对象创建并配置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> <!--name属性关联实体类--> <class name="com.snail.hibernate.User"> <!--主键 --> <id name="id"> <!-- 自动生成id --> <generator class="uuid"/> </id> <property name="name" column="user_name"/> <property name="password"/> <property name="createTime"/> <property name="expireTime"/> </class> </hibernate-mapping>
此配置文件映射实体类属性和数据库表字段,如果想重命名数据库字段名,可用column属性,如第二个属性name,实体类中它叫name,在数据库表中则叫user_name。
第3步:创建并配置Hibernate.cfg.xml映射文件,把User.hbm.xml文件加入到Hibernate.cfg.xml文件,代码如下:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <mapping resource="com/snail/hibernate/User.hbm.xml"/> </session-factory> </hibernate-configuration>
此配置文件为Hibernate的核心配置文件,首先需要配置数据库(包括数据库驱动、数据库名称密码等),然后把User.hbm.xml文件加入到Hibernate.cfg.xml文件,目的是把实体类真正的关联到Hibernate_first数据库中。
第4步:创建一个工具类ExportDB,导出数据库表,代码如下:
package com.snail.hibernate; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ExportDB { public static void main(String[] args) { //默认读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); SchemaExport export = new SchemaExport(cfg); export.create(true, true); } }
数据库我们已在第0步创建好,编写这个工具类的目的就是为了根据hibernate.cfg.xml文件创建数据库表,编写一次后可以经常用。
第5步:创建Client类,为User对象添加数据,完成数据的持久化,代码如下:
package com.snail.hibernate; import java.util.Date; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class Client { /** * @param args */ public static void main(String[] args) { //读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); //建立SessionFaction SessionFactory factory = cfg.buildSessionFactory(); //取得session Session session = null; try{ session = factory.openSession(); //开启事务 session.beginTransaction(); User user = new User(); user.setName("张三"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //保存User对象 session.save(user); //提交事务 session.getTransaction().commit(); }catch (Exception e) { e.printStackTrace(); //回滚事务 session.getTransaction().rollback(); }finally{ if(session != null){ if(session.isOpen()){ //关闭session session.close(); } } } } }
此类实现了往数据库中填充数据,让数据数据完成了持久化。
从上面的小例子基本上体现出了Hibernate的优缺点,文章开头已经谈了优点,那她的缺点还是不少的,比如使用数据库特性的语句,将很难调优;对大批量数据更新存在问题;系统中存在大量的统计查询功能等,因此在实际开发项目过程中,一般是Hibernate和JDBC结合使用,对一些数据库特性或复杂的查询使用JDBC语句,其他情况一般使用Hibernate。
世间没有完美的东西,当优点大于缺点时我们要学习,或者说要善于看到别人优秀的一面,善于发现世间的美好,不仅提高幸福指数,而且会让我们大幅度进步。