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