Hibernate-note01

本文详细介绍了ORM(对象关系映射)概念及其在Java中的实现方式,着重阐述了Hibernate框架的使用流程,包括引入依赖、创建持久化类、映射文件、配置文件以及如何进行增删改查等操作,同时解释了持久化对象的生命周期和Hibernate的特性如延迟加载、单例模式等。


ORM:实现实体类对象到数据表的映射
1.ORM框架
JPA是一个规范,java持久化API。在这个规范下产生了很多框架,
由sun发布一个企业级开发组件EJB(企业级javaBean)的一部分,EJB--MessageBean ,JPA,
有状态无状态的一种bean


SUN JPA 规范
openjpa ,TopLink ,Hibernate


01.Hibernate--
02.mybatis----
03.OpenJPA----




hibernate隶属于一个组织JBoss,JBoss属于RedHat的一部分
JSR220和JSR317是java里的一些草案


3.POJO(持久化类)就是以前的实体类
pojo:Plain Ordinary Java Object(无格式的Java对象)
Hibernate对pojo的要求:
• 属性要有对应的get和set方法
• 要有无参数的默认构造方法(要是有有参数的,还要加上无参数的)
• 不要使用final进行修饰


2.步骤
01. 加入Hibernate的jar包和一个jdbc的jar包
02. 创建持久化类(pojo)
03. 创建映射文件(xxx.hbm.xml)
////作用就是让一个类和表映射起来(一般和pojo放在一个包中,放在一个取名叫.pojo的包中
eg:User.hbm.xml)


---找到hibernate-core-4.2.0final.jar → org.hibernate,
在这个包的最下面有一个hibernate/hibernate-mapping-3.0.dtd
找到
<!DOCTYPE hibernate-mapping PUBLIC 
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
   拷贝到user.hbm.xml中
04. 创建Hibernate配置文件(hibernate.cfg.xml)
---找到hibernate-core-4.2.0final。jar → org.hibernate,
在这个包的最下面有一个hibernate-configuration-3.0.dtd
找到
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
拷贝到hibernate.cfg.xml中

05. 运行




3.user.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.kaishengit.pojo">
<!--这里package若是写了,下面就class的name就不用写包名了 -->
<!--但是若是没写package属性,下面的就要写完全限定名-->


<class name="User" table="t_user"><!--类名和包名-->


<!--主键列<id>,只要name的都是类,column的是表的列的名  -->
<id name="id" column="id">
<!--数据库中要告诉主键的生成策略,主键比较特殊-->
<generator class="native"></generator>
</id>


<!--其他列用propertiy,当name和column值相等的时候,
  column="name"可以省略-->
<property name="name" column="name"></property>
<property name="age"></property>
</class>


</hibernate-mapping>




生成策略:native表示--主动增长
 uuid:--uuid
 序列:


4.创建Hibernate配置文件(hibernate.cfg.xml)
在etc中建一个(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">

<hibernate-configuration><!-- //根节点 -->
<session-factory>
<!-- //这个和web中session没有一点关系,凑巧名字一样了
//关于property,在hibernate-release-4.2.0.Final中 → project → etc → hibernate.properties
//在这个里面都是hibernate的配置项,在mysql中
-->
<!-- ## MySQL
#hibernate.dialect org.hibernate.dialect.MySQLDialect//方言表示自动识别,一般用这个
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect//方言 
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect//方言
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password -->




<!-- ///配置数据库连接 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_demo</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 方言,这个是表示不同的数据库,的设置不同-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 
#################################
### Hibernate Connection Pool ###
#################################
hibernate.connection.pool_size 1 
//在开发中一定不能用这句话,这个是效率很低的一个。所以我们可以用DBCP或者C3P0
//因为后来hibernate提示DBCP有未知的问题,不让用所以就用C3P0
###########################
### C3P0 Connection Pool###
###########################
#hibernate.c3p0.max_size 2
#hibernate.c3p0.min_size 2
#hibernate.c3p0.timeout 5000
#hibernate.c3p0.max_statements 100
#hibernate.c3p0.idle_test_period 3000
#hibernate.c3p0.acquire_increment 2
#hibernate.c3p0.validate false
-->

<!-- 数据连接池 -->
<property name="hibernate.c3p0.max_size">2</property>
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>

<!-- 其他配置,这里的都属于其他配置了-->
<!-- ##############################
### Miscellaneous Settings ###
##############################
## print all generated SQL to the console
#hibernate.show_sql true
//show_sql,就是在控制台打印出来一句sql语句
## format SQL in log and console

hibernate.format_sql true//这个就是让sql语句的每个单词输出在一行 -->


<property name="hibernate.show_sql">true</property>


<!--这个在dtd配置文件中没有的一个项,这个指的是把当前的配置项session放在一个thread线程中 -->
<property name="hibernate.current_session_context_class">thread</property>

<!-- 映射文件的配置,这里resource指的是磁盘的目录,所以是"/"不是"."-->
<mapping resource="com/kaishengit/pojo/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>


在这个里面数据库用了C3P0,就记得要导入C3P0的两个包,在hibernate-release-4.2.0.Final→lib→optical中,
还要导入jdbc的包


5.使用Hibernate
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;


import pojo.User;//建立一个实体类和映射文件中的对应,要有get/set


public class HibernateTest01 {
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();//不调用configure()的时候会报错
//这个是4.0以后加入的一个东西,4.0之前不用管
ServiceRegistry serviceRegistry= new
ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry(); 
SessionFactory factory=cfg.buildSessionFactory(serviceRegistry);
Session session=factory.getCurrentSession();
//
Transaction tran=session.beginTransaction();
//以后代码只能放在这里面,不放在事务范围之内会报错。
User user =new User();
user.setAge(23);
user.setName("jack");

session.save(user);
tran.commit();
}
}


6.提取,修改成单例模式,因为事务之前的部分,只需要一次
SessionFactory sessionFactory每用一次,都会建一个数据库连接池所以整成单例的


public class HibernateUtil {
private static SessionFactory sessionFactory = builderSessionFactory();


private static SessionFactory builderSessionFactory() {
Configuration cfg = new Configuration().configure();//不调用configure()的时候会报错
//这个是4.0以后加入的一个东西,4.0之前不用管
ServiceRegistry serviceRegistry= new
ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry(); 

return cfg.buildSessionFactory(serviceRegistry);
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
return getSessionFactory().getCurrentSession();
}


}


7.根据主键来查找对象
Hibernate: select user0_.id as id1_0_0_, user0_.name as name2_0_0_, user0_.age as age3_0_0_ from t_user user0_ where user0_.id=?


hibernate:冬眠。可以看到hibernate的查询语句,都会有很多的别名,是为了防止重复


Transaction tran=session.beginTransaction();
//以后代码只能放在这里面,不放在事务范围之内会报错。

//查找所有的对象,需要写hql,非常类似sql语句,
String hql="from User";
//这里面不需要写select和哪个列,只需要写from,后面跟类名,不是表名,因为hibernate操作的都是对象

Query query=session.createQuery(hql);//创建一个对象把hql传进去
List<User> userlist=query.list();//因为query.list()不是泛型集合所以有警告
for(User user:userlist){
System.out.println("id:"+user.getId());

}


/*//删除对象,在hibernate中都是以对象为操作,所以它和jdbc中删除是以主键不同。
//这个删除是以对象来删除,并且它需要先查找然后再删除
User user=(User) session.get(User.class, 4);
session.delete(user);
*/

/*//修改对象,先找到要修改的对象,02把对象的属性改一下即可,在提交的时候
//hibernate能感知到对象发生了变化,hibernate会直接同步
User user=(User) session.get(User.class, 3);
user.setAge(43);
user.setName("rose");*/

/*
//根据主键查询
User user=(User) session.get(User.class, 3);

System.out.println(user.getName());*/
//保存对象
/*User user =new User();
user.setAge(23);
user.setName("jack");

session.save(user);*/
tran.commit();


8.持久化对象的生命周期(持久化对象--就是这个pojo)
《已经学过的有生命周期的servlet,session,action,servlet.context,application。》


三个阶段:
瞬态(自由态):持久化对象的自由态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联。
          比如Student student =new Student(),这里的student对象就是一个自由态的持久化对象。
         eg://保存对象
User user =new User();
user.setAge(23);
user.setName("jack");
一个对象如果没有和任何的session的API进行关联,没有进行session的方法就是自由态。
自由态这些对象做的所有操作和hibernate没有关系,只不过在内存中而已
没有经过session保存,
一旦经过session后就是持久态。


持久态:
指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中
在session.save(user);这句话之后就进入了持久态


user.setName("kkkk");
这时候就执行了两条sql语句,insert和update


tran.commit();
一旦事务进行了提交或回滚后就进入到了游离态,假如提交后再执行下句
user.setName("pppp");


托管态(游离态):
处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态。也就是说Session实例
是持久态对象的宿主环境,一旦宿主环境失效,那么持久态对象进入游离状态。


9.三种状态的转化图(熟记)结婚论




10.延迟加载
//延迟加载/懒加载load,特点就是什么时候用,什么时候加载,必须要在session关闭前进行


• get和load方法都是利用对象的主键值获取相应的对象,并可以使对象处于持久状态。
• load方法获取对象时不会立即执行查询操作,而是在第一次使用对象是再去执行查询操作。如果查询的对象在数
据库中不存在,load方法返回值不会为null,在第一次使用时抛出org.hibernate.ObjectNotFoundException异
常。
• 使用get方法获取对象时会立即执行查询操作,并且对象在数据库中不存在时返回null值。
但是load有两个缺点:
load是延迟加载,但是它的缺点:
 01.关闭事务之后,再用它,会出现一个org.hibernate.LazyInitializationException
User user = (User) session.load(User.class, 3);
tran.commit();
System.out.println(user.getName());
 02.当load查询的不存在,就是说上面的id=3不存在,会报org.hibernate.ObjectNotFoundException


10.save和persist方法:
persist是jpa里面规定的一个方法,jpa中是没有save方法的但是其实都是保存


01.两个返回值类型不一样,persist是void
save是id的值


•save和persist方法都是将持久化对象保存到数据库中
• sava方法成功执行后,返回持久化对象的ID
• persist方法成功执行后,不会返回持久化对象的ID,persist方法是JPA中推荐使用的方法




11.save和update方法,看那个图-------9图
• save方法是将自由态的对象带入到持久态进行保存
• update方法是将游离态的对象带回到持久态进行保存


User user=(User) session.get(User.class, 3);//get进入持久态
tran.commit();
user.setAge(58);//游离态
Session session2=HibernateUtil.getSession();
session2.getTransaction();
//update之前都是游离态
session2.update(user);
//在commit之前update之后是持久态
session2.getTransaction().commit();




12.update和saveOrUpdate方法:
saveOrUpdate方法不仅能把自由态带到持久态,也能把游离态带到持久态
• 如果一个对象是游离态或持久态,对其执行update方法后会将对象的修改同步到数据库中,如果该对象是自由态,
则执行update方法是没有作用的
• 在执行saveOrUpdate方法时该方法会自动判断对象的状态,如果为自由态则执行save操作,如果为游离态或持
久态则执行update操作


这个就是不管你是自由态还是游离态都让你自己去判断。
Transaction tran = session.beginTransaction();
// 以后代码只能放在这里面,不放在事务范围之内会报错。

User user = new User();
user.setName("jijin");//自由态
session.saveOrUpdate(user);//save,insert
tran.commit();
user.setName("nihaoa");//游离态
Session session2 = HibernateUtil.getSession();
session2.beginTransaction();

session2.saveOrUpdate(user);//update


session2.getTransaction().commit();


13.update和merge方法
merge方法没有出现在图上,它和saveOrUpdate的作用是一样的,但他不改变对象的状态
 •如果持久化对象在数据库中存在,使用merge操作时进行同步操作。如果对象在数据库不存在,merge对象则进
   行保存操作
 • 如果对象是游离状态,经过update操作后,对象转换为持久态。但是经过merge操作后,对象状态依然是游离态

User user = new User();
user.setName("jijin");//自由态
session.merge(user);//save,insert
tran.commit();
user.setName("nihaoa");//自由态
Session session2 = HibernateUtil.getSession();
session2.beginTransaction();

session2.merge(user);//save,insert


session2.getTransaction().commit();
console:
这个就执行的是两个insert
Hibernate: insert into t_user (name, age) values (?, ?)
Hibernate: insert into t_user (name, age) values (?, ?)




User user = new User();
user.setName("jijin");//自由态
session.save(user);持久态
tran.commit();
user.setName("nihaoa");//游离态
Session session2 = HibernateUtil.getSession();
session2.beginTransaction();

session2.merge(user);//update


session2.getTransaction().commit();
//
console:
Hibernate: insert into t_user (name, age) values (?, ?)
Hibernate: select user0_.id as id1_0_0_, user0_.name as name2_0_0_, 
            user0_.age as age3_0_0_ from t_user user0_ where user0_.id=?
Hibernate: update t_user set name=?, age=? where id=?


//因为merge不管状态,当一个对象有id的时候,所以他会判断一下,他会根据id去找一下,
//他能找到,所以会认为它是游离态,所以执行update


14.saveOrUpdate和merge方法
saveOrUpdate方法和merge方法的区别在于如果session中存在两个主键值相同的对象,进行saveOrUpdate操作
时会有异常抛出。这时必须使用merge进行操作。
session.beginTransaction();
User user=new User();
user.setId(120);//这个就是错误的
user.setUserName("aaaaaaaa");
user.setUserPwd("123123");
User user2=(User)session.get(User.class,120);
session.saveOrUpdate(user);//ERROR,这个时候,在一个session空间中有两个id=120的
//值,用saveOrUpdate,会报错。但是用merge时候就可以通过
session.getTransaction().commit();


15.clear方法和flush方法
clear方法是将Session中对象全部清除,当前在Session中的对象由持久态转换为游离态。flush方法则是将持久态对
象的更改同步到数据库中。
  01.clear:
User user = (User) session.load(User.class, 3);
session.clear();
user.setAge(56);
tran.commit();


这个就是clear之后,user进入游离态。
但是只有持久态的对象,发生变化,才会被同步到数据库中,所以只会执行一个select不会执行update


  02.flush方法和状态没有关系
User user = (User) session.load(User.class, 3);
user.setName("jijin");
session.flush();


tran.commit();
若是没有flush()执行的时候会是先执行一个select,然后执行改变,只有在commit之后,
才会执行一个update
但是有了flush,就会flush执行之后就立即同步到数据库。




note:只有持久态的对象,发生变化,才会被同步到数据库中










































标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值