初学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操作
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小程序
导入相应的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(); } }}
直接运行测试类即可
今天学了一天的Hibernate这是其中一个小demo,后面在分享CRUD的完整demo!大家一起努力一起加油!!
- 初学Hibernate学习1 基础知识掌握
- 学习c#应该需要掌握的基础知识
- HTML基础知识:学习掌握HTML 标准属性
- 学习spring应掌握的Java基础知识
- 学习VoIP必须掌握的基础知识
- 学习JavaScript必须掌握的基础知识
- 学习JavaScript必须掌握的基础知识
- 学习php前需要掌握的基础知识
- 学习Swoole需要掌握哪些基础知识
- Hibernate学习笔记之基础知识
- 轻松掌握Hibernate读书笔记(1)
- php学习资源资料分享,从初学至掌握
- php学习资源资料分享-初学到掌握
- php学习资源资料分享-初学到掌握
- Hibernate基础知识(1)
- 掌握C++[初学]
- 初学WCF--最基础知识(1)
- 学习日语必须要掌握的日本文化基础知识14
- 杭电acm—1306 String Matching
- Redis学习笔记(三)Redis源码解读
- 进程间通信---Messenger
- hdu 2509 Be the Winner
- 多文本显示省略号
- 初学Hibernate学习1 基础知识掌握
- 1002. 写出这个数 (20)
- 【Linux】Netfilter的使用和实现
- Tensorflow学习笔记(1)-Helloworld
- java中堆栈内存分析(String)
- Poj 1383--Labyrinth【树的直径】【bfs】
- global var in head file
- java随机字符串
- python绘制决策树