Hibernate入门
第一步:
挑选jar包
在工程下新建lib文件夹,然后将Hibernate基本包复制进去。可以采用Maven来获取这些包:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.2.7.Final</version> </dependency>
也可以从Hibernate官网(http://hibernate.org/orm/)下载Hibernate的压缩包
解压后,找到lib文件夹,其中required文件夹下的是必须的jar包,也是Hibernate最小运行时的包。复制其中的所有的jar文件到工程lib目录下。然后add path。
如图:
这样,Hibernate就可以工作了。
最后,别忘了将数据库连接jar包也添加到path下面,不然无法连接到数据库。此处使用的是MySQL数据库,所以找到mysql-connector-java-commercial-5.1.25-bin.jar,将其加入到工程path中。
第二步:
建立第一个java class
假如我们需要做一个简单的小程序来保存我们希望参加的活动(events)和这些活动的主办方信息。
package net.fantesy84.domain; import java.util.Date; public class Events { private Long id; private String title; private Date date; public Events() {} public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }
这是一个标准的JavaBean,有一个空构造,所有的成员变量为私有,提供了共有的访问方法(setter & getter)。事实上,Hibernate可以直接访问这些私有的变量,但是使用访问方法更利于重构时程序的健壮性。
为了使用反射机制来实例化这个类,需要一个空构造。此处的空构造可以显示的写出来,也可以不写,因为默认构造器就是一个空构造。
另外,对于一个特定的Events实例,id属性保存其唯一性的标识符(identifier)的值。一般来说,我们不会去操作这个id属性,所以通常来说都会将它的setter方法的访问级别设置为private。当然,视具体情况而定,Hibernate对于setter或者getter的访问级别都是可以忽略的,所以用哪种访问级别取决于你的程序设计。
第三步:
映射文件
Hibernate需要知道怎么加载和保存这些需要持久化的类,所以,我们需要一个将类的成员变量与数据库表中的字段进行对应的关系用一个文件来描述,这个文件就是映射文件。
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="net.fantesy84.domain.Events" table="T_EVENTS"> <id name="id"> <column name="EVENTS_ID"> <!-- 字段说明 --> <comment>活动ID</comment> </column> <!-- 主键生成策略 --> <generator class="native" /> </id> <property name="title" type="java.lang.String"> <!-- 字段名称以及长度 --> <column name="EVENTS_TITLE" length="100"> <comment>活动标题</comment> </column> </property> <property name="date" type="timestamp"> <!-- 字段名称以及长度 --> <column name="EVENTS_DATE"> <comment>活动时间</comment> </column> </property> <property name="address" type="string"> <!-- 字段名称以及长度 --> <column name="EVENTS_ADDRESS" length="255"> <comment>活动地点</comment> </column> </property> </class> </hibernate-mapping>
Events.hbm.xml
Hibernate的DTD文件是不会从网上加载的,它首先在应用程序的classpath下面查找,DTD文件包含在core包中。上述映射文件只是一个非常简单的映射文件,事实上,映射文件是非常复杂的,它与数据库的设计以及你java类的设计息息相关。
映射文件的命名一般要求是:类名.hbm.xml,映射文件一般与Java类放在同一个包下,这是开发者社区的约定。当然,映射文件可以随意命名,位置也可以随意放置。
在映射文件中,<id>元素是标识符属性的声明,name="id"指定了java类中属性的名字,Hibernate会使用其对应的setter和getter方法来访问它。
<column>元素指定了这个java属性对应数据库中哪一个字段名;
<generator>元素指定了主键的生成策略,策略有多种,具体的会在以后讲到。
除了<id>元素外,普通的成员变量可以用<property>元素来进行声明。方式与声明主键类似,要注意的是,声明普通属性的时候,除了指定属性名(name="title")外,还需要指定这个属性的数据类型,这样Hibernate才能知道从java类到数据库表,或者从数据库表到java类之间进行转换时,相应的字段或者属性应该以哪种数据类型进行转换。
type属性指定的数据类型,可以不写,由Hibernate自动检测,例如上述映射文件中的date属性和address属性,我们没有明确的指定它们的java类型,而是使用了Hibernate提供的类型转换器。这样,Hibernate就可以为我们进行自动转换。
添加了jar包,有了java类和映射文件,我们就已经做完了Hibernate的准备工作,接下来就是Hibernate的配置工作了。
第四步:
Hibernate配置文件(hibernate.cfg.xml)
Hibernate为了保存配置,可以使用一个简单的Properties文件进行信息保存,也可以使用XML的方式。多数开发者喜欢使用XML。一般都会将Hibernate的配置文件命名为hibernate.cfg.xml并放置在classpath下。当然,你也可以随意命名和随意放置。
一个简单的hibernate.cfg.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!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.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 指定数据库连接驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 指定数据库连接URL --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <!-- 显示SQL语句 --> <property name="hibernate.show_sql">true</property> <!-- 指定数据库用户名和密码 --> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">**</property> <!-- 添加映射文件 --> <mapping resource="net/fantesy84/domain/Events.hbm.xml"/> </session-factory> </hibernate-configuration>
hibernate.cfg.xml
配置文件中,指定了一个session-factory,它关联一个特定的数据库全局工厂,如果你要配置多个数据库,则需要配置多个session-factory。
将第三步中写好的映射文件添加到配置文件中,XML的写法和注解的写法稍有不同,建议初学者使用XML。
有了上述文件,我们就可以使用Hibernate对Events类进行持久化操作了。在这之前,还需要一些基础代码,例如一个辅助类HibernateUtils
package net.fantesy84.util; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory sessionFactory = null; private static Session session = null; private static HibernateUtils h; private static final ThreadLocal<Session> s = new ThreadLocal<Session>(); private HibernateUtils() { try { sessionFactory = new Configuration().configure() .buildSessionFactory( new StandardServiceRegistryBuilder().build()); } catch (HibernateException e) { e.printStackTrace(); } } /** * 饥汗单例对象获取方法 * * @return HibernateUtils insatance */ public static HibernateUtils getInstance() { if (h == null) { return new HibernateUtils(); } else { return h; } } /** * 获取Session方法 * * @return session对象 */ public Session getSession() { session = s.get(); if (session == null) { session = sessionFactory.openSession(); s.set(session); } return session; } /** * 获取CurrentSession方法 * * @return session对象 */ public Session getCurrentSession() { session = s.get(); if (session == null) { session = sessionFactory.getCurrentSession(); s.set(session); } return session; } /** * 关闭Session */ public void close(){ session.close(); } }
HibernateUtils
至此,Hibernate已经可以正常工作了。这里使用了Hibernate 4.3.5.Final,可进行自动建表,也可在配置文件(hibernate.cfg.xml)中显式的配置
<property name="hibernate.hbm2ddl.auto">true</property>来进行建表操作。
下一篇,阐述简单的Hibernate对Java类的持久化操作。
Hibernate入门篇——第一个Hibernate应用