Hibernate开发步骤

配置完Hibernate使用环境之后就可以使用其做开发了:

首先建对象模型,即创建实体类:以User.java为例:

 

import java.util.Date;

public class User {

 private String id;
 private String name;
 private String password;
 private Date cresteTime;
 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 getCresteTime() {
  return cresteTime;
 }
 public void setCresteTime(Date cresteTime) {
  this.cresteTime = cresteTime;
 }
 public Date getExpireTime() {
  return expireTime;
 }
 public void setExpireTime(Date expireTime) {
  this.expireTime = expireTime;
 }
}

 

 

 

实体类就是一个对象模型,要把这个实体类的对象存入数据库,还需要建立映射文件(User.hbm.xml).映射文件通常和实体类放在一起,它描述的是实体类中的属性和类的关系:


hibernate基本映射

实体类--(对应于)--表

实体类中的普通属性--对应于--表字段

采用<class>标签映射成数据库表,通过<property>标签将普通属性映射成表字段

所谓普通属性指不包括自定义类、集合和数组等

注意:如果实体类和实体类中的属性和sql中的关键字重复,必须采用table(改表名)或column(改表中属性名)重新命名

实体类的设计原则:

* 实现一个默认的(即无参数的)构造方法(constructor)

* 提供一个标识属性(identifier property)(可选)

* 使用非final的类 (可选)

* 为持久化字段声明访问器(accessors)




<?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>
 <class name="com.mine.hibernate.User">//用table属性给表重新命名,默认的表名和实体类的名字相同,class标签表示映射的类。name就是指实体类的完                                                                   //整路径
  <id name="id">//主键的映射(这个是要映射类中的主键的标示),这个也是可以重新命名的,使用column标签来重命名,例如column="user_id",默认名字和                            //属性名一致,id必须在第一个设置,id用于设置单一主键,要设置复合主键,使用<composite-id>。其中的name是实体类中的名字。

          //具体可以参考视频10中讲解或者看给的hibernate开发文档
   <generator class="uuid"/>//定义主键的生成策略
  </id>


  <property name="name"/>
  <property name="password"/>
  <property name="createTime"/>
  <property name="expireTime"/>


 </class>
</hibernate-mapping>

 

映射文件的配置详解:

 

配置文件中映射元素详解

对象关系的映射是用一个XML文档来说明的。映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等。下面从一个映射的例子开始讲解映射元素,映射文件的代码如下。


        

<?xml version="1.0"?>

<!--

所有的XML映射文件都需要定义如下所示的DOCTYPE。

Hibernate会先在它的类路径(classptah)中搜索DTD文件。

-->

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

hibernate-mapping有几个可选的属性:

schema属性指明了这个映射的表所在的schema名称。

default-cascade属性指定了默认的级联风格 可取值有 none、save、update。

auto-import属性默认让我们在查询语言中可以使用非全限定名的类名 可取值有 true、false。

package属性指定一个包前缀。

-->

<hibernate-mapping schema="schemaName" default-cascade="none"

auto-import="true" package="test">

<!--用class元素来定义一个持久化类 -->

<class name="People" table="person">

<!-- id元素定义了属性到数据库表主键字段的映射。-->

<id name="id">

<!-- 用来为该持久化类的实例生成唯一的标识 -->

<generator class="native"/>

</id>

<!-- discriminator识别器 是一种定义继承关系的映射方法-->

<discriminator column="subclass" type="character"/>

<!-- property元素为类声明了一个持久化的,JavaBean风格的属性-->

<property name="name" type="string">

<column name="name" length="64" not-null="true" />

</property>

<property name="sex"

not-null="true"

update="false"/>

<!--多对一映射关系-->

<many-to-one name="friend"

column="friend_id"

update="false"/>

<!--设置关联关系-->

<set name="friends" inverse="true" order-by="id">

<key column="friend_id"/>

<!—一对多映射-->

<one-to-many class="Cat"/>

</set>

</class>

</hibernate-mapping>

组件应用的方法

组件有两种类型,即组件(component)和动态组件(dynamic-component)。在配置文件中,component元素为子对象的元素与父类对应表的字段建立起映射关系。然后组件可以声明它们自己的属性、组件或者集合。component元素的定义如下所示:


        

<component name="propertyName" class="className" insert="true|false"

upate="true|false" access="field|property|ClassName">

<property ...../>

<many-to-one .... />

........

</component>

在这段代码中,name是指属性名,class是类的名字,insert指的是被映射的字段是否出现在SQL的INSERT语句中,upate指出被映射的字段是否出现在SQL的UPDATE语句中,access指出访问属性的策略。

Hiebernate的基本配置

Hibernate的数据库连接信息是从配置文件中加载的。Hibernate的配置文件有两种形式:一种是XML格式的文件,一种是properties属性文件。properties形式的配置文件默认文件名是hibernate.properties,一个properties形式的配置文件内容如下所示:


        

#指定数据库使用的驱动类

hibernate.connection.driver_class = com.mysql.jdbc.Driver r

#指定数据库连接串

hibernate.connection.url = jdbc:mysql://localhost:3306/db

#指定数据库连接的用户名

hibernate.connection.username = user

#指定数据库连接的密码

hibernate.connection.password = password

#指定数据库使用的方言

hibernate.dialect = net.sf.hibernate.dialect.MySQLDialect

#指定是否打印SQL语句

hibernate.show_sql=true

在配置文件中包含了一系列属性的配置,Hibernate将根据这些属性来连接数据库。

在XML格式的配置文件中,除了基本的Hibernate配置信息,还可以指定具体的持久化类的映射文件,这可以避免将持久化类的配置文件硬编码在程序中。XML格式的配置文件的默认文件名为hibernate.cfg.xml,一个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>

<!--显示执行的SQL语句-->

<property name="show_sql">true</property>

<!--连接字符串-->

<property name="connection.url">jdbc:mysql://localhost:3306/STU</property>

<!--连接数据库的用户名-->

<property name="connection.username">root</property>

<!--数据库用户密码-->

<property name="connection.password">root</property>

<!--数据库驱动-->

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<!--选择使用的方言-->

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!--映射文件 -->

<mapping resource="com/stuman/domain/Admin.hbm.xml" />

<!--映射文件-->

<mapping resource="com/stuman/domain/Student.hbm.xml" />

</session-factory>

</hibernate-configuration>

properties形式的配置文件和XML格式的配置文件可以同时使用。当同时使用两种类型的配置文件时,XML配置文件中的设置会覆盖properties配置文件的相同的属性。

 

 

 

对象标识符号

在关系数据库表中,主键(Primary Key)用来识别记录,并保证每条记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两个变量引用的对象值是否相同来判断两对象是否相等。Hibernate为了解决两者之间的不同,使用对象标识符(OID)来标识对象的唯一性。OID是关系数据库中主键在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。如下代码所示,三次调用了Session的load()方法,分别加载OID为1或3的User对象。


        

Transaction tx = session.beginTransaction();

User user1 = (User)session.load(User.class,new Long(1));

User user2 = (User)session.load(User.class,new Long(1));

User user3 = (User)session.load(User.class,new Long(3));

System.out.println( user1 == user2 );

System.out.println( user1 == user3 );

应用程序在执行上述代码时,第一次加载OID为1的User对象,从数据库中查找ID为1的记录,然后创建相应的User实例,并把它保存在Session缓存中,最后将该实例的引用赋值给变量user1。第二次加载OID为1的对象时,直接把Session缓存中OID为1的实例的引用赋值给变量user2。因此,表达式user1==user2的结果为true。

标识的生成可以使用不同的策略,表1为Hibernate内置的标识生成策略。

表1:Hibernate标识生成策略

标识符生成器 描述
increment 适用于代理主键。由Hibernate自动以递增方式生成。
identity 适用于代理主键。由底层数据库生成标识符。
sequence 适用于代理主键。Hibernate根据底层数据库的序列生成标识符,这要求底层数据库支持序列。
hilo 适用于代理主键。Hibernate分局high/low算法生成标识符。
seqhilo 适用于代理主键。使用一个高/低位算法来高效的生成long,short或者int类型的标识符。
native 适用于代理主键。根据底层数据库对自动生成标识符的方式,自动选择identity、sequence或hilo。
uuid.hex 适用于代理主键。Hibernate采用128位的UUID算法生成标识符。
uuid.string 适用于代理主键。UUID被编码成一个16字符长的字符串。
assigned 适用于自然主键。由Java应用程序负责生成标识符。
foreign 适用于代理主键。使用另外一个相关联的对象的标识符。

Hibernate映射类型

在对象/关系映射文件中,Hibernate采用映射类型作为Java类型和SQL类型的桥梁。Hibernate映射类型分为2种:内置映射类型和自定义映射类型。

1、内置映射类型

Hibernate对所有的Java原生类型、常用的Java类型如String、Date等都定义了内置的映射类型。表2列出了Hibernate映射类型、对应的Java类型以及对应的标准SQL类型。

表2:Hibernate内置映射类型

Hibernate映射类型 Java类型 标准SQL类型 大小
integer/int java.lang.Integer/int INTEGER 4字节
long java.lang.Long/long BIGINT 8字节
short java.lang.Short/short SMALLINT 2字节
byte java.lang.Byte/byte TINYINT 1字节
float java.lang.Float/float FLOAT 4字节
double java.lang.Double/double DOUBLE 8字节
big_decimal java.math.BigDecimal NUMERIC  
character java.lang.Character/java.lang.String/char CHAR(1) 定长字符
string java.lang.String VARCHAR 变长字符
boolean/ yes_no/true_false java.lang.Boolean/Boolean BIT 布尔类型
date java.util.Date/java.sql.Date DATE 日期
timestamp java.util.Date/java.util.Timestamp TIMESTAMP 日期
calendar java.util.Calendar TIMESTAMP 日期
calendar_date java.util.Calendar DATE 日期
binary byte[] BLOB

BLOB
text java.lang.String TEXT CLOB
serializable 实现java.io.Serializablej接口的任意Java类 BLOB BLOB
clob java.sql.Clob CLOB CLOB
blob java.sql.Blob BLOB BLOB
class java.lang.Class VARCHAR 定长字符
locale java.util.Locale VARCHAR 定长字符
timezone java.util.TimeZone VARCHAR 定长字符
currency java.util.Currency VARCHAR 定长字符

2、自定义映射类型

Hibernate提供了自定义映射类型接口,允许用户以编程的方式创建自定义的映射类型。用户自定义的映射类型需要实现net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType接口。具体的创建自定义映射类型的方法请参考hibernate官方文档或相关资料,这里不再详细介绍


 

 

映射文件配置完成之后,还需要加入到hibernate.cfg.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.url">jdbc:mysql://localhost/hibernate_first</property>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password">mine</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="hibernate.show_sql">true</property>
  
  <mapping resource="com/mine/hibernate/User.hbm.xml"/>//映射文件的加入,resource就是映射文件的完整路径。这个标签要放到property标签的后面,要用“/”隔开
 </session-factory>
</hibernate-configuration>

映射文件加入到hibernate.cfg.xml文件中之后,hibernate就会把这个文件加载进去,通过这个映射文件,hibernate就会分析出应该把这个实体类映射成什么样的表,类中的属性映射成什么字段,就会生成相应的表。表中的数据的类型,有相应的机制来定。




接着编写hbm2ddl工具类,将实体类生成数据库表:

要想生成表,还需要写一个工具类,专门用于把对象模型生成关系模型。这个类就是把我们的hbm hibernate映射文件转换成ddl,这个类是重用的,以后可以直接使用。注意:生成数据库表之前需要先把数据库先建立起来。然后运行这个工具类,就可以在数据库中建立表。

 

package com.liu.hibernate;

/**
 * 工具类,用于导出表到数据库中,这个类就是把hbm,hibernate的映射文件转换成ddl
 */
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class exportDB {

 public static void main(String[] args) {


  Configuration cfg=new Configuration().configure();//Configuration用于读取Hibernate配置文件hibernate.cfg.xml,
  //Configuration默认的是读取.properties类型的配置文件,所以需要调用他的configure()方法来读取.xml类型的配置文件
  
  SchemaExport se=new SchemaExport(cfg);//SchemaExport是hibernate中的一个工具类,他就能把我们的对象类导成表,他需要传入
  //Configuration类型的参数.这样就生成了一张表
  se.create(true, true);//第一个参数决定生不生成表
   
 }
}

 执行这个代码就可以把实体类生成数据库表。生成数据库表之前需要手动生成数据库。

 

上一步已经把表建立了,下面就是写客户端,往数据库表中添加数据。

 

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Client {

 public static void main(String[] args) {
  
  //读取hibernate.cfg.xml文件。客户端要想往数据库中存数据,需要这个对象来读配置
  Configuration cfg = new Configuration().configure();
  
  //创建SessionFactory。一个数据库要对应一个SessionFactory,所以要创建一个SessionFactory,要是多个数据库需要创建多个。
  SessionFactory factory = cfg.buildSessionFactory();
  
  Session session = null;//session就相当于我们的connection,这个session和http中的那个不同。session用过之后也是需要关的
  try {
   session = factory.openSession();//这个session由工厂去创建一个
   
   //开启事务,hibernate默认是手动的,所以需要手动开启和提交事务
   session.beginTransaction();
   
   User user = new User();
   user.setName("张三");
   user.setPassword("123");
   user.setCreateTime(new Date());
   user.setExpireTime(new Date());
   
   //保存数据
   session.save(user);//可以我们操作数据库是通过对象进行的,而不是关系型语句
   
   //提交事务
   session.getTransaction().commit();
  }catch(Exception e) {
   e.printStackTrace();
   //回滚事务,出现问题时这样做
   session.getTransaction().rollback();
  }finally {
   if (session != null) {
    if (session.isOpen()) {
     //关闭session
     session.close();
    }
   }
  }
  
 }
}

 

为了方便跟踪sql执行,在hibernate.cfg.xml文件中加入<property name="hibernate.show_sql">true</property>

就可以在输出视图里看到相应的sql语句

 

你可能感兴趣的:(Hibernate)