Hibernate 简介,实例入门


  1. Hibernate是什么?

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

  对象关系映射简称ORM(Object Relational Mapping),由于我们目前使用的编程语言大都是面向对象的编程,使用的数据库也大多都是关系型数据库,数据得以对象的形式在程序中使用,并且程序中的有些对象(数据对象)得永久保存在数据库中,故就出现了ORM,说得更通俗点:ORM就是将数据库中的数据和程序中的对象进行互相的转换!

  如今的ORM框架可以说是很丰富的:

  上面举例说了那么多ORM,那么ORM和Hibernate是什么关系呢?

  一句说:Hibernate是ORM框架的一种实现.

  这里我不得不说一下,大家不要觉得框架是一个很神奇的东西,其实我们也一直在做,一直在用,只不过我们所用所做的框架使用的范围不够大(也就是没普遍性),而且没也给它一个官方的名字而已!

  ORM我们平时有做吗?

  做Java开发的人,也一直在做,也一直在用,最常用的的DAO模式,DAO也是ORM的一种实现!

  一个典型的DAO实现有下列几个组件:

  1. 一个DAO工厂类;(工厂设计模式)

  2. 一个DAO接口;(定义数据库操作)

  3. 一个实现DAO接口的具体类;

  4. 数据传递对象(有些时候叫做值对象).

       Hibernate封装JDBC,持久化内存中的对象,同步到数据库 .

  1. 关于封装,我得强调两点:

    (1).把尽可能多的东西藏起来.对外提供简捷的接口.

    (2)把所有的属性藏起来

         当然我们,我们如果能够做到单一原则就更好了

        2.关于持久化的概念

         持久化定义:将程序数据在持久状态和瞬时状态间转换的机制。

         这里讲的是Hibernate的话得讲一下中的几种状态:瞬时状态,持久状态,管状态

    1.  瞬时状态(Transient):指一个对象在内存中开辟空间.如 User user=new User();此时user对象就是瞬时状态的.
    2.  持久状态(Persistent):数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。可以以文件,数据库以及xml等形式.
    3. 脱管状态(Detached):当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。  

               这里我想总结一点关于瞬时状态和持久状态:瞬时态就是存在于内存中的,如果电脑关了后,再启动,之前在内存中的对象已经不在了,如果持久状态的                    话,保存在磁盘上的数据对象,当需要时还是可以加载到内存中,不会因电脑的启动而受到影响!

Hibernate入门实例

  1. 首先我们得下载Hibernate的需要的jar包.
  2. 下载的Hibernate会有很多jar包,一般有22或者23个左右,但到底我们需要的包有哪些呢?

    hibernate3.jar:    这个是Hibernate的核心包,所以是必须的jar包.

    cglib-2.2.jar:     cglig库,Hibernate用它来实现PO字节码的动态生成,非常核心的包,所以也是必须的包

    dom4j.jar

      dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,Hibernate用它来读写配置文件。

    commons-collections.jar:    Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。

    javassist-3.12.0.GA.jar:      这个包也是必须的.

    jta-1.1.jar:     当使用JTA规范时,必须加入,JTA全称是 Java Transaction API (java 事务 API),一般情况下也是必须的.

    slf4j-api-1.6.1.jar:     这个包是必须的,因为在Hibernate的核心包中多处用到了,比如Configuration.class中用到了.

    slf4j-nop-1.6.1.jar:    这个包是slf4j的实现类,所以也是必须的,注意实现类得和slf4j的版本要匹配.

    hibernate-jpa-2.0-api-1.0.1.Final.jar:       Hibernate使用Annotation(注解)需加,所以说如果不用Annotation的话就不用加的.

                (以上的包是Hibernate3.5以上的版本)

   3.  数据库脚本

      我们使用mysql数据库,创建db_person,创建tb_student表,脚本如下:

 

复制代码
 1 drop database if exists db_Person;
 2 create database db_Person;
 3 use db_Person;
 4 drop table if exists tb_student;
 5 create table tb_student
 6 ( id int(4) not null,
 7   name varchar(20) not null,
 8   age int(4) null,
 9   primary key(id)
10  )ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=REDUNDANT;
复制代码

        4.  Hibernate的配置:

    通常hibernate的配置文件有两种一种是以xml,另外一种是以properties文件来进行配置,同样,Hibernate的配置文件有两种:一种是主配置文件(主要配置数据库相关的和映射文件的位置等),另外一种就是配置映射文件(数据库中的表和程序中的映射)

 

从上图我们可以看出主配置文件是hibernate.cfg.xml(这个名字最好就采用,因为在Hibernate中的Configuration中的configure()方法默认加载的就是hibernate.cfg.xml,并且一定要放在src目录下,当然如果你想在这些方面创新也是可以的,因为configure()还有一个重载方法configure(String resource) )

Hibernate源码中的Configuration中configure()方法代码
复制代码
1 /**
2      * Use the mappings and properties specified in an application
3      * resource named <tt>hibernate.cfg.xml</tt>.
4 */
5     public Configuration configure() throws HibernateException {
6         configure( "/hibernate.cfg.xml" );
7         return this;
8     }
复制代码
下面关于hibernate.cfg.xml里面的详细配置信息:

 

复制代码
 1 <?xml version='1.0' encoding='utf-8'?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 
 6 <hibernate-configuration>
 7 
 8     <session-factory>
 9 
10         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
11         <property name="connection.url">jdbc:mysql://localhost:3306/db_Person</property>
12         <property name="connection.username">root</property>
13         <property name="connection.password">password</property>
14 
15         <!-- JDBC connection pool (use the built-in) -->
16         <property name="connection.pool_size">1</property>
17 
18         <!-- SQL dialect -->
19         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
20 
21 
22         <!-- Disable the second-level cache  -->
23         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
24         
25         <property name="current_session_context_class">thread</property>
26 
27         <!-- Echo all executed SQL to stdout -->
28         <property name="show_sql">true</property>
29 
30 
31         <mapping resource="com/liuyi/bean/student.hbm.xml"/>
32         <mapping class="com.liuyi.bean.Teacher"/>
33 
34     </session-factory>
35 
36 </hibernate-configuration>
复制代码

 


这里hibernate.cfg.xml是根据hibernate-configuration-3.0.dtd中的规范来定的,其中dtd是Document Type Definition(文档类型定义),关于dtd的规范,我以后会发表博客详细说明.
  hibernate.cfg.xml中的详细说明
    对于这个hibernate.cfg.xml,我们不需要强行记住它是怎么写(也就是不要求,自己能够完整写出),但我们要求理解里面每项的配置的作用和意思.
    property是指属性;name是指属性的名称;mapping是指映射文件;resource指文件的完整路径(这里是以相对的位置);class是指类的位置(Annotation的映射)
 
    connection.driver_class:连接数据库所需驱动包.(如mysql的jdbc包等)

    connection.url:连接数据库的URL

    connection.username:数据库登录的用户名

    connection.password:用户登录数据库的密码

    connection.pool_size:数据库连接池的大小

    dialect:数据库所使用的方言(hibernate支持几乎所有数据库的方言)

    cache.provider_class:设置二级缓存的启用/禁用

    current_session_context_class:为"当前" Session指定一个(自定义的)策略

    show_sql:是否在控制台打印sql语句(true/false)

    format_sql:在日志或控制台输出更漂亮的sql语句(true/false)


         以上仅仅是程序中使用到的配置的一些说明,这些还是远远不够,我会提供一个详细的关于hibernate.cfg.xml中各项配置的说明

    最后我还是觉得我应该把我学习hibernate的一个感觉:Hibernate是我学习java开源框架中,文档和帮助教程做得最好,最全,而且有中文的文档,所以我们在开发中遇到问题第一个首先的查阅官方文档.

hibernate完整实例

1.建立数据库

CREATE TABLE usertable ( 
  ID int(6) NOT NULL auto_increment, 
  username varchar(24) NOT NULL default '', 
  password varchar(24) NOT NULL default '', 
  PRIMARY KEY  (ID) 
)
2.配置文件, 加入myeclipse的hibernate.并在此工程中建立数据连结。建立完成后,在src下自动生成hibernate.cfg.xml

<?xml version='1.0' encoding='GBK'?>
<!DOCTYPE hibernate-configuration
    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 是否将运行期生成的SQL输出到日志以供调试 -->
        <property name="show_sql">true</property>		
        <!-- SQL方言,这里设定的是MySQL -->
        <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>		
        <!-- JDBC驱动程序 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>		
        <!-- JDBC URL, "?useUnicode=true&characterEncoding=GBK" 表示使用GBK进行编码 -->
        <property name="connection.url">
	  jdbc:mysql://localhost:3306/HibernateTest?useUnicode=true&characterEncoding=GBK
        </property>		
        <!-- 数据库用户名 -->
        <property name="connection.username">root</property>		
        <!-- 数据库密码 -->
        <property name="connection.password">javamxj</property>
        <!-- 指定User的映射文件 -->
        <mapping resource="javamxj/hibernate/User.hbm.xml"/>       
    </session-factory>
</hibernate-configuration>

3.可持久化类

public class User {
    private int id;
    private String username;
    private String password;	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
}
4.映射文件

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping
    PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
	
<hibernate-mapping>
    <class name="javamxj.hibernate.User" table="UserTable">
        <id name="id">
            <generator class="assigned" />
        </id>
        <property name="username"  />
        <property name="password" />		
    </class>
</hibernate-mapping>
5.主程序
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;

public class Test {

	public static void main(String[] args) {

		try {
			SessionFactory sf = new Configuration().configure()
					.buildSessionFactory();
			Session session = sf.openSession();
			Transaction tx = session.beginTransaction();

			User user = new User();
			user.setUsername("Blog");
			user.setPassword("分享java快乐");

			session.save(user);
			tx.commit();
			session.close();

		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值