吹牛的资本之Hibernate框架,五分钟搞定Hibernate...

本文详细介绍了Hibernate框架,从基本概念到实战应用,包括Hibernate的定义、相关知识点、常用网址、学习框架的步骤、开发过程、依赖库、配置文件、对象状态、表间关系以及常见错误解析。通过本文,读者可以快速掌握Hibernate并提升Java编程技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hibernate框架:

(ps:有标记“百度网盘可看”的地方可在网盘中下载配有注释的原代码)
现在努力的敲代码,是为了以后可以选择敲不敲代码!
百度网盘:http://pan.baidu.com/s/1bpCij51

     1、什么是Hibernate?

Hibernate是一个开放源代码的对象关系映射(ORM)框架,是JPA(Java持久层API)的一个实现类
它对JDBC(Java数据库连接)进行了非常轻量级的对象封装,它将POJO(基本的JavaBean)与数据库表建立映射关系,
是一个全自动的ORM框架,Hibernate可以自动生成SQL语句,自动执行,
使得Java程序员对数据的操作更加简单快捷!
(当然你可以用JDBC实现数据库的操作,因为你可以自己优化封装所有的方法以及数据库操作,使得效率更快;
But,由于现在的项目更加注重开发周期以及开发效率,所以Hibernate框架的调调就体现了价值...)

2、从Hibernate延伸到的知识点:

A)ORM框架的实现方式:XML映射文件,注解(推荐)
B)实现JPA的常见框架:Hibernate、EclipseLink、OpenJPA
C)常见的云服务:LeanCloud、七牛、BMOB
D)Java中有没有内存泄露:理论上是不存在的,因为有垃圾回收机制;
But,但是当数据对象存在缓存中未被使用时,其实就是相当于另一种方式的内存泄露,
因为它占有了内存可是却没有使用(占着茅坑不拉屎)。
E)三层架构的设计理念:
持久层的设计理念:Dao=data accessor + active domain object
业务层的设计理念:事务脚本模式(事务的边界是在业务层进行的)
表示层的架构理念:MVC架构模式通过控制器(C)实现模型(M)和视图(V)的解耦合
F)类与类之间的关系:继承(is a)、关联(has a)、依赖(use a)
伪代码如下:Person 与 Student 继承
Studnet 与 Car 弱关联
Car 与 Engine强关联
Studnet 与 House依赖
Studnet 与 Money依赖
	class Person{}
	class Student extends Person{
		private Car car;
		public void buy(House house){}
		public Money work(){}
	}
	class Car{
		private Engine engine;
	}
G)Java中的时间数据类型:Date(日期)、Calendar(日历)、LocalDate(年月日)、LocalTime(时分秒)、              LocalDateTime(年月日时分秒)(三个Java8后提供的日期类型)
获取系统当前时间:new Date()、LocalDateTime.now()
前一天:LocalDateTime.now().minusDays(1);
两天后:LocalDateTime.now().plusDays(2);
H)Java世界的自动构建工具:(从创建项目-编译-测试-打包-部署)
Ant + Ivy
Maven
Gradle
I)Hibernate创建表的两种方向:(一般情况都是反向工程建表)
反向工程:在编写代码之前就已经拿到了表结构,通过表结构来设计相应的POJO。
正向工程:第一种,通过POJO中的注解加上一定量的注解属性来完成表创建;
第二种,通过编写一个类实现“模式导出”来创建表结构!

3、常用的一些网址:

Maven中心仓库:https://mvnrepository.com/

阿里云仓库:http://maven.aliyun.com/nexus

Git工具:https://git.oschina.net/

apache官网:http://apache.org/

4、学习Java框架的基本套路

添加依赖库(pom.xml)
写主配置文件(hibernate.hbm.xml)
加载配置文件(映射文件、JavaBean的注解)
使用框架提供的API进行业务操作...

5、Hibernate开发的基本步骤:

导入jar包
创建数据库和表(方向工程)/模式导出表(正向工程)(抽取业务实体)
编写主配置文件
编写映射文件/新建Java Bean写注解
撸代码,测试...

6、依赖库— —主要依赖jar包

	<dependencies>
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>
上面的代码是添加核心依赖包的格式,下面的代码是给出了一些常用的核心依赖包
		    <artifactId>javax.servlet.jsp-api</artifactId>
			<version>2.3.1</version>

			<artifactId>jstl</artifactId>
			<version>1.2</version>

			<artifactId>hibernate-core</artifactId>
			<version>5.2.10.Final</version>

			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>

			<artifactId>junit</artifactId>
			<version>4.12</version>

7、主配置文件— —主要配置参数

可以参照hibernate-release-5.2.10.Final中给出官方模板来写...(百度网盘可看
具体参考文件路径:
"hibernate-release-5.2.10.Final\documentation\quickstart\html_single\basic\src\test\resources"
解压“hibernate-release-5.2.10.Final\documentation\quickstart\html_single”中的“hibernate-tutorials.zip”
<?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">
<hibernate-configuration>
    <session-factory>
        <!-- 数据库连接属性 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <!-- &要使用&amp;来表示,毕竟是特俗字符嘛... -->
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=utf8</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

        <!-- SQL方言  -->
        <!-- 如果使用Mysql5.7及以上版本配置MySQL57Dialect -->
        <!-- 如果使用Mysql5.7以下版本配置MySQL5InnoDBDialect -->
        <!-- 如果使用Hibernate5.2.9以前版本配置MySQLDialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <!-- 设置回话和thread(当前线程)进行绑定,使用getCurrentSession()方法是必须配的参数 -->
        <!-- 每个线程都持有自己的资源,不影响并发,不会因为竞争资源影响并发 -->
        <!-- 不会重复创建Session造成资源的浪费以及无法开启事务环境(相当于TreadLocal的作用,线程工具类) -->
        <property name="current_session_context_class">thread</property>

        <!-- 显示并格式化sql语句(在上线版本中要去掉两个配置) -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>

        <!-- 自动生成表结构(hibernate对应的数据库变更策略),一般不建议使用 -->
       <!--  <property name="hbm2ddl.auto">update</property> -->

	<!-- 使用注解的类,全限定名 -->
        <mapping class="com.wq.hibernate02.domain.User"/>
    </session-factory>
</hibernate-configuration>

8、普通Hibernate项目...(百度网盘可看

9、Maven管理Hibernate项目(普通java项目)...(百度网盘可看

10、五分钟完成的Hibernate项目中,易错代码解析:

A)在主配置文件中声明连接的具体的数据库url时,声明编码集,以免发生编码不同而乱码
        <property name="connection.url">
      	  jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=utf8
        </property>
B)在使用方言的时候一定要注意版本,因为如果方言不对是不会报错的,它会产生SQL语句,但是却不会执行!
        <!-- SQL方言  -->
        <!-- 如果使用Mysql5.7及以上版本配置MySQL57Dialect -->
        <!-- 如果使用Mysql5.7以下版本配置MySQL5InnoDBDialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
C)在获取Session对象的时候,如果使用getCurrentSession()方法,则必须要声明如下配置
        <!-- 设置回话和thread(当前线程)进行绑定 -->
        <property name="current_session_context_class">thread</property>
D)在测试阶段我们会格式化显示SQL语句,以便我们维护
        <!-- 显示并格式化sql语句(在上线版本中要去掉两个配置,配置成false或者删除配置) -->
        	<property name="show_sql">true</property>
       		<property name="format_sql">true</property>
E)自动生成表结构这个配置有点恶心,在此奉劝读者不要配;因为每次加载配置文件后数据就清空了...
        <!-- hibernate对应的数据库变更策略 
        	create:  每次启动应用的时候  先删除所有的表,再创建一遍
        	create-drop: 应用结束的时候,删除所有的表
        	udpate: 根据当前的对象配置和数据库对比,
        	validate: 提醒用户数据库表的差异 -->
        <!-- 自动生成表结构(hibernate对应的数据库变更策略) -->
        	<property name="hbm2ddl.auto">update</property>
F)在主配置文件中声明映射文件的路径...
		<!-- 使用注解的类 -->
       			 <mapping class="com.qf.domain.User"/>
		<!-- 使用映射文件的方式,一般命名就是"类名.hbm.xml" -->
       			 <mapping resource="model/hbm/User.hbm.xml"/>






    

G)常用注解关键字:

@Entity:表示POJO与表进行了关联(声明该类与数据库的表进行关联)
@Table(name="tb_user"):进一步说明与该类关联的表的名字叫"tb_user"
@Id:声明该属性是主键
@Column(name="user_id"):说明该属性在表中的字段名为"user_id"(当然还有其他属性,只是因为该属性最常用;其他如length,unique等属性一般用在正向工程中)
@ManyToOne(Cascade={CascadeType.PERSIST,CascadeType.DELETE},fetch=FetchType.EAGER):这里会声明表与表之间的关系,“一对一”/“一对多”/“多对多”。
Cascade属性表示:级联(对当前对象做什么操作的时候将其关联的对象做相同操作,以上为persist和delete操作时,对其相关联的对象进行相同操作!!)
Fetch属性表示:加载(EAGER表示迫切加载(一开始的时候就先记载到一级缓存中),LAZY表示延迟加载(调用其关联对象的时候才加载);“多对一”时默认迫切加载,“一对多”时默认延迟加载)
@OneToMany(mappedBy="department")
private Set<Employee> employee = new HashSet<>();
:上面的两行代码表示Employee类与Department类建立双向“一对多”连接,并且表之间的关系交给Employee类的department属性(多的一方来维护)来维护,这里的“mappedBy”属性是声明以上信息的关键属性
@JoinColumn:这个属性只用在表与表建立外键关联的时候才会用(通常是在@ManyToOne属性后使用)
@GeneratedValue:主键生成策略。有如下两种常见方式:
一:@GeneratedValue(strategy=GenerationType.IDENTITY)
二:@GeneratedValue(generator="other")
@GenericGenerator(name="other",strategy="uuid")
@Transient:表示该属性不会与表产生关联,也就是说该属性为临时属性,不会存储到数据库的表中
H)映射XML文件(百度网盘可看):已逐渐被注解的方式取代,所以具体的不再说明,想了解可以在代码中看,我在代码中备注了相应注释!
I)持久化类的要求(POJO的要求)
必须要有无参构造器
标志属性,尽量使用包装类来修饰属性类型
必须要写修改器和访问器(getter和setter)
不能定义成final类,否则无法通过继承的方式生成虚拟代理(load()方法会失败)

11、Hibernate对象三种状态(装波yi必备技能)

瞬时态|临时态:没有与Hibernate产生关联(没有存在Session中)、与数据库的记录没有产生关联(与数据库中的@Id项没有对应)
持久态:与Session有关联、对象有与数据库配对的@Id项(就是对象与@Id配对的属性是有具体的值,如department.setId(1001);)
游离态|托管态:没有与Hibernate产生关联、对象有与数据库配对的@Id项
特性:持久态的对象,会自动将对象的变化同步到数据库中
A. 瞬时态到持久态 :save / persist / saveOrUpdate
B. get / load:直接到持久态(请注意二者的区别) 
C. 游离态到持久态 :update / saveOrUpdate
D. 持久态到瞬时态:delete(删除态) 
E. 持久态到游离态:evict / clear /close
F. 瞬时态到游离态:setId(设置Id属性的值)
G.游离态到瞬时态:手动删除Id属性的值,设置成默认值

12、Hibernate中表与表之间的关系:(百度网盘可看)

表数量划分:
一对一:@OneToOne(用的只有这么少了,所以不多介绍了,想了解可以下载代码自己阅读,也有相应注释)
一对多:@OneToMany(一般情况下不会使用,而是使用多对一来替换它!)
多对一:@ManyToOne(重中之重!)
多对多:@ManyToMany(只能通过中间表才能实现多对多的关联)(常用手段:换成两个“多对一”关系来维护)
表方向划分:
单向关联:一般情况使用单向
双向关联:除非业务上有要求词会做双向关联
键划分:
主键关联:一般不用,因为我们一般会设置与业务无关的一个ID属性作为主键...
外键关联:就用这个!!!!

13、功能毫无二致,实现泾渭分明:(功能都能实现,但是实现其的本质差别很大!)

A)get()和load()
B)save()和persist()
C)update()和saveOrUpdate()
D)createQuery()和createCriteria()
E)openSession()和getCurrentSession()
F)delete()和evict()

14、提升自身对java的认知和能力:

A)企业工作流程的开发模型:迭代式开发、瀑布式开发
B)Junit单元测试:断言(Assert:org.junit.Assert),要习惯写单元测试,而不要全部写完再来测试!
C)数据库的CRUD:增删改查
D)sao操作之一:区域选择模式:Alt+shift+A
E)sao操作之二:删除import没有用的包:Source > clean up
F)EJB:Sun公司官方提供的一个很XXX的企业级开发服务器端组建模型...
G)见名知意:foo-fuck up
H)在程序员的世界里,肯定是先有蛋再有鸡(因为蛋是抽象接口,而鸡是其的具体实现类)
I  )尽量在javaBean中用包装类来定义属性类型!
J)在java程序中符号常量(enum)要优于字面常量(String)
K)java程序中implement类总是会先写接口再实现,是为了层与层之间实现松耦合
L)Hibernate最好的设计思想:长会话,短事务!

15、Hibernate常见的Bug(这个纯属个人无聊才总结的...)

百度网盘可看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值