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

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

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(这个纯属个人无聊才总结的...)

百度网盘可看

内容概要:本文提出一种基于融合鱼鹰搜索行为与柯西变异策略的改进麻雀优化算法(OCSSA),用于优化变分模态分解(VMD)的关键参数(如模态分量数K和惩罚因子α),以实现对滚动轴承振动信号的高效自适应分解,有效抑制模态混叠问题。经过OCSSA优化的VMD对原始信号进行预处理后,将分解得到的本征模态函数(IMF)重构为时频特征矩阵,作为卷积神经网络(CNN)的输入,以自动提取深层次的空间特征;随后,双向长短期记忆网络(BiLSTM)进一步挖掘特征序列中的前后向时序依赖关系,最终实现高精度的故障分类识别。该OCSSA-VMD-CNN-BiLSTM模型在西储大学公开轴承数据集上进行了充分验证,结果表明其在复杂噪声环境下对轴承不同故障类型与程度的诊断准确率显著优于传统方法,充分体现了智能优化算法与深度学习相结合在故障诊断领域的优越性能。; 适合人群:具备信号处理、机器学习及智能优化算法基础知识,从事机械装备状态监测、故障诊断、工业大数据分析等相关领域的科研人员、工程技术人员及高校研究生。; 使用场景及目标:①解决传统VMD参数依赖经验设定导致信号分解效果不稳定的问题;②提升强背景噪声和工况变化下滚动轴承早期微弱故障的检测灵敏度与分类准确率;③为智能制造和工业互联网背景下的关键设备智能运维与预测性维护提供一套可复现、高性能的技术解决方案。; 阅读建议:此资源以Matlab代码实现为核心,建议读者深入研读算法代码,重点理解OCSSA的寻优机制、VMD参数自适应选择过程以及CNN-BiLSTM的网络构建细节,通过复现完整实验流程,掌握从信号预处理、特征提取到智能分类的全流程关键技术,并尝试在自有数据集上进行迁移应用与性能对比。
源码链接: https://pan.quark.cn/s/a4b39357ea24 接口测试框架(基于json格式、http请求,python3,不兼容python2.x版本) 注:现在基于Excel文件管理测试用例基本实现,) 备注:大家在运行的时候,如果参数不需要key,只需要字典,可以在ddt_case.py和case.py改造parame,注释掉现在的parem,启用新的即可 依赖用例支持用例执行,在testCase的ddt_case.py有实现,逻辑在代码中有写,参数的格式{"name":"$case1=data"}即代表name的值是case1的data字段,简单的实现。 依赖用例是简单的实现,具体在业务上面还有很多复杂的要处理,知识实现了,部分的思路。 (目前在部分window上会出现FileNotFoundError [Errno 2] No such file or directory,这个bug是路径过长,解决方案为吧log日志放在当前目录,或者修改动态生成的文件的名字,给了第一种方式,测试日志放在当前目录) qq交流群:194704520 Alt text 使用的库 requests,绝大部分是基于Python原有的库进行的,这样简单方便, 使用脚本参数分离等思想,尽可能降低代码的耦合度。 如果你不配置钉钉机器人,注释到机器人相关的代码 首先我们来看下我们的目录 Alt text ### 1.Case文件夹用来存放我们的测试用例相关的, test_case用来存储我们的测试数据,Excel管理测试用例,yaml文件管理测试用例,后续要把yaml管理测试用例的也封装出来。 Interface对测试接口相关的封装,包括requests库,发送...
内容概要:本文档围绕“配电网两阶段鲁棒故障恢复研究”展开,提供了完整的Matlab代码实现方案,属于高水平期刊论文的复现资料。研究针对配电网在发生故障后的恢复问题,提出了一种两阶段鲁棒优化方法,有效应对系统中诸如负荷波动、分布式电源出力不确定性等多重不确定因素。第一阶段进行预决策,包括网络重构、关键设备投切等操作;第二阶段则根据实际发生的故障场景进行动态调整与恢复控制,确保系统在故障后仍能安全、稳定、可靠运行。该资源不仅包含可运行的Matlab代码,还隶属于一个涵盖电力系统优化、智能算法、路径规划、机器学习等多个技术方向的综合性科研服务体系。; 适合人群:具备电力系统分析基础、优化理论知识及Matlab编程能力的研究生、科研人员和工程技术人员,特别适用于从事智能电网、配电自动化、故障恢复策略、鲁棒优化等领域研究的专业人士。; 使用场景及目标:① 学习并复现顶刊关于配电网故障恢复的先进优化模型;② 掌握两阶段鲁棒优化在电力系统中的建模思路、求解流程与技术细节;③ 利用所提供的Matlab代码进行算法验证、仿真测试,并在此基础上开展扩展性科研工作,如改进模型、引入新约束或应用于其他系统。; 阅读建议:建议结合经典电力系统优化与鲁棒调度相关文献,深入理解两阶段鲁棒优化的数学建模原理与物理背景,通过实际运行和调试代码,观察不同参数设置对优化结果的影响,进而掌握算法的核心机制。同时可参考文档中提及的其他相关研究主题,拓展研究视野,推动科研创新。
打开链接下载源码: https://pan.quark.cn/s/2f24438f641d 海康机器人工业相机软件MVS用户手册 本文档作为海康机器人工业相机客户端MVS的操作指南,致力于引导用户正确地应用和设置海康机器人工业相机客户端MVS。文档中包含了产品的概述、环境设定、菜单说明、操作步骤等方面的内容。 1. 重要声明 海康机器人对本手册所拥有的全部权利予以保留,任何单位或个人在未获得书面许可的情况下,均不得以任何形式进行摘录、复制、翻译或修改本手册的任何部分。 2. 产品介绍 海康机器人工业相机客户端MVS是一款工业相机软件,其目的是提供高水准的图像采集和处理功能。该软件兼容多种工业相机型号,能够适应不同工业自动化场景的需求。 3. 符号约定 在本手册中,采用以下符号约定: *加粗*表示重要提示 _斜体*表示术语解释 [ ]代表选项或菜单项 4. 运行环境 海康机器人工业相机客户端MVS支持多种操作系统,涵盖Windows、Linux等系统。用户必须确保计算机的配置满足最低系统标准,以便软件能够顺利运行。 5. 主要特性 海康机器人工业相机客户端MVS具备以下核心特性: * 高品质的图像采集和处理 * 支持多种工业相机型号 * 灵活的图像处理方法 * 强大的图像分析及处理能力 6. 环境配置 在应用海康机器人 industrial相机客户端MVS之前,必须完成环境配置。环境配置包括网口相机环境设定、U3V相机环境设定以及Camera Link相机环境设定等。 7. 菜单介绍 海康机器人工业相机客户端MVS提供了多种菜单选项,如文件菜单、编辑菜单、查看菜单等。用户可以根据实际需求选择不同的菜单选项,从而更高效地使用本软件。 8....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值