hibernate介绍,通过实例来进一步了解hibernate框架

hibernate介绍,通过实例来进一步了解hibernate框架


1.hibernate简介
1.1.hibernate框架,它是一种基于JDBC的主流持久化框架,是一个优秀的orm实现;它对JDBC进行了轻量级的封装,大大简化了数据访问层繁杂的重复代码;而且它利用了Java反射机制来实现程序的透明性;它的本意是从对象出发而非关系数据库出发,这一点也就是说明它是以面向对象思维解决数据库的操作问题。Hibernate可以作为模型层/数据访问层。它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作。
1.2.Hibernate框架是持久层框架,作用是将JAVA对象持久化到数据库中
1.3.Hibernate不要求程序员将POJO一一映射到数据库表,可以多个表对应一个POJO,也可以将多个POJO持久化到一个表中。
2.Hibernate的核心接口组件
(1).Configuration类:用来读取Hibernate配置文件,并生成SessionFactory对象。
(2).SessionFactory接口:产生Session实例工厂。
(3).Session接口:用来操作PO。它有get(),load(),save(),update()和delete()等方法用来对PO进行加载,保存,更新及删除等操作。它是Hibernate的核心接口。
(4).Query接口:用来对PO进行查询操。它可以从Session的createQuery()方法生成。
(5).Transaction接口:用来管理Hibernate事务,它主要方法有commit()和rollback(),可以从Session的beginTrancation()方法生成。
3.Hibernate的运行过程
(1).应用程序先调用Configration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactpry对象。
(2).然后从SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象;可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将 提交这些操作结果到数据库中。
(3).原理图
hib
4.环境配置
(1).首先需要我们拷入必备的jar包,官网下载:http://hibernate.org/放在项目的lib下

[code]
antlr-2.7.6.jar (生成SQL语句)
asm.jar(字节码增强工具类)
c3p0-0.9.1.jar(数据源连接池组件)
cglib-2.1.3.jar(代理组件,基于继承的)
commons-collections-2.1.1.jar(集合工具类组件,会进行高效的操作)
commons-logging-1.0.4.jar(日志输出的转换组件)
log4j-1.2.11.jar(日志输出组件,更加详细和可以控制输出格式,及目的地)
dom4j-1.6.1.jar(XML解析)
ehcache-1.2.3.jar(缓存组件)
ejb3-persistence.jar(持久化操作的规范jar包)
hibernate3.jar(框架的核心jar包)
jta.jar(全局的事务管理)
junit-3.8.1.jar        (单元测试)                        
mysql-connector-java-3.1.13-bin.jar (MySQL数据库驱动jar包)
[/code]

(2).引入配置文件:hibernate.cfg.xml Hibernate核心配置文件(包括数据库的连接配置,映射文件的读取等),log4j.properties Log4j的日志输出控制文件。 User.hbm.xml 映射文件(这里的User只是匹配User实体的,一个实体类对应一个此类的映射文件。)

(3).配置文件hibernate.cfg.xml

[code lang="xml"]
<hibernate-configuration>  
    <!-- 构造数据库的连接工厂,这是Hibernate的核心类 -->  
    <session-factory>  
        <!-- 这里是简单的数据库连接的基本信息,-->  
        <property name="hibernate.connection.url">
         jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf8</property>  
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
        <property name="hibernate.connection.username">root</property>  
        <property name="hibernate.connection.password">android</property>   
        <!-- 在控制台里打印生成的SQL语句 -->  
        <property name="hibernate.show_sql">true</property>  
        <!-- 格式化控制台输出的SQL语句,这两条都是方便我们来学习Hibernate框架 -->  
        <property name="hibernate.format_sql">true</property>   
        <!--   
          根据指定的方言与数据库打交道,完成SQL的具有语句生成,因为不同的数据库sql语法还是有区别的,  
            这里相当于告诉Hibernate框架,我们使用的是什么数据库。  
                MySQL : org.hibernate.dialect.MySQLDialect  
                Oracle : org.hibernate.dialect.OracleDialect  
         -->  
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>       
        <!-- 管理所有的映射资源文件,这里仅仅配置了User类的配置映射文件,应该将我们的所有的映射配置文件设置到这里,这样我
        们框架才能找到 -->  
        <mapping resource="com/cxk/hibernate/user.hbm.xml"/>    
    </session-factory>  
</hibernate-configuration>  
[/code]

(4).*.hbm.xml与实体类对应的用来做映射的文件

[code lang="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 package="com.cxk.domian">
<!-- 类名 User  表名:user -->
<class name="User" table="user">
<!-- 主键策略 -->
<id name="id" column="id" type="java.lang.Integer">
<!-- hilo  sequence navtive uuid identity foreign 使用native会根据你数据的类型选择 sequence identity等-->
<generator class="native" />   
 <!-- <generator class="increment"/>  -->
<!--  <generator class="identity"/> -->
 
</id>
<property name="email" type="java.lang.String">
<column name="email" length="64"/>
</property>
<property name="pwd" type="java.lang.String">
<column name="pwd" length="32"/>
</property>
<property name="grade" type="java.lang.Integer">
<column name="grage" length="5"/>
</property>
<property name="hiredate" type="java.util.Date">
<column name="hiredate" length="64"/>
</property>

<property name="name" type="java.lang.String">
<column name="name" length="64" />
</property>

<property name="salary" type="java.lang.Float">
<column name="salary"/>
</property>
</class>
</hibernate-mapping>
[/code]

(5).数据库创建user 表语句

[code lang="sql"]
create table user(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 
email nvarchar(50) not null, 
name nvarchar(500) not null , 
hiredate TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,  
salary char(100) not null,
pwd varchar(50) not null,
grade int(2) default 1 not null
);
[/code]

(6).建立实体类User.java

[code lang="java"]
package com.cxk.domian;

import java.util.Date;

public class Employee {

	private Integer id;
	private String name;
	private String email;
	private String pwd;
	private java.util.Date hiredate;
	private Float salary;
	//默认的无参构造方法
	public Employee(){
	}
      //	构造函数
	public Employee( String name, String email, Date hiredate, Float salary) {	
      //		this.id = id;
		this.name = name;
		this.email = email;
		this.hiredate = hiredate;
		this.salary = salary;
	}
	
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public java.util.Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(java.util.Date hiredate) {
		this.hiredate = hiredate;
	}
	public Float getSalary() {
		return salary;
	}
	public void setSalary(Float salary) {
		this.salary = salary;
	}
}
[/code]

(7).编写测试类

[code lang="java"]

import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.hibernate.cfg.Configuration;  
public class HibernateTest {  
    public static void main(String[] args) {  
          
        //读取hibernate.cfg.xml文件  
        Configuration cfg = new Configuration().configure();   
        //建立SessionFactory  
        SessionFactory factory = cfg.buildSessionFactory();  
        //取得session  
        Session session = null;  
        try {  
            session = factory.openSession();  
            //开启事务  
            session.beginTransaction();  
            User user = new User();  
            user.Name("张三");  
            user.pwd("123"); 
            user.email("aa@.qq.com");
            user.salary("2000");   
            //保存User对象  
            session.save(user);  
            //提交事务  
            session.getTransaction().commit();  
        }catch(Exception e) {  
            e.printStackTrace();  
            //回滚事务  
            session.getTransaction().rollback();  
        }finally {  
            if (session != null) {  
                if (session.isOpen()) {  
                    //关闭session  
                    session.close();  
                }  
            }  
        }  
    }  
} 
[/code]

5.运行时可能出现的错误
(1).Unsupported major.minor version 52.0 error。 原因:JDK版本不一致的问题
(2).产看当前java JDk版本 :java -version
(3).调整jdk版本一致:
eclipse>windows>preferences>java>compiler>compiler compliance level 1.8
你的项目右键>properties>java compiler>1.8
6.总结
(1).Hibernate框架是从创建sessionFactory对象,然后创建session对象,通过session对象进行对数据库的操作。
(2).把这些对象,事务的操作交给框架来管理,我们需要做的就是持久化操作的那些代码,是非常少的。可以和spring和struts一起综合使用ssh。
(3).hibernate是基于ORMapping技术的开源的框架,对JDBC进行了轻量级的封装,使用面向对象的思维来操纵数据库。
(4).hibernate提供了session缓存和二级缓存,对于不需要进行复杂查询的系统,性能有提升。不需要编写的SQL语句(不需要编辑JDBC),只需要操作相应的对象就可以了,就可以能够存储、更新、删除、加载对象,可以提高生产效。
(5).使用Hibernate,移植性好(只要使用Hibernate标准开发,更换数据库时,只需要配置相应的配置文件就可以了,不需要做其它任务的操作)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值