Hibernate学习01【持续更新】

来源:互联网 发布:lightroom是什么软件 编辑:程序博客网 时间:2024/06/05 02:14

Hibernate简述:

Hibernate的官方网站为:http://www.hibernate.org

学习之前先来简述Hibernate是个什么东东:
Hibernate是一种ORM(全写为:Object-Relative Database-Mapping)框架,
与各种数据库,SQL语句打交道,是数据持久化的一种解决方案.
ORM框架是对象与关系数据库之间建立某种映射以实现直接存取Java对象(一般为POJO),
不同于MVC思想,使用范围与MVC截然不同。
传统的数据化持久编程中,需要使用JDBC并配合SQL语句,如Connection,Statement,ResultSet等JDBC API配合开发。
这种开发方式效率比较低下,开发繁琐,而ORM是通过配置文件或者使用注解的方式把java对象映射到数据库上自动生成SQL语句并执行,ORM技术已广泛应用于各种大规模的系统中。所以学习Hibernate很有必要。

使用Hibernate的益处:
1.市面上的ORM框架有许多,比如Sun公司的JDP,Oracle公司的TopLink,Apatche的iBatis与OpenJPA等。
但Hibernate使用简单,功能强大,支持各种类型数据库,能直接操作POJO。
2.轻量级框架,不依赖任何容器。在Tomcat,JBoss,WebLogic服务器下都可以使用。

Hibernate原理剖析:
JDBC编程中,代码狗通过DAO层编写SQL插入数据,而在Hibernate中原理与JDBC一样,
不同的是Hibernate充当了DAO层的角色,根据POJO与实体类的映射配置自动生成相应的SQL语句。

Hibernate的SQL是自动生成。如果实体发生变化,只需要修改实体类相对应的配置就可以了。

下面用一张图来说明hibernate和ORM的关系:


Hibernate对象简介:



Hibernate对象工作原理:



1).创建Web应用
将hibernate所需jar包(共11个),复制到Web应用中:
antlr-2.7.6.jar
c3p0-0.9.1.2.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate3.jar
javassist-3.9.0.GA.jar
jta-1.1.jar
log4j.jar
slf4j-api-1.5.8.jar
slf4j-log4j12.jar
mysql-connector-java-5.1.7-bin.jar


2).创建表customers.sql:

create database hibernate2;use hibernate2;drop table if exists customers;create table if not exists customers(id int primary key auto_increment,name varchar(20),age int,des varchar(20));
3)创建持久化对象/javabean
public class Customer {private int id;private String name;private int age;private String des;public Customer(){}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getDes() {return des;}public void setDes(String des) {this.des = des;}}
4):在src/hibernate.cfg.xml配置文件;
目的:通知hibernate如何连接数据库和动态产生不同数据库的SQL命令.
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">                 <hibernate-configuration>    <session-factory>    <!-- 连接数据库的相关属性 -->        <!-- 通知hibernate动态生成的SQL符合哪种数据库的语言格式,这里配置的是MySQL数据格式 -->        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>    <property name="show_sql">true</property>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate2</property>        <property name="connection.username">root</property>        <property name="connection.password">root</property>    <!-- 通加hibernate去指定的路径下,加载映射文件 -->    <mapping resource="cn/lsh/hibernate/domain/Customer.hbm.xml"></mapping>    </session-factory></hibernate-configuration>
5)在与持久化类/javabean同一个包下,创建Customer.hbm.xml映射文件 
   目的:通知hibernate如何将持久类转成表的映射关系
         规则:
[全路径]类名-----表名
         属性名-----------字段名
对象------------记录

<!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   <hibernate-mapping package="cn.lsh.domain.Customer">   <!-- 实体对应数据库中的表 -->    <class name="Customer" table="CUSTOMERS">    <!-- 类中的成员属性对应表中的字段 -->    <id name="id" column="id">    <generator class="increment"/>    </id>    <property name="name" column="name"/>    <property name="age" column="age"/>    <property name="des" column="des"/>    </class> </hibernate-mapping>
Dao层:

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import cn.lsh.domain.Customer;public class CustomerDao {public void addCustomer(Customer customer){//创建hibernate配置对象Configuration config = new Configuration();//加载hibernate配置文件,自动默认加载src/hibernate.hbm.xml文件.config.configure();//创建SessionFactory对象SessionFactory sessionFactory = config.buildSessionFactory();//从SessionFactory对象中取出一个sessionSession session = sessionFactory.openSession();//讲持久化对象保存到数据库中session.save(customer);//关闭sessionsession.close();}}
测试:

TestDemo:

import cn.lsh.dao.CustomerDao;import cn.lsh.domain.Customer;public class TestDemo1 {public static void main(String[] args) {add();}//添加用户public static void add(){CustomerDao customerDao = new CustomerDao();Customer c1 = new Customer(001,"曹操",30,"三国杰出人物之一");Customer c2 = new Customer(002,"刘备",25,"三国杰出人物之一");Customer c3 = new Customer(003,"孙权",20,"三国杰出人物之一");customerDao.addCustomer(c1);customerDao.addCustomer(c2);customerDao.addCustomer(c3);}}
查看数据库,插入数据成功.

mysql> select * from customers;+----+------+------+------------------+| id | name | age  | des              |+----+------+------+------------------+|  1 | 曹操    |   30 | 三国杰出人物之一              ||  2 | 刘备     |   25 | 三国杰出人物之一              ||  3 | 孙权    |   20 | 三国杰出人物之一              |+----+------+------+------------------+3 rows in set (0.06 sec)

总结,利用hibernate操作数据库比较简洁,但是配置文件较多,对于初学者不易理解!

附录: 
-------------------------------------------------------------------------------------------
hibernate.cfg.xml配置文件总结

<hibernate-configuration>    <session-factory><!-- 连接数据库的相关属性 -->        <property name="connection.driver_class">com.mysql.jdbc.Driver【驱动名】</property>        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernateDB【url】</property>        <property name="connection.username">root【访问数据库用户名】</property>        <property name="connection.password">root【访问数据库密码】</property>        <!-- 通知hibernate动态生成的SQL符合哪种数据库的语言格式 -->        <property name="dialect">org.hibernate.dialect.MySQL5Dialect【方面】</property>        <!-- 通加hibernate去指定的路径下,加载映射文件 -->        <mapping resource="cn/itcast/web/hibernate/domain/Customer.hbm.xml"【映射文件的类路径】/>    </session-factory></hibernate-configuration>
-------------------------------------------------------------------------------------------
Customer.hbm.xml映射文件总结
<hibernate-mapping package="cn.itcast.web.hibernate.domain【该文件中出现在类不源于哪个包】"><class name="Customer【持久化类名】" table="CUSTOMERS【表名】"><!-- 一般主健 --><id name="id【持久化主键名】" column="id【表主键】"><generator class="increment【基于算法的自增,从1开始】"/></id><property name="name【持久化属性名】" column="name【表列名】"/><property name="age【持久化属性名】"  column="age【表列名】"/><property name="des【持久化属性名】"  column="des【表列名】"/></class></hibernate-mapping> 
-------------------------------------------------------------------------------------------
hibernate常用类或接口总结:
(1)Configuration类:用于配置、启动Hibernate,创建SessionFactory实例对象。
(2)SessionFactory接口:用于初始化Hibernate,创建Session实例对象,充当数据源管理器
  SessionFactory是一个重量级对象,创建和销毁耗时耗资源,因此多个
          线程应该共享同一个SessionFactory对象,而且只创建一次,SessionFactory
          本身线程安全。是针对单个数据库映射关系经过编译后的内存镜像。
(3)Session接口:用于保存、更新、加载、查询持久化对象,充当持久化管理器,
   Session类似于Connection,表示一次与数据库的连接,Session是一个轻量级对象,
           创建和销毁耗时耗资较少,Session本身线程不安全,只能在单线程中使用。 
(4)Transaction接口:用于封装底层事务,充当事务管理器。
(5)Query接口: 用于执行HQL(类似于SQL)数据库查询,充当Hibernate查询器。
-------------------------------------------------------------------------------------------
hibernate常用API总结:
(01)new Configuration():创建配置对象,同时加载hibernate.properties配置文件.
(02)config.configure():加载src/hibernate.cfg.xml配置文件.
(03)config.configure("cn/itcast/web/hibernate/config/hibernate.cfg.xml");
(04)config.addResource("cn/itcast/web/hibernate/domain/Customer.hbm.xml");加载映射文件.
(05)session.save():保存持久对象到数据库.
(06)session.get():根据ID取得持久对象.
(07)session.update():更新持久对象.
(08)session.delete():删除持久对象.
(09)session.beginTransaction():获取并开始事务.
(10)transaction.commit():提交事务,hibernate将持久化存入数据库表.
(11)transaction.rollback():事务回滚.
(12)session.close():关闭Session对象,即将Session缓存中的所有对象一次性清空出去.
(13)Query query = session.createQuery(hql):创建Query查询对象,主要用于HQL的执行.
(14)customerList = query.list()执行查询,并将结果封装成对象.
-------------------------------------------------------------------------------------------

0 0
原创粉丝点击