Hibernate学习笔记(初识Hibernate)

来源:互联网 发布:阿三搞笑知乎 编辑:程序博客网 时间:2024/04/28 18:39

该学习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() ; //获取sessionTransaction 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_PhysicsChemicalMathsHibernate: 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_PhysicsMathematic

查询数据库,正确执行。


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




原创粉丝点击