该学习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
查询数据库,正确执行。