Hibernate简述:
Hibernate的官方网站为:http://www.hibernate.org
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()执行查询,并将结果封装成对象.
-------------------------------------------------------------------------------------------