Hibernate是一个ORM框架,主要的作用就是将数据持久化.
做一个小例子,演示Hibernate如何进行ORM,对象关系映射和数据持久化.
主要的步骤介绍下,建立实体类User,然后给User建立Hibernate的映射文件,然后在核心配置文件中添加该配置文件,接着新建数据库,创建表,然后写测试代码save和load(get),保存和查询.
建立实体类很简单,就是建一个普通的类,不需要继承任何类和接口,因为Hibernate没有侵入性.User类有5个属性,id,name和password,还有createTime和expireTime,名字,密码,创建日期和失效日期.然后就生成get和set方法即可.
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;
}
}
创建hbm.xml配置文件才是重头戏.新建User.hbm.xml映射文件.标签主要是在<hibernate-mapping>中编写,然后有<class>标签还配置类和表的映射,其中包含主键和普通属性,<id>配置主键,<property>配置普通的属性.对于主键还有生成策略,N种,常用的是native和uuid.
<hibernate-mapping>
<class name="com.lyl.hibernate.User">
<id name="id">
<generator class="uuid"></generator>
</id>
<property name="name"></property>
<property name="password"></property>
<property name="createTime"></property>
<property name="expireTime"></property>
</class>
</hibernate-mapping>
User的配置文件就这样配置好了.然后放进核心hibernate.cfg.xml文件中.需要配置在<hibernate-configuration>标签中,在<session-factory>标签中,配置连接的数据库,包括驱动,路径,用户名和密码,最后就是mapping,将之前配置好的User.hbm.xml添加到<mapping>标签中.还有就是dialect方言,为MySQL,所以生成的SQL语句都是MySQL的.以及为了查看方便将show_sql改为true,这样就可以看到hibernate生成的sql语句.
<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_session</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">lyl</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/lyl/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
然后就是在MySQL中建立库hibernate_session,create databasehibernate_session;就可以建立库了,然后usehibernate_session;就可以转到该库.之后就是创建表,根据配置好的User.hbm.xml,读取标签,然后生成表.
建立ExportDB.java工具类用它来生成表.
public class ExportDB {
public static void main(String[] args)
{
//需要解析xml文件
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true,true);
}
}
new Configuration().configure()获取hibernate.cfg.xml文件,然后将获取到的配置文件给位于org.hibernate.tool.hbm2ddl.SchemaExport;路径下的方案导入,用它的create(true,true)创建表.
然后执行,表就可以建立了.建表的SQL语句就是这样的,创建表User,id,name,password,creatTime,expireTime,主键是id.
drop table if existsUser
create table User(id varchar(255) not null, name varchar(255), password varchar(255), createTimedatetime, expireTime datetime, primary key (id))
表也建立完了,可以去试试将数据保存到数据库中了.利用session的save将赋好值的User对象存入数据库中.建立单元测试类SessionTest,继承TestCase来存储.
新建User对象,然后给Name,Password,赋值,然后保存,提交,hiberante发出一条sql语句(Hibernate: insert into User (name, password, createTime, expireTime,id) values (?, ?, ?, ?, ?))就可以在数据库中插入一条记录,并查询出来了.
public void testSave1()
{
Session session = null;
try
{
session = HibernateUtils.getSession();
session.beginTransaction();
User user = new User();
user.setName("流逝");
user.setPassword("123");
session.save(user);
session.getTransaction().commit();
}catch(Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();
}finally
{
HibernateUtils.closeSession(session);
}
}
为了复用,将session的获取,close写在了HibernateUtils的工具类中.对于获取,因为session是从sessionFactory中获取的,而hibernate.cfg.xml的配置文件就配置了session-factory,所以读取hibernate.cfg.xml的配置文件,获取sessionFactory,然后factory打开session,就可以了.而关闭,只要传入的session是否不为null,并且isOpen,就可以关了.
//Hibernate的工具类
public class HibernateUtils {
private static SessionFactory factory;
static
{
try
{
//创建Configuration对象,读取hiberante.cfg.xml文件
Configuration cfg = new Configuration().configure();
//利用cfg,获取SessionFactory
factory = cfg.buildSessionFactory();
}catch(Exception e)
{
e.printStackTrace();
}
}
public static Session getSession()
{
return factory.openSession();
}
public static void closeSession(Session session)
{
if(session != null)
{
if(session.isOpen())
{
session.close();
}
}
}
}
Load的代码就是
public void testLoad1()
{
Session session = null;
try
{
session = HibernateUtils.getSession();
session.beginTransaction();
User user=(User)session.get(User.class, "8a82a71b482b29a301482b29a43d0001");
System.out.println("user.Name = "+user.getName()+" user.password = "+user.getPassword());
session.getTransaction().commit();
}catch(Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();
}finally
{
HibernateUtils.closeSession(session);
}
}
运行效果
Hibernate: selectuser0_.id as id0_0_, user0_.name as name0_0_, user0_.password as password0_0_,user0_.createTime as createTime0_0_, user0_.expireTime as expireTime0_0_ fromUser user0_ where user0_.id=?
user.Name = 流逝 user.password = 123
根据id查询User表中记录,得出结果.将load改为get此段代码的运行效果一样.只是load是支持延迟加载的,若是User中存在集合类型的数据,那么load是不会加载出来的,而get则会.因为load是延迟加载,只有用的时候才会去查的.而默认就是lazy为true,支持延迟加载.
以上就是一个Hiberante的简单小例子,建立的实体类是个Pojo对象,因为没有继承任何类,只是一个简单的java对象.所以移植性会很好.而Hiberante主要的功能是将OR映射,使我们更加彻底的面向对象,可以看到代码中并没有写任何一句的select,insert语句,就可以将数据进行查询和保存.我们只是写了一个类,然后对这个类的对象继续操作,save的是对象,load的也是对象.而唯一要做的就是写个映射文件,让hibernate知道是如何映射对应表的.