Hibernate的学习一__简单的小例子

        Hibernate是一个ORM框架,主要的作用就是将数据持久化.

       做一个小例子,演示Hibernate如何进行ORM,对象关系映射和数据持久化.

        主要的步骤介绍下,建立实体类User,然后给User建立Hibernate的映射文件,然后在核心配置文件中添加该配置文件,接着新建数据库,创建表,然后写测试代码saveload(get),保存和查询.

        建立实体类很简单,就是建一个普通的类,不需要继承任何类和接口,因为Hibernate没有侵入性.User类有5个属性,id,namepassword,还有createTimeexpireTime,名字,密码,创建日期和失效日期.然后就生成getset方法即可.

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,常用的是nativeuuid.

<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))

      表也建立完了,可以去试试将数据保存到数据库中了.利用sessionsave将赋好值的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是延迟加载,只有用的时候才会去查的.而默认就是lazytrue,支持延迟加载.

        以上就是一个Hiberante的简单小例子,建立的实体类是个Pojo对象,因为没有继承任何类,只是一个简单的java对象.所以移植性会很好.而Hiberante主要的功能是将OR映射,使我们更加彻底的面向对象,可以看到代码中并没有写任何一句的select,insert语句,就可以将数据进行查询和保存.我们只是写了一个类,然后对这个类的对象继续操作,save的是对象,load的也是对象.而唯一要做的就是写个映射文件,让hibernate知道是如何映射对应表的.

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值