首页 > WEB开发 > 后台开发 > Hibernate入门
2014
10-18

Hibernate入门

06. Hibernate入门12

一、ORM简介

ORM(Object/Relation Mapping),对象-关系映射。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。ORM系统主要实现对象到关系数据的映射

Hibernate是一个ORM框架,其最大的特性就是将关系数据描述成对象(映射),因此在编写DAO操作时可以做到真正的面向对象编程

1、关系模型到对象模型之间的映射有:

  • 表 —- 类
  • 记录(行) —- 对象
  • 表的字段(列) —- 类的属性

2、Hibernate的优缺点总结如下:

优点:

  • 面向对象编程
  • 平台移植性好
  • 提供缓存功能(一级缓存、二级缓存、查询缓存)
  • 代码简单

缺点(哪些场合不适用)

  • 如果项目对sql的优化要求特别高,不适合用hibernate
  • 如果数据库的数据量特别大,也不适合用hibernate
  • 如果表与表之间的关系比较复杂,也不能用hibernate来做

因此,Hibernate常用于中小企业,这些企业的数据量不是很大、表之间的关系不是很复杂。

二、HelloWorld

1、Hibernate编码步骤

新建一个Java Project,名称为hibernate_01_helloworld,通过对一个单表的CRUD操作说明Hibernate的编码步骤。

1)搭建开发环境

① 拷贝jar包:主要是Hibernate相关jar包(见下图)和JDBC驱动包。

06. Hibernate入门626

② 编写Hibernate配置文件:hibernate.cfg.xml

hibernate.cfg.xml是hibernate默认的配置文件名,开发时将其置于src目录下即可(编译时会自动加入到Classpath目录下)。配置文件内容直接从documentation/manual下面的教程中拷贝,稍作修改即可,如下:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
		<property name="connection.username">root</property>
		<property name="connection.password"></property>

		<!-- SQL dialect -->
		<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

		<!-- Echo all executed SQL to stdout -->
		<property name="show_sql">true</property>

		<!-- Drop and re-create the database schema on startup -->
		<property name="hbm2ddl.auto">update</property>

		<mapping resource="" />
	</session-factory>
</hibernate-configuration>

在配置文件中主要配置property元素和mapping元素,property元素除了可以指定连接数据库的驱动、URL、用户名密码外,还可以指定:

  • dialect:指定数据库方言。用于实现不同数据库平台之间移植。
  • show_sql:是否在控制台打印hibernate发出的sql语句,类似于开发模式开关。
  • hbm2ddl.auto:该选项指定自动生成数据表的策略,如果移除该配置选项就不自动生成数据表。一般使用update即可。

2)创建持久化类和映射文件

06. Hibernate入门1912

① Person类

public class Person implements Serializable{
	private Integer id;
	private String name;
	private String sex;
	//setter、getter
}

② 创建Person类的映射文件:Person.hbm.xml

<?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 package="org.flyne.domain">
	<class name="Person" table="persons">
		<id name="id" column="id">
			<generator class="increment"></generator>
		</id>

		<property name="name"></property>
		<property name="sex"></property>
	</class>
</hibernate-mapping>

通过class元素配置类到表的映射(Person–>persons),通过id、property元素配置类属性到表字段的映射。几点说明:

  • 通过id元素映射的字段为表的主键。generator元素指定数据表中主键生成策略。
  • 如果没有指定table、column等属性,则通过Hibernate自动生成的表名、字段名会和属性名保持一致。

③ 将映射文件加入到Hibernate配置文件中:即在hibernate.cfg.xml中加入:

<mapping resource="org/flyne/domain/Person.hbm.xml" />

3)编写CRUD测试类(JUnit)

public class CRUDTest {
	private static Session session;

	@BeforeClass
	public static void init(){
		//加载Hibernate默认配置文件:hibernate.cfg.xml
		Configuration configuration = new Configuration().configure();
		//产生SessionFactory对象
		SessionFactory factory = configuration.buildSessionFactory();
		//获得Session对象
		session = factory.openSession();
	}

	@AfterClass
	public static void afterClass(){
		//关闭session
		session.close();
	}

	//增(save):向表中添加一条记录
	@Test
	public void testAdd(){
		Person person = new Person();
		person.setName("flyne");
		person.setSex("male");

		session.beginTransaction();
		session.save(person);
		session.getTransaction().commit();
	}

	//改:修改之前必须先从数据库中查找到该记录,在对象中进行修改
	@Test
	public void testUpdate(){
		Person person = (Person) session.get(Person.class, 1);
		person.setName("周董");
		session.beginTransaction();
		session.update(person);
		session.getTransaction().commit();
	}

	//查询所有
	@Test
	public void testGetAll(){
		List<Person> persons = session.createQuery("from Person").list();
		for(Person person:persons){
			System.out.println(person.getName());
		}
	}

	//删除:删除之前也必须先获得该对象
	@Test
	public void testDelete(){
		Person person = (Person) session.get(Person.class, 1);

		session.beginTransaction();
		session.delete(person);
		session.getTransaction().commit();
	}
}

关于本例中的几点说明:

  • ORM框架面向对象在本例中的体现:可以发现使用hibernate后,只要拿到session后就可以直接对对象进行操作(会映射到数据表中)。为了更好的体现这一特性,CRUDTest将session的获取抽取到init方法中了。
  • 使用openSession获得的session对象在增删改时必须要开启事务。
  • SessionFactory类:单例;SessionFactory的实现必须是线程安全的(一个应用中多个线程可以同时使用一个sessionFactory);Hibernate配置文件、映射文件等元数据信息都保存在sessionFactory的内部状态中。
  • Session对象完成数据库的连接、增删改查、开启事务操作。

注:下图被Logo遮住的字为:DB

06. Hibernate入门4470

2、Annotation版本的HelloWorld(☆)

说明:注解是Hibernate3.0引入的新特性。

在hibernate3.6final以前,在hibernate中使用注解,还需要下载Annotation库。Hibernate的core类库与Annotation类库默认是分开的,当我们要是使用Annotation时,还需添加hibernate-annotations.jar……到classpath中。

在hibernate3.6final中只需引入hibernate-jpa-2.0-api.jar,在Hibernate3.6的目录下可以找到该jar包,位于lib/jpa下。

如果每写一个持久化类都要建立一个对应的映射文件会显得很麻烦,此时可以考虑注解。在持久化类引入注解后就可以不用写映射文件了,而且程序部分不需作任何修改。推荐注解方式进行映射。

直接在上面的基础上进行修改,引入注解后的Person类如下:

@Entity
@Table(name="persons")
public class Person implements Serializable{
	private Integer id;
	private String name;
	private String sex;

	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	public String getSex() {
		return sex;
	}
	//setter方法
}

在配置文件中引入持久化类:

<mapping class="org.flyne.domain.Person" />

一切Ok,程序中的功能不用做任何修改。

说明:

属性的注解一般加在getter方法上(最佳实践),因为字段(Attribute)为private类型,且不一定和属性(property)一致。

普通字段默认为@Basic注解,主键字段需要自己加@Id注解。

类名和表名、字段名和属性名不同时分别使用@Table(name=”")、@Column(name=”")指定。对于有些不想映射到表中的属性,在其getter方法上加@Transient注解。不多说。


留下一个回复

你的email不会被公开。