创建一个Java工程,导入架包如图:
Hibernate体系结构图:
User.java:
package com.pojo; public class User implements java.io.Serializable { private Integer id; private String name; private Integer age; public Integer getId() { return this.id; } private void setId(Integer id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Integer getAge() { return this.age; } public void setAge(Integer age) { this.age = age; } }
解析:
你可以看到这个类对属性的存取方法(getter and setter method)使用了标准 JavaBean 命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。Hibernate 也可以直接访问这些 field,而使用访问方法(accessor method)的好处是提供了重构时的健壮性(robustness)。
对一特定的 user, id
属性持有唯一的标识符(identifier)的值。如果我们希望使用 Hibernate 提供的所有特性,那么所有的持久化实体(persistent entity)类(这里也包括一些次要依赖类)都需要一个这样的标识符属性。而事实上,大多数应用程序(特别是 web 应用程序)都需要通过标识符来区别对象,所以你应该考虑使用标识符属性而不是把它当作一种限制。然而,我们通常不会操作对象的标识(identity),因此它的 setter 方法的访问级别应该声明 private。这样当对象被保存的时候,只有 Hibernate 可以为它分配标识符值。你可看到Hibernate可以直接访问 public,private 和 protected 的访问方法和 field。所以选择哪种方式完全取决于你,你可以使你的选择与你的应用程序设计相吻合。
所有的持久化类(persistent classes)都要求有无参的构造器,因为 Hibernate 必须使用 Java 反射机制来为你创建对象。构造器(constructor)的访问级别可以是 private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是 package 级别的访问控制,这样在没有字节码指令(bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率。
数据库“pla”下建表"user":
解析:此表表名与User类同名,首写字母大小写随意。
User.hbm.xml:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <!--指定类和对象的表--> <class name="com.pojo.User" table="user" > <!--指定主键--> <id name="id" type="java.lang.Integer"> <!--对应的表字段--> <column name="id" /> <!--定义主键生成方式Hibernate自行决定--> <generator class="native" /> </id> <!--定义name字段--> <property name="name" type="java.lang.String"> <column name="name" length="20" /> </property> <!--定义age字段--> <property name="age" type="java.lang.Integer"> <column name="age" /> </property> </class> </hibernate-mapping>
解析:
这是映射文件。Hibernate 需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是 Hibernate 映射文件发挥作用的地方。映射文件告诉 Hibernate 它应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。
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"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="connection.url"> jdbc:mysql://localhost:3306/pla </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="myeclipse.connection.profile">MySQL5</property> <mapping resource="com/pojo/user.hbm.xml" /> </session-factory> </hibernate-configuration>
解析:
有了持久化类和它的映射文件,现在是配置 Hibernate的时候了。在这里,我们配置了 Hibernate 的SessionFactory
— 一个关联于特定数据库全局的工厂(factory);注意"session-factory"这个取名,也正是配置了sessionfactory才可以在下面用config.buildSessionFactory()去调出SessionFactory。如果你要使用多个数据库,就要用多个的<session-factory>
,通常把它们放在多个配置文件中(为了更容易启动)。Hibernate 将为你的应用程序连接到数据库。注意最后的<mapping>标签,它的生成方法如下图:
TestHibernate1.java:
package com.test; import org.hibernate.*; import org.hibernate.cfg.Configuration; import com.pojo.User; import junit.framework.TestCase; public class TestHibernate1 extends TestCase { public void test1(){ Transaction tr=null; // 1 建立持久化对象(实体类对象) User user = new User(); user.setName("测试"); user.setAge(new Integer(30)); //2 创建一个Configuration对象,默认去加载 src 下 hibernate.cfg.xml文件 Configuration config=new Configuration().configure(); //3 得到一个SessionFactory对象(从工厂中造session) try { SessionFactory factory=config.buildSessionFactory(); //4 得到一个session对象 Session session=factory.openSession(); //5 hibernate默认事务自动提交是关闭的 tr=session.beginTransaction(); //6 保存数据到数据库 session.save(user); //7 提交事务,否则数据库中不会增加记录。只有提交事务,数据才会提交 tr.commit(); } catch (HibernateException e) { e.printStackTrace(); tr.rollback();//遇异常用回滚事务 } } }
解析:
以上是一个,用于方便测试,按照以上源码中注释的7个步骤进行代码编写。
最后的运行结果:
,数据库pla的表user中多了一条记录。
注意:在使用MyEclipse作为开发工具时,运行Hibernate应用都会显示一些警告,提示没有配置Log4j,这是因为项目的lib中有Log4j类库,但是开发都没有配置Log4j的属性文件,可从Hibernate的安装包的project\etc目录下找到log4j.properties配置文件,复制到项目的src路径中即可。这时可以在日志中看到JDBC执行的SQL语句和相关运行过程,如:14:53:18,913 DEBUG SQL:346 - insert into user (name, age) values (?, ?)。