Hibernate概述
1.1 什么是hibrnate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。(https://baike.baidu.com/item/Hibernate/206989?fr=aladdin)
Hibernate就是一个持久层的ORM的框架. ORM :Object Relational Mapping.对象关系映射.
1.2 hibernate优点
简化JDBC的编程.
修改了实体类,不需要修改源代码.
轻量级的框架.
移植性好,支持各种数据库
1.3 hiebernate相关api
Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。下载地址:https://sourceforge.net/projects/hibernate/files/hibernate-orm/。
1.3.1 Configuration(加载配置文件)
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
1.3.2 SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
1.3.3 Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
Session不是线程安全的.
是与数据库交互的桥梁:完成CRUD的操作:常用的方法:
* save(Object obj);
* update(Object obj);
* delete(Object obj);
* T get(Class c,Serializable s);
* T load(Class c,Serializable s);
* saveOrUpdate(Object obj);
1.3.4 Transaction
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
1.3.5 Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
1.3.6 Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
1.4 hibernate核心配置
1.4.1 核心配置
Hibernate的核心配置有两种方式:
1.属性文件的方式:hibernate.properties 属性文件的方式不能配置映射: 通过手动编写代码方式加载映射: 2.XML文件的方式:hibernate.cfg.xml 一块:必须的配置: 数据库连接信息: 数据库方言: 二块:可选的配置: 显示SQL 格式化SQL hbm2ddl.auto none create:数据库有表,每次都会创建一个新的表.(测试时候) create-drop:每次都会创建一个新的表,用完之后就删除掉.(测试时候) update:如果数据库没有表,创建一个新表,如果有表,使用原有表.更新表结构 validate:使用原有表,进行校验. 三块:加载映射,例如:
<mapping resource="com/zh/domain/Customer.hbm.xml"/>
例如hibernate.cfg.xml:
<hibernate-configuration>
<!-- 先配置SessionFactory标签,一个数据库对应一个SessionFactory标签 -->
<session-factory>
<!-- 必须要配置的参数有5个,4大参数,数据库的方言 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate1?characterEncoding=UTF-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<!-- 数据库的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可选配置 -->
<!-- 显示SQL语句,在控制台显示 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 生成数据库的表结构
update:如果没有表结构,创建表结构。如果存在,不会创建,添加数据
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射配置文件,需要引入映射的配置文件 -->
<mapping resource="com/zh/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
1.4.2 映射文件配置
映射文件是一个XML文件,通常命名 类名.hbm.xml。例如Customer.hbm.xml:
<hibernate-mapping>
<!-- 配置类和表结构的映射 -->
<class name="com.zh.domain.Customer" table="cst_customer">
<!-- 配置id
name属性,JavaBean的属性
column属性,是表结构的字段
-->
<id name="cust_id" column="cust_id">
<!-- 主键的生成策略 -->
<generator class="native"/>
</id>
<!-- 配置其他的属性 -->
<property name="cust_name" column="cust_name"/>
<property name="cust_user_id" column="cust_user_id"/>
<property name="cust_create_id" column="cust_create_id"/>
<property name="cust_source" column="cust_source"/>
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_linkman" column="cust_linkman"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
</class>
</hibernate-mapping>
1.6 hibernate入门程序
1.下载
2.创建数据库表
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_user_id` bigint(32) DEFAULT NULL COMMENT '负责人id',
`cust_create_id` bigint(32) DEFAULT NULL COMMENT '创建人id',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
`cust_linkman` varchar(64) DEFAULT NULL COMMENT '联系人',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;
3.引入jar包
数据库驱动包:Hibernate/lib/required/*和日志包
4.创建实体
5.创建映射配置文件Cutomer.hbm.xml
6.创建核心配置文件Hibernate.cfg.xml
7.编写代码
//测试保存客户
@Test
public void testSave(){
// 1.加载配置文件
Configuration config = new Configuration().configure();
// 2. 创建SessionFactory对象
SessionFactory factory = config.buildSessionFactory();
// 3. 创建session对象
Session session = factory.openSession();
// 4. 开启事务
Transaction tr = session.beginTransaction();
// 5. 编写保存的代码
Customer c = new Customer();
// c.setCust_id(cust_id); 主键是自动递增了
c.setCust_name("测试3");
c.setCust_level("2");
c.setCust_phone("110");
// 保存数据,操作对象就相当于操作数据库的表结构
session.save(c);
// 6. 提交事务
tr.commit();
// 7. 释放资源
session.close();
factory.close();
}