Hibernate从零开始Hibernate
Posted 经理,天台风好大
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate从零开始Hibernate相关的知识,希望对你有一定的参考价值。
文章目录
一、认识 Hibernate
1、hibernate 中文:冬眠
2、持久化:数据从瞬时状态转化为持久状态
3、Hibernate:是一个轻量级的持久化框架。没有侵入性。是一个 orm 映射框架。简化了 jdbc 操作。极大了提高了开发效率。提供了缓存机制。强大的查询机制。支持多种数据库(数据库移植);
4、框架结构原理(解决阻抗不匹配)
5、原理
二、第一个hibernate案例
2.1 包的结构解析
2.2 hello hibernate
- 新建 java 项目
- 导入相关 jar 包
antlr-2.7.7.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.5.Final.jar
hibernate-core-4.3.10.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-1.1.0.Final.jar javassist-3.18.1-GA.jar
jboss-logging-3.1.3.GA.jar
jboss-logging-annotations-1.2.0.Beta1.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar
mysql-connector-java-5.1.20-bin.jar - 编写 hibernate.cfg.xml 文件(拷贝 project/etc/hibernate.cfg.xml)
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property >
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate4</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
- 编写实体类
public class User {
private int id;
private String name;
private int age;
public User() {}
}
- 编写实体类的映射文件(*.,hbm.xml)—将映射文件加入到 hibernate.cfg.xml
<hibernate-mapping package="cn.sxt.pojo">
<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="age"/>
</class>
</hibernate-mapping>
- 编写测试类
public class Test {
public static void main(String[] args) {
//读取 src 下 hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
//获取注册对象 4.3 的创建办法
ServiceRegistry registry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties())
.build();
SessionFactory factory = cfg.buildSessionFactory(registry);
Session session = factory.openSession();
//保存数据
Transaction tx = session.beginTransaction();
User u = new User("张三",22);
session.save(u);
tx.commit();
session.close();
}
}
三、配置文件讲解
3.1 hibernate.cfg.xml 配置文件
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- session 工厂的配置 -->
<session-factory>
<!-- jdbc 配置 -->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
<!-- url 的两种配置方式 -->
<!-- jdbc:mysql://localhost:3306/hibernate4-->
jdbc:mysql:///hibernate4
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 数据库方言 hibernate 支持多种数据库,通过设置方言 hibernate 才知道应该 生成对应数据库的 sql 语句:hibernate 支持的数据库的方言 hibernate.properties 文件中都有 -->
<property name="dialect">
org.hibernate.dialect.MySQL5Dialect
</property>
<!-- 打印 hibernate 生成的 sql 语句 -->
<property name="show_sql">true</property>
<!-- 格式化打印的 sql 语句 -->
<property name="format_sql">true</property>
<!-- 根据不同值,进行数据表表的操作
create 每次执行 都删除原有表,然后创建新表
create-drop 执行前创建表,执行后删除表
update 如果有则不改变表,如果没有则创建
-->
<property name="hbm2ddl.auto">update</property>
<!-- 将所有映射文件添加到这里 -->
<mapping resource="cn/sxt/pojo/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3.2 *.hbm.xml 映射文件讲解
<!-- 类的映射文件信息 -->
<!-- package 指定类的包名 可以不配置 如果不配置 那么在配置 class 的 name 时需要指定该类所在包--> <hibernate-mapping>
<!-- class 配置类
name 指类名
table 指定表名
如果不写,默认类名 为表名
-->
<class name="cn.sxt.pojo.User" table="t_user">
<!-- id 主键的配置
name 配置类的属性名
column 数据库字段名 不写和属性名一致
type 指定属性的类型
length 指定字段的长度
-->
<id name="id" column="id">
<!-- 主键的生成策略
increment:
-用于为 long, short 或者 int 类型生成 唯一标识。只有在 没有其他进程往同一张表中插入数据时才能使用。
在集群下不要使用。
identity:
-对 DB2,MySQL, MS SQL Server, Sybase 和 HypersonicSQL的内置标识字段提供支持。
返回的标识符是 long, short 或 者 int 类型的。
native: -(如果是 mysql 自增,那么 native 和 identity 是一样)
-根据底层数据库的能力选择 identity, sequence 或者 hilo 中的一个。
sequence:
-在 DB2,PostgreSQL, Oracle, SAP DB, McKoi 中使用序 列(sequence), 而在 Interbase 中使用生成器(generator)。返回的标识 符是 long, short 或者 int 类型的。
<generator class="sequence">
<param name="sequence">user_seq</param>
</generator>
assigned:
-让应用程序在 save()之前为对象分配一个标示符。这是 <generator>元素没有指定时
的默认生成策略。
-->
<generator class="identity">
</generator>
</id>
<!-- property 是配置类的属性 name 指属性名 -->
<property name="name" length="40"/>
<property name="age" />
</class>
</hibernate-mapping>
四、Hello 的代码分析
4.1 Test.java
package cn.sxt.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import cn.sxt.pojo.User;
public class Test {
public static void main(String[] args) {
//1、读取src下hibernate.cfg.xml 如果不为configure指明参数 默认读取hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
//3.x版本不需要ServiceRegistry
//4.0 ServiceRegistryBuilder
//获取注册对象4.3的创建办法
ServiceRegistry registry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties())
.build();
//SessionFactory是一个重量级对象 session的工厂 生命周期是进程级别的 支持集群 线程安全的
SessionFactory factory = cfg.buildSessionFactory(registry);
/*Session (org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,
此对象生存期很短。 其隐藏了JDBC连接,也是Transaction的工厂。
其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到
session支持数据库操作
* */
Session session = null;
//事务对象
Transaction tx =null;
try{
session = factory.openSession();
tx = session.beginTransaction();
User u = new User("小红",22);
//保存数据
session.save(u);
//提交事务
tx.commit();
}catch(Exception e){
if(tx!=null)
//回滚事务
tx.rollback();
}finally{
if(session!=null)
session.close();
}
factory.close();
}
}
4.2 封装util
package cn.sxt.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
private static Configuration cfg=null;
private static ServiceRegistry registry=null;
private static SessionFactory factory=null;
static{
cfg = new Configuration().configure();
registry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties())
.build();
factory = cfg.buildSessionFactory(registry);
}
public static Session getSession(){
return factory.openSession();
}
}
4.3 常用操作
package cn.sxt.vo;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.sxt.pojo.User;
import cn.sxt.util.HibernateUtil;
public class HibernateTest {
//向数据库添加数据
@Test
public void testSave(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
//获取事务对象
tx = session.getTransaction();
//开启事务
tx.begin();
User u = new User("张学友",55);
session.save(u);
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx!=null)
tx.rollback();
}finally{
if(session!=null)
session.close();
}
}
//获取数据
@Test
public void testGetById(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
//获取事务对象
tx = session.getTransaction();
//开启事务
tx.begin();
//获取对象 第一参数 是对象的类型 第二个参数是 主键值
//User u = (User)session.get(User.class, 2);
User u = (User)session.load(User.class, 2);
System.out.println(u);
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx!=null)
tx.rollback();
}finally{
if(session!=null)
session.close();
}
}
//获取所有对象
@Test
public void testGetAll(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
//获取事务对象
tx = session.getTransaction();
//开启事务
tx.begin();
//查询所有
List<User> list = session.createCriteria(User.class).list();
for(User u:list){
System.out.println(u);
}
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx!=null)
tx.rollback();
}finally{
if(session!=null)
session.close();
}
}
//修改数据
@Test
public void testUpdate(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
//获取事务对象
tx = session.getTransaction();
//开启事务
tx.begin();
//获取对象 第一参数 是对象的类型 第二个参数是 主键值
//User u = (User)session.get(User.class, 2);
User u = (User)session.load(User.class, 2);
u.setAge(60);
//修改数据
session.update(u);
System.out.println(u);
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx!=null)
tx.rollback();
}finally{
if(session!=null)
session.close();
}
}
@Test
public void testDelete(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
//获取事务对象
tx = session.getTransaction();
//开启事务
tx.begin();
//获取对象 第一参数 是对象的类型 第二个参数是 主键值
//User u = (User)session.get(User.class, 2);
User u = (User)session.load(User.class, 2);
//删除对象
session.delete(u);
System.out.println(u);
tx.commit();
}catch(Exception e){
e.printStackTrace();
if(tx!=null)
tx.rollback();
}finally{
if(session!=null)
session.close();
}
}
}
五、hibernate 对象生命周期
5.1 对象生命周期图
5.2 对象的 3 种状态:
- 临时状态/瞬时状态:
该对象是新创建的;一个持久化状态的对象被删除;一个游离状态的数据被删除 - 持久化状态:
对象从数据库中查询出来时,临时状态的数据被保存时,游离状态的数据被更新/ 锁定 - 游离状态:
持久化状态的数据被(session)清理
5.3 对象生命周期一
@Test
public void testSession(){
Session session = null;
//瞬时状态
User u = new User("西毒",70);
try{
session = HibernateUtil.getSession();
session.beginTransaction()hibernate从零开始到各种映射