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).原理图
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("[email protected]");
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标准开发,更换数据库时,只需要配置相应的配置文件就可以了,不需要做其它任务的操作)。