Hibernate学习01【持续更新】

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对象中取出一个session
		Session session = sessionFactory.openSession();
		//讲持久化对象保存到数据库中
		session.save(customer);
		//关闭session
		session.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()执行查询,并将结果封装成对象.
-------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值