初学Hibernate学习1 基础知识掌握

来源:互联网 发布:吉他软件手机版 编辑:程序博客网 时间:2024/05/19 22:03

Hibernate 持久化
netbeans 国外开发用的比较多 java名字的来历,咖啡 (爪哇岛 猫屎咖啡) Oracal(橡树)
持久化:就是把数据保存到持久化设备。即永久可以保存的存储设备中(如磁盘)
Hibernate是DAO层,和数据库打交道
为什么要持久化?
内存不能持久化 内存容量有限 业务数据共享的需要 数据安全管理的需要 为了使用大规模的检索
怎样实现持久化?

1:对象序列化(不符合企业级的数据)
2:JDBC
3:ORM(对象关系序列化) ORM就是内存中的对象与数据库中的数据间的映射表(将sql语句进行封装 是一种解决问题的思路,一种解决方案)
ORM、JPA和Hibernate三者的关系:
ORM实现框架的特点:开源的,实现了JDBC的封装,实现了简单的API,轻量级解决方案,持久化对象是一个POJO类
JPA是用这种思想的具体实现的表现,用java语法实现的方法,提供相应的接口,但不是具体的实现
Hibernate是具体的实现者,当然还有其他的框架
Hibernate的工作原理:
SessionFactory是重量级的线程安全的,一般当做单例对象来使用,我们使用它一般不手工关闭,因为其他用户可能还会使用,它由应用程序结束时自动将其销毁,SessionFactory一般不进行close操作
Hibernate工作原理图
Session接口?
Session是轻量级的,是线程不安全的,使用多例,使用原则:一个线程一个session 每次都需要执行sessionFactory.openSession()
二者区别和联系:
事务在提交或者回滚时候会同时关闭session,getCurrentSession()增删改查都必须在事务内进行,而openSession()查询可以不再事务内完成
先获取事务在进行相应的操作 两种写法均可
//4:开启事务
session.getTransaction();
//session.getTransaction().begin();
//4:开启事务
session.beginTransaction();
//session.getTransaction().begin();

//是如何保证创建的是同一个session 底层是采用map实现的,其中特殊的是键值对,键是当前创建线程,值是当前session,所以才会能够实现使用同一个session

通过getCurrentSession实现的 必须在事务环境中进行,而通过sessionFactory实现的opensession的查询可以不再事务环境中进行,但是修改、删除、更新也必须在事务环境中进行
hibernate里面的属性increment 和identity的生成策略:
increment是hibernate自己在维护主键的值,当准备往数据库插入一条记录时候,先获取数据库里面最大的id号(后台会自己执行查询当前max(id)),然后在进行+ 1 操作作为插入记录的主键
identity是数据库自己来维护,每次插入id增 + 1
sequence生成策略:mysql默认不支持该策略 需要指定生成的下一条数据的id(至少从1 开始)
native生成策略 主键是mysql在维护主键 (以后开发是分布式数据库(多数据库 mysql orcal 可以根据不同数据库去选择native 或者identity))
assigned生成策略,由程序员手动进行生成(业务相关属性和 义务无关属性)
uuid生成策略:原理:通用唯一识别码 使用算法来生成一个字符串类型的主键值,该值使用IP地址、JVM的启动时间、当前系统时间和一个计数器值(在当前的JVM中唯一)经过计算产生,可以用于分布式的Hibernate应用中。
产生的标识符属性是一个32位长度的字符串,使用这种生成策略,必须保证属性的类型必须为String类型
缺点:占内存、 查询效率低
持久化对象状态管理:(前三种在微软官方文档中有描述)
瞬时态:transient状态,对象在内存中存在当DB中无记录,与session无关,是一个过度状态
持久态:persistent状态,在内存中存在DB中有记录,与session有关,在session中有相应的副本
游离态:detached状态,在内存中存在,在DB中有记录,与session无关
无名态:在内存中不存在,但是DB中有记录,与session无关
Hibernate是通过id来管理对象(堆内存) 执行了save之后就自动自动生成id,变成持久态 游离态有id,但是不再session里面注册,不归hibernate管理
四种状态转换图:主要区别是是否存在Session中,是否交由hibernate管理

普通内存与Session的对象其实是同一个对象 (瞬时态和持久态对象是同一个对象)

下面附上一个基本的Hibernate小程序
导入相应的jar包 一共22个 jar包 hibernate包和log4j同时还有junit的jar 包
链接:
图片jar:这里写图片描述
下面开始贴代码:
路径 实体类Student:com.vrv.yinkailong.bean.Student.java

package com.vrv.yinkailong.bean;public class Student {    //以后定义主键id必须是Integer    private Integer id;    private String name;    private int age;    private double score;    //c   o    public Student() {        super();    }    public Student(String name, int age, double score) {        super();        this.name = name;        this.age = age;        this.score = score;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public void setAge(int age) {        this.age = age;    }    public int getAge() {        return age;    }    public double getScore() {        return score;    }    public void setScore(double score) {        this.score = score;    }    @Override    public String toString() {        return "Student [id=" + id + ", name=" + name + ", age=" + age + ", score=" + score + "]";    }}

路径 映射文件 Student.hbm.xml:com/vrv/yinkailong/bean/Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">    <!-- 对所有的该包下的实体都可以做映射 -->    <hibernate-mapping package="com.vrv.yinkailong.bean">    <!-- 写映射文件  作用:    1:类到表的映射    2:属性到字段的映射     -->    <class name="Student" table="t_student">    <id name="id" column="tid">    <!-- 指定主键生成器 -->    <generator class="native"/>    </id>    <property name="name" column="tname"/>    <property name="age" column="tage"/>    <property name="score" column="tscore"/>    </class>    </hibernate-mapping>

路径 hibernate.cfg.xml Hibernate 配置文件:直接在src下即可 hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>    <!DOCTYPE hibernate-configuration PUBLIC    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">    <!-- session的不同含义   http:session (view层)   hibernate :session(DAO层)   MyBatis: session(SQL  session) -->    <!-- 三大数据库  Mysql  DB2 Oracal -->   <hibernate-configuration>                  <session-factory>                        <!-- DB链接四要素 -->                        <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>                        <property name="hibernate.connection.url">jdbc:mysql://localhost/test</property><!--  ///    相当于127.0.0.1:3306 -->                        <property name="hibernate.connection.username">root</property>                        <property name="hibernate.connection.password">123456</property>                      <!-- 需要指定方言,才能生成相应的sql 语句  去hibernate core 里面找相应的版本  -->                       <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>                       <!-- 数据源  数据库连接池   链接数据库的那个容器我们成为数据库连接池 决定啥时候创建链接   :一般是先建立好,然后用户需要使用的时候直接从数据库连接池获取-->                       <!--占用资源 :释放连接    连接个数  当达到下限需要再创建   然后释放之后需要设置最多放置多少条(上限)  空闲时间 :空闲多久会自动进行销毁   使用第三方机构的连接池-->                       <!-- 链接提供者 -->                        <property name="hibernate.co  nnection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>                          <!-- 保证在当前线程上下文中获取到的session是同一个session -->                        <property name="hibernate.current_session_context_class">thread</property>                        <!-- 配置自动建表   DDL数据库定义语言  DML数据库操作语言 DQL  数据源查询语言  create 每运行一次都会重新见一个表  update只会做更新 -->                        <property name="hibernate.hbm2ddl.auto">update</property>                        <!-- 调试常用  :显示SQL -->                         <property name="hibernate.show_sql">true</property>                         <!-- 生成sql语言进行格式化 -->                         <property name="hibernate.format_sql">true</property>                        <!-- 映射文件 -->                        <mapping resource="com/vrv/yinkailong/bean/Student.hbm.xml"/>                </session-factory>      </hibernate-configuration>

路径:测试类 MyTest.java com.vrv.yinkailong.test.MyTest

package com.vrv.yinkailong.test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;import com.vrv.yinkailong.bean.Student;public class MyTest {    //写一个测试方法    @   Test    public void testSave()    {        //1:加载主配置:        Configuration configure = new Configuration().configure();        //2:创建session工厂对象        SessionFactory sessionFactory = configure.buildSessionFactory();        //3:获取session对象        Session session = sessionFactory.getCurrentSession();           //是如何保证创建的是同一个session  底层是采用map实现的,其中特殊的是键值对,        //键是当前创建线程,值是当前session,所以才会能够实现使用同一个         //所有的增删改查都必须在事务下进行        try {            //4:开启事务            session.beginTransaction();            //session.getTransaction().begin();            //5:执行操作(保存)            Student student = new Student("张三",25,100);            session.save(student);            //6:执行事务            session.getTransaction().commit();        } catch (Exception e) {            //7:事务回滚            session.getTransaction().rollback();            e.printStackTrace();        }    }}

直接运行测试类即可
可以看到运行sql语句,也可以直接在数据库进行查看
今天学了一天的Hibernate这是其中一个小demo,后面在分享CRUD的完整demo!大家一起努力一起加油!!

原创粉丝点击