【框架】[Hibernate]构架知识点详解入门与测试实例

转载请注明出处:http://blog.csdn.net/qq_26525215

Hibernate介绍:Hibernate是一个开放源码的、非常优秀、成熟的O/R Mapping框架。它提供了强大、高性能的Java对象和关系数据的持久化和查询功能。

O/R Mapping

对象关系映射(Object Relational Mapping,简称ORM)技术,是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。

对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

Hibernate 只是一个将持久化类与数据库表相映射的工具,每个持久化类实例均对应于数据库表中的一条数据行。可以使用面向对象的方法操作此持久化类实例,完成对数据库表的插入、删除、修改等操作。

利用Hibernate操作数据库,我们通过应用程序经过Hibernate持久层来访问数据库,其实Hibernate完成了以前JDBC的功能,不过Hibernate使用面向对象的方法操作数据库。

Hibernate体系结构图:Hibernate构架入门步骤第1步: 先建一个Java工程导入使用Hibernate最小必要包。

一般在解压后的lib目录下的

required目录下。

可以到官方网站 http://hibernate.org/orm/downloads/ 下载Hibernate最新的zip压缩包。

如果访问数据库,则还需要导入数据库的驱动包。

mysql-connector-java-5.1.39 .zip下载地址:

–>点击下载数据库5.1.39驱动包–

第2步:在src创建配置文件hibernate.cfg.xml,放置在src目录下。

第3步:编写一个会话工厂类。通过会话工厂类产生一个会话Session对象。Session对象是Hibernate的核心。任何对数据库操作都在会话中进行的。

对于熟悉C3P0的朋友,可以按下面的理解:

(配置文件hibernate.cfg.xml可以类比c3p0.properties的配置文件,HibernateSessionFactory可以类比C3p0Pool,SessionFactory可以类比C3p0中的DataSource,Session可以类比Connection去理解)

第4步:编写POJO类以及映射文件。

POJO(POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans)

第5步:编写测试文件

hibernate.cfg.xml配置文件详解hibernate.cfg.xml其实这个名字自己可以随便取的,但是大家都这么取名,于是形成了一个习惯了!!!

代码语言:javascript复制

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

com.mysql.jdbc.Driver

jdbc:mysql://127.0.0.1:3306/hib

root

1234

20

true

50

23

false

true

utf-8

org.hibernate.dialect.MySQLDialect

简单配置版:

代码语言:javascript复制

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

com.mysql.jdbc.Driver

jdbc:mysql://127.0.0.1:3306/hib

root

1234

org.hibernate.dialect.MySQLDialect

Hibernate核心接口(1) Configuration接口Configuration 接口负责管理Hibernate 的配置信息。为了能够连上数据库必须配置一些属性,这些属性包括:

数据库URL

数据库用户

数据库用户密码

数据库JDBC驱动类

数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现。

代码语言:javascript复制 /*创建一个配置对象,读取配置文件*/

Configuration config = new Configuration();

config.configure("/hibernate.cfg.xml");(2) SessionFactory接口应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。

这里用到了一个设计模式即工厂模式,用户程序从工厂类SessionFactory中取得Session的实例。

SessionFactory不是轻量级的。它占的资源比较多,所以它应该能在整个应用中共享。

一个项目通常只需要一个SessionFactory就够了,但是当项目要操作多个数据库时,必须为每个数据库指定一个SessionFactory。

会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存时才会如此)Session类。

代码语言:javascript复制/*通过配置对象产生一个会话工厂*/

SessionFactory factory=config.buildSessionFactory();(3) Session接口该接口是Hibernate使用最多的接口。Session不是线程安全的,它代表与数据库之间的一次操作。

Session是持久层操作的基础,相当于JDBC中的Connection。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。

Session通过SessionFactory打开,在所有的工作完成后,需要关闭。但如果在程序中,不断地创建以及销毁Session对象,则会给系统带来不良影响。所以有时需要考虑session的管理合理的创建合理的销毁。

代码语言:javascript复制/*通过工厂产生一个会话*/

Session session=factory.openSession();(4) Query类Query类可以很方便地对数据库及持久对象进行查询,它可以有两种表达方式:查询语句使用HQL(面向”值对象”,HQL语言) (HQL是Hibernate Query Lanaguage简称是Hibernate配备了一种非常强大的查询语言,类似于SQL)或者本地数据库的SQL语句(面向”数据表”,SQL语言)编写。

代码语言:javascript复制/*通过会话产生一个查询对象*/

Query query = session.createQuery("from Student");//Student是POJO类,需要在配置文件中设置好映射

/*通过查询对象查询数据库,返回集合*/

List list = query.list();

for (int i = 0; i < list.size(); i++) {

Student student= (Student) list.get(i);

System.out.println(Student.getDname());

}(5) Transaction接口如果你向数据库中增加数据或修改数据时,需要使用事务处理,这时你需要Transaction接口。

Transaction接口是对实际事务实现的一个抽象,该接口可以实现JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务等跨容器的事务。

之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移值。

一个完整示例,显示了Hibernate编程基本思路首先,准备好实例数据库:代码语言:javascript复制create database hib charset=utf8;

use hib;

create table students(

sId varchar(8) primary key,

sName varchar(40),

sAge int

);

insert into students(sId,sName,sAge) values('S001','Jack',23);

insert into students(sId,sName,sAge) values('S002','Tom',25);

insert into students(sId,sName,sAge) values('S003','张三',43);

insert into students(sId,sName,sAge) values('S004','李四',55);准备好必要的jar包。

接下来配置好hibernate.cfg.xml文件:前面有的,就不重复了,配个图好了。

POJO类:代码语言:javascript复制package cn.hncu.domain;

public class Student {

private String sId;

private String sName;

private Integer sAge;

public Student() {

super();

}

public String getsId() {

return sId;

}

public void setsId(String sId) {

this.sId = sId;

}

public String getsName() {

return sName;

}

public void setsName(String sName) {

this.sName = sName;

}

public Integer getsAge() {

return sAge;

}

public void setsAge(Integer sAge) {

this.sAge = sAge;

}

@Override

public String toString() {

return "Student [sId=" + sId + ", sName=" + sName + ", sAge=" + sAge

+ "]";

}

}cn/hncu/domain/Student.hbm.xml映射文件代码语言:javascript复制

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

HibernateSessionFactory代码语言:javascript复制package cn.hncu.hib;

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {

private static String configFile = "/hibernate.cfg.xml";

private static Configuration config = new Configuration();

private static SessionFactory sessionFactory =null;

private static final ThreadLocal t = new ThreadLocal();

static{

try {

/*创建一个配置对象,读取配置文件*/

config.configure(configFile);

/*通过配置对象产生一个会话工厂类*/

sessionFactory = config.buildSessionFactory();

} catch (HibernateException e) {

e.printStackTrace();

}

}

public static Session getSession() throws HibernateException{

Session session = t.get();

if(session == null || !session.isOpen()){

if(sessionFactory==null){

rebuildSessionFactory();

}

/*通过会话工厂类产生一个会话实例*/

session = (sessionFactory!=null) ? sessionFactory.openSession() : null;

t.set(session);

}

return session;

}

private static void rebuildSessionFactory() {

try {

config.configure(configFile);

sessionFactory = config.buildSessionFactory();

} catch (HibernateException e) {

e.printStackTrace();

}

}

//关闭与数据库的会话

public static void closeSession() throws HibernateException{

Session session = t.get();

t.set(null);

if(session!=null){

session.close();

}

}

}TestHib代码语言:javascript复制package cn.hncu;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

import cn.hncu.domain.Student;

import cn.hncu.hib.HibernateSessionFactory;

public class TestHib {

public static void main(String[] args) {

/*创建一个配置对象,读取配置文件*/

String configfile="/hibernate.cfg.xml";

Configuration config=new Configuration();

config.configure(configfile);

/*通过配置对象产生一个会话工厂类*/

SessionFactory sessionfactory=config.buildSessionFactory();

/*通过会话工厂类产生一个会话实例*/

Session session=sessionfactory.openSession();

/*通过会话产生一个查询对象Query*/

Query query=session.createQuery("from Student");

/*进行查询返回一个集合List*/

List studs=query.list();

for(Student s:studs){

System.out.println(s);

}

session = HibernateSessionFactory.getSession();

query = session.createQuery("from Student");

List students = query.list();

for(Student s: students){

System.out.println(s);

}

}

}测试结果:完整实例代码: –>点击访问本实例源码–

转载请注明出处:http://blog.csdn.net/qq_26525215


注册公司行业分类明细怎么填?最全填写指南
虚惊一场!海帅称博阿滕伤势不重 定能踢世界杯