Hibernate学习笔记(初识Hibernate)

该学习hibernate了,在这个例子里主要是学习怎样使用ORM(对象到关系映射)持久化java对象。先介绍一下ORM。

ORM是对象到关系的映射,它是解决实体对象到关系数据库相匹配的技术,其实现思想是将数据库中的数据表映射为对象,然后操作数据就可以以对象形式进行操作。ORM将对象自动持久化到关系数据库中,它对对象到关系数据库进行映射。

Hibernate使用xml文档或是属性文件定义对象到关系的映射,对象到关系的映射包含在java对象到数据表的映射。这个例子说明使用xml文件怎样创建ORM。

我们首先要配置环境,将Hibernate的核心java包导入lib下并将数据库驱动也导入,这里我们使用的是mysql数据库。我们用的是手动进行配置。当然随便下个例子即可了解其配置方法。

Hibernate中主要通过持久化类(*.java)、Hibernate映射文件(*.hbm.xml)以及Hibernate配置文件(*.cfg.xml)与数据库进行交互,其中持久化类是操作对象,用于描述数据表的信息,映射文件指定持久化类与数据表之间的关系,配置文件用于指定Hibernate的属性信息。

现在我们先来创建一个持久化j类,Course.java:

package com.zcl.hibernate.simplehibernate;

import java.io.Serializable;

public class Course implements Serializable{

	private static final long serialVersionUID = 1L;

	private long courseId ;
	private String courseName ;

	public Course() {
	}

	public long getCourseId() {
		return courseId;
	}

	public void setCourseId(long courseId) {
		this.courseId = courseId;
	}

	public String getCourseName() {
		return courseName;
	}

	public void setCourseName(String courseName) {
		this.courseName = courseName;
	}
}

Course就是一个简单的javabean,里面包含了一个无参构造方法和相应的setter和getter方法。并实现了Serializable接口

在Course所在包下我们建立Course.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">
<hibernate-mapping>
	<class name="com.zcl.hibernate.course.Course" table="COURSES">
		<meta attribute="class-description">
			This class contains the course details ;
		</meta>
		<id name="couse" type="long" column="COURSE_ID">
			<generator class="native" />
		</id>
		<property name="courseName" type="string" column="COURSE_NAME" not-null="true" />
	</class>
</hibernate-mapping>

hibernate-mapping元素是根元素,其他的元素嵌入在里面,其常用属性是package属性,用于指定包名。class 用于指定持久化类和数据表的映射。使用name属性指定持久化类的完整类名(包括包名),table属性用于数据表的名称,如果不指定那么将默认使用类名做为表名。meta 元素用于创建一个类的描述。Id元素用于创建一个主键,通过name属性来指定持久化类中的属性,column属性指定数据表中的字段属性。其中id元素的子元素generator用于配置数据表主键的生成策略。property 元素用于配置数据表中字段的属性信息。

现在我们创建一个Hibernate的配置文件,在Hibernate 启动的时候时候会寻找classpath根目录下的的hibernate.cfg.xml文件,所以我们需要在classpath根目录下(即src目录下)建立这样一个文件,它包含数据库的配置信息和用户对Hibernate所设置的属性信息。如自动建表等。

<?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>
		<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
		<property name="hibernate.connection.username">root</property>
		<property name="connection.password">zz</property>   
		<property name="connection.pool_size">1</property>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--Hibernate方言-->
		<property name="show_sql">true</property>      <!--打印sql语句-->
		<property name="hbm2ddl.auto">create</property> <!--自动建表-->
		
		<mapping resource="com/zcl/hibernate/course/Course.hbm.xml"/> <!--映射文件-->
		<!-- annotations -->
		<!--<mapping class="com.zcl.hibernate.course.Course"/> -->
	</session-factory>
</hibernate-configuration>


下面我们创建一个HibernateUtil类管理Session和SessionFactory,SessionFactory是重量级对象,如果每个用到Session就创建一个SessionFactory对象,那么将影响到程序的性能,并且SessionFactory是线程安全的。所以我们实例化SessionFactory放在静态块中进行,使用单列模式实例化它。

package com.zcl.hibernate.util;

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

public class HibernateUtil {
	public static SessionFactory sessionFactory ;
	static{
		try {
			sessionFactory = new Configuration().configure()
					.buildSessionFactory() ;
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	public static SessionFactory getSessionFactory(){
		return sessionFactory ;
	}
	public static Session getSession(){
		Session session = null ;
		if(sessionFactory!=null){
			session = sessionFactory.openSession() ;
		} 
		return session ;
	}
	public static void closeSession(Session session){
		if(session!=null){
			if(session.isOpen()){
				session.close() ;
			}
		}
	}
}

现在我们需要创建一个主函数来运行这个应用。

package com.zcl.hibernate.course;

import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.zcl.hibernate.util.HibernateUtil;

public class Main {
	public static void main(String args[]){
		Main obj = new Main() ;
		Long courseId1 = obj.saveCourse("Physics") ; 
		Long courseId2 = obj.saveCourse("Chemical") ;
		Long courseId3 = obj.saveCourse("Maths") ;
		obj.listCourse() ;
		obj.updateCourse(courseId3, "Mathematic") ;
		obj.deleteCourse(courseId2) ;
		obj.listCourse() ;
		
	}
	public Long saveCourse(String courseName){
		Session session = HibernateUtil.getSession() ; //获取session
		Transaction transaction = null ;
		Long courseId = null ;
		try{
			transaction = session.beginTransaction() ; //开启事务
			Course course = new Course();
			course.setCourseName(courseName) ;
			courseId = (Long)session.save(course) ;
			transaction.commit() ;
		} catch(HibernateException e){
			transaction.rollback() ; //回滚
			e.printStackTrace() ;
		} finally {
			HibernateUtil.closeSession(session) ; //关闭session
		}
		return courseId ;
	}
	
	public void listCourse(){
		Session session = HibernateUtil.getSession() ;
		Transaction transaction = null ;
		try{
			transaction = session.beginTransaction() ;
			List courses = session.createQuery("from Course").list() ;
			for(Iterator iterator = courses.iterator();iterator.hasNext();){
				Course course = (Course)iterator.next() ;
				System.out.println(course.getCourseName()) ;
			}
			transaction.commit() ;
		}catch(HibernateException e){
			transaction.rollback() ;
			e.printStackTrace() ;
		} finally {
			session.close() ;
		}
	}
	
	public void updateCourse(Long courseId,String courseName){
		Session session = HibernateUtil.getSession() ;
		Transaction transaction = null ;
		try{
			transaction = session.beginTransaction() ;
			Course course = (Course)session.get(Course.class,courseId) ;
			course.setCourseName(courseName) ;
			transaction.commit() ;
		} catch(HibernateException e){
			transaction.rollback() ;
			e.printStackTrace() ;
		} finally {
			HibernateUtil.closeSession(session) ;
		}
	}
	
	public void deleteCourse(long courseId){
		Session session = HibernateUtil.getSession() ;
		Transaction transaction = null ;
		try{
			transaction = session.beginTransaction() ;
			Course course = (Course)session.get(Course.class, courseId) ;
			session.delete(course) ;
			transaction.commit() ;
		} catch (HibernateException e){
			transaction.rollback() ;
			e.printStackTrace() ;
		} finally {
			HibernateUtil.closeSession(session) ;
		}
	}
}

在主函数中我们定义了四个不同的方法来完成CRUD操作

运行后控制台显示如下:

Hibernate: insert into COURSES (COURSE_NAME) values (?)
Hibernate: insert into COURSES (COURSE_NAME) values (?)
Hibernate: insert into COURSES (COURSE_NAME) values (?)
Hibernate: select course0_.COURSE_ID as COURSE1_0_, course0_.COURSE_NAME as COURSE2_0_ from COURSES course0_
Physics
Chemical
Maths
Hibernate: select course0_.COURSE_ID as COURSE1_0_0_, course0_.COURSE_NAME as COURSE2_0_0_ from COURSES course0_ where course0_.COURSE_ID=?
Hibernate: update COURSES set COURSE_NAME=? where COURSE_ID=?
Hibernate: select course0_.COURSE_ID as COURSE1_0_0_, course0_.COURSE_NAME as COURSE2_0_0_ from COURSES course0_ where course0_.COURSE_ID=?
Hibernate: delete from COURSES where COURSE_ID=?
Hibernate: select course0_.COURSE_ID as COURSE1_0_, course0_.COURSE_NAME as COURSE2_0_ from COURSES course0_
Physics
Mathematic

查询数据库,正确执行。


(注意:运行程序是必须把数据库服务打开并先建立好数据库,这里是使用hibernate数据库)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值