Hibernate框架(初级)
Hibernate框架什么是Hibernate下载Hibernate的开发环境创建JAVAEE项目搭建Hibernate环境导入jar包创建项目总结映射的配置总结核心配置总结测试时需要的几个对象持久化类什么是持久化类持久化类的编写规则主键生成策略主键的分类自然主键代理主键实际开发Hibernate的主键生成策略持久化类的三种状态瞬时态持久态脱管态区分三种状态对象持久态的重要特点Hibernate的缓存什么是缓存Hibernate的一级缓存Query的简单使用CriteriaSQLQuery什么是HibernateHibernate是一个持久层的ORM对象关系映射框架。下载Hibernate的开发环境Hibernate5.0.7开发环境下载链接documentationHibernate开发文档libHibernate开发包requiredHibernate开发的必须依赖包optionalHibernate开发的可选jar包projectHibernate测试项目创建JAVAEE项目搭建Hibernate环境导入jar包数据库驱动包mysql-connector-java-6.0.6.jarHibernate开发必须的jar包引入日志记录包创建项目创建表创建实体类对应表格创建类与表的映射配置实体类名.hbm.xml建立类与表之间的映射主键对应和普通属性的对应?xml version1.0 encodingUTF-8 ?!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//EN http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtdhibernate-mapping!--建立类与表的映射--classnamecom.hibernate.pojo.Customertablecst_customer!--建立类中的属性与表中的主键对应--idnamecust_idcolumncust_idgeneratorclassnative//id!--建立类中普通的属性和表的字段的对应--propertynamecust_sourcecolumncust_source/propertypropertynamecust_industrycolumncust_industry/propertypropertynamecust_levelcolumncust_level/propertypropertynamecust_mobilecolumncust_mobile/propertypropertynamecust_namecolumncust_name/propertypropertynamecust_phonecolumncust_phone/property/class/hibernate-mapping映射约束从导入的jar包hibernate-core-5.0.7.Final.jar!\org\hibernate\hibernate-mapping-3.0.dtd中复制创建Hibernate的核心配置文件hibernate.cfg.xml配置数据库连接参数配置打印sql语句配置hibernate的方言配置映射文件?xml version1.0 encodingUTF-8 ?!DOCTYPE hibernate-configuration PUBLIC -//Hibernate/Hibernate Configuration DTD 3.0//EN http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtdhibernate-configurationsession-factory!--连接数据库的基本参数--propertynamehibernate.connection.driver_classcom.mysql.cj.jdbc.Driver/propertypropertynamehibernate.connection.urljdbc:mysql://localhost:3306/hibernate_day01?serverTimezoneAsia/Shanghaiamp;characterEncodingUTF-8/propertypropertynamehibernate.connection.usernameroot/propertypropertynamehibernate.connection.passwordcqrjxk39/property!--打印sql--propertynamehibernate.show_sqltrue/property!--格式化sql--propertynamehibernate.format_sqltrue/property!--配置hibernate的方言--propertynamehibernate.dialectorg.hibernate.dialect.MySQLDialect/propertymappingresourcecom/hibernate/pojo/Customer.hbm.xml/mapping/session-factory/hibernate-configuration测试加载Hibernate核心配置文件创建SessionFactory对象类似JDBC连接池通过SessionFactory获取session对象类似JDBC中的Connection开启事务编写代码事务提交资源释放publicvoidtest1(){//1. 加载Hibernate核心配置文件Configuration configurenewConfiguration().configure();//2. 创建SessionFactory对象类似于JDBC连接池SessionFactory sessionFactoryconfigure.buildSessionFactory();//3. 通过SessionFactory获取Session对象类似JDBC中的ConnectionSession sessionsessionFactory.openSession();//4. 开启事务Transaction transactionsession.beginTransaction();//5. 编写代码Customer customernewCustomer();customer.setCust_name(张三);session.save(customer);//6. 事务提交transaction.commit();//7. 资源释放session.close();}总结映射的配置class标签的配置标签用来建立类与表的映射关系属性name 类的全路径table 表名(类名与表名一致table可以省略)catalog 数据库名id标签的配置标签用来建立类中的属性与表中主键的对应关系属性name类中的属性名column表中的字段名(类中的属性名与表名一致colume可以省略)length长度property标签的配置标签用来建立类中的属性与表中普通字段的对应关系属性name类中的属性名column表中的字段名length长度not-null设置非空unique设置唯一注意Hibernate是可以根据映射关系自动创建表的只需要在Hibernate的核心配置文件hibernate.cfg.xml中配置如下语句即可propertynamehibernate.hbm2ddl.autoupdate/property总结核心配置必须配置连接数据库的基本参数驱动类ul路径用户名密码方言可选配置显示SQLhibernate.show_sql格式化SQLhibernate.format_sql自动建表hibernate.hbm2ddl.autonone不使用hibernate的自动建表create如果数据库中已经有表删除原有表重新建表(测试使用)create-drop如果数据库中已经有表删除原有表重新建表表格使用完后删除该表(测试使用)update如果数据库中有表使用原有表如果数据库中没有表则创建表可以更新表结构validate如果没有表不会创建表只会使用数据库中原有的表(会自动校验映射与表结构不匹配会报错)映射文件的引入通过mapping标签引入映射文件的位置总结测试时需要的几个对象Hibernate的核心配置文件既可以使用属性文件进行配置也可以使用xml文件进行配置但是属性文件配置时不能引入映射文件需要手动加载映射文件。Configuration作用加载核心配置文件hibernate.propertiesConfiguration cfg new Configuration();加载映射配置文件cfg.addResource(com/hibernate/pojo/Customer.hbm.xml);hibernate.cfg.xmlConfiguration cfg new Configuration().configure();SessionFactory作用维护了Hibernate的连接池线程安全的一个项目只需要创建一个即可所以一般将其抽取为Hibernate的工具类Hibernate的工具类importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.cfg.Configuration;publicclassHibernateUtil{privatestaticfinalConfiguration cfg;privatestaticfinalSessionFactory sf;static{cfgnewConfiguration().configure();sfcfg.buildSessionFactory();}publicstaticSessiongetSession(){returnsf.openSession();}}SessionHibernate与数据库的连接对象是Hibernate与数据库交互的桥梁线程不安全所以不能定义为全局变量只能定义为局部变量Session中常用的方法保存方法返回Serializable类型的主键Serializable save(Object obj)查询方法T get(Class clazz,Serializable id)T load(Class clazz,Serializable id)get和load的区别get采用的是立即加载当执行get方法时立即发送SQL语句load采用的是懒加载当执行load方法时不会发送SQL语句而是在使用其查询对象的时候才会发送SQLget方法返回的是真实对象本身load返回的是代理对象利用javassit.jar产生的代理get方法查询时数据库中找不到时会返回空load会抛出异常ObjectNotFoundException修改方法(推荐使用先查询再修改)void update(Object obj)删除方法(推荐使用先查询再删除)--级联删除void delete(Object obj)保存或更新(不常用)void saveOrUpdate(Object obj)查询所有Query query session.createQuery(from 类名);List类名 list query.list();SQLQuery query session.createSQLQuery(select * from 表名);List数组类型 list query.list();例如//根据id查询Customer customersession.get(Customer.class,1L);System.out.println(customer);Customer customer1session.load(Customer.class,1L);System.out.println(customer1);//修改Customer customersession.get(Customer.class,1L);session.update(customer);//删除Customer customersession.get(Customer.class,1L);session.delete(customer);//查询所有Query querysession.createQuery(from Customer);ListCustomerlistquery.list();SQLQuery sqlQuerysession.createSQLQuery(select * from cst_customer);ListObject[]list1sqlQuery.list();持久化类什么是持久化类持久化将内存中的一个对象持久化到数据库中的过程持久化类一个Java对象与数据库的表建立了映射关系那么这个类就称为持久化类持久化类的编写规则必须提供一个无参构造方法因为Hibernate底层需要使用反射生成实例属性需要私有并提供公有的get和set方法对持久化类提供一个唯一的标识OID与数据库的主键相对应持久类的属性尽量使用引用类型因为引用类型默认值是null持久化类尽量不要使用final修饰因为Hibernate有一个懒加载的优化手段返回的时代里对象代理对象是继承这个类进行代理的主键生成策略主键的分类自然主键自然主键指的是主键本身是表中的一个字段例如创建一个人员表人员都会有一个身份证号唯一不重复使用身份证号作为主键这种主键称为自然主键代理主键代理主键指的是主键本身不是表中必须要有的字段例如创建一个人员表给每一个人编一个号pno唯一不重复使用编号作为主键这种主键称为代理主键实际开发实际开发中尽量使用代理主键一旦主键参与到业务逻辑中去后期有可能要修改源代码好的程序应该满足ocp原则对程序扩展是open的对修改源代码是close的Hibernate的主键生成策略在实际开发中一般允许用户手动设置主键一般将主键交给数据库手动编写程序进行设置。在Hibernate中为了减少编程提供了多种主键生成策略。increment Hibernate中提供的增长机制适用于shortintlong类型的主键在单线程中使用identity适用于Intshortlong类型的主键使用的是数据库底层的自动增长机制适用于有自动增长机制的数据库MySQLoracle不支持sequence适用于shortintlong类型的主键采用的是序列的方式Oracle支持序列MySQL不支持uuid使用于字符串类型的主键使用Hibernate中的随机方式自动生成字符串主键native本地策略可以在identity和sequence之间自动切换assignedHibernate放弃主键管理需要自己手动编写程序例如idnamecust_idcolumncust_idgeneratorclassnative//id持久化类的三种状态瞬时态这种对象没有唯一的标识OID没有被session管理持久态这种对象有唯一标识OID被session管理脱管态这种对象有唯一标识OID没有被session管理区分三种状态对象例如publicvoidtest1(){Session sessionHibernateUtil.getSession();Transaction transactionsession.beginTransaction();Customer customernewCustomer();//瞬时态对象customer.setCust_name(李四);Serializable idsession.save(customer);Customer customer1session.get(Customer.class,id);//持久态transaction.commit();session.close();System.out.println(客户名称customer.getCust_name());//脱管态对象}瞬时态对象获得Customer cutomer new Customer();状态转换瞬时 → 持久save(Object obj);saveOrUpdate(Object obj);瞬时 → 脱管customer.setCust_id(1L);持久态对象获得get();load();find();iterate();状态转换持久 → 瞬时delete();持久 → 脱管close();clear();evict(Object obj);脱管态对象获得Customer customer() new Customer(); customer.setCust_id(1L);状态转换脱管 → 持久update();saveIrUpdate();脱管 → 瞬时customer.setCust_id(null);持久态的重要特点持久态可以自动更新数据库由Hibernate的一级缓存实现例如publicvoidtest1(){Session sessionHibernateUtil.getSession();Transaction transactionsession.beginTransaction();Customer customersession.get(Customer.class,6L);customer.setCust_name(王五);transaction.commit();session.close();}上面的程序并有使用update方法但是因为customer是持久态对象所以也会更新数据库的内容为王五Hibernate的缓存什么是缓存缓存是一种优化机制可以将数据存入内存中使用时直接从缓存中获取不用通过存储源Hibernate的一级缓存Hibernate的一级缓存又称session级别的缓存一级缓存的生命周期与session一致一级缓存是Hibernate自带的不可卸载的。特点当应用程序调用session接口的save()update()saveOrUpdate()时如果session缓存中没有相应的对象Hibernate会自动从数据库中查询相应的对象信息到一级缓存中当应用程序调用session接口的load()get()方法以及query接口的list()iterator()方法时会判断缓存中是否存在该对象有则返回没有就会查询数据库并将其添加到一级缓存中当应用程序调用session的close()方法时session缓存会被清空例如publicvoidtest1(){Session sessionHibernateUtil.getSession();Transaction transactionsession.beginTransaction();Customer customersession.get(Customer.class,6L);Customer customer1session.get(Customer.class,6L);System.out.println(customercustomer1);transaction.commit();session.close();}运行结果通过控制台打印的数据我们可以发现程序的两次查询只发送了一次sql语句并且查询得到的对象是一个对象证明Hibernate是有一级缓存的Query的简单使用query接口用于接收HQL查询多个对象查询所有String hqlfrom Customer;Query querysession.createQuery(hql);ListCustomerlistquery.list();for(Customer customer:list){System.out.println(customer);}查询某些带条件查询String hqlfrom Customer where cust_name like ?;Query querysession.createQuery(hql);//从0开始query.setParameter(0,王%);ListCustomerlistquery.list();for(Customer customer:list){System.out.println(customer);}分页查询String hqlfrom Customer;Query querysession.createQuery(hql);//设置起始页query.setFirstResult(0);//设置每页的记录数query.setMaxResults(3);ListCustomerlistquery.list();for(Customer customer:list){System.out.println(customer);}Criteria更加面向对象的查询完全看不到查询语句查询所有Criteria criteriasession.createCriteria(Customer.class);ListCustomerlistcriteria.list();for(Customer customer:list){System.out.println(customer);}查询某些Criteria criteriasession.createCriteria(Customer.class);criteria.add(Restrictions.like(cust_name,王%));ListCustomerlistcriteria.list();for(Customer customer:list){System.out.println(customer);}分页查询Criteria criteriasession.createCriteria(Customer.class);criteria.setFirstResult(0);criteria.setMaxResults(3);ListCustomerlistcriteria.list();for(Customer customer:list){System.out.println(customer);}SQLQuerySQLQuery用于接收sql语句特别复杂的请况下使用。

相关新闻

在一个游戏中,tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。 第i个士兵的战力为v[i],团的战力是团内所有士兵的战力之和。 但是这些士兵有特殊的要求:如果选了第i个士兵,这个

在一个游戏中,tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。 第i个士兵的战力为v[i],团的战力是团内所有士兵的战力之和。 但是这些士兵有特殊的要求:如果选了第i个士兵,这个

链接:https://ac.nowcoder.com/acm/contest/1080/C 来源:牛客网 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 524288K,其他语言1048576K 64bit IO Format: %lld 题目描述 在一个游戏中,tokitsuk…

2026/7/28 15:37:37阅读更多 →
突破性WeMod增强方案:WandEnhancer全面实战指南

突破性WeMod增强方案:WandEnhancer全面实战指南

突破性WeMod增强方案:WandEnhancer全面实战指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 在游戏辅助工具领域,WeMod以…

2026/7/28 15:37:37阅读更多 →
测试工具的使用

测试工具的使用

测试工具utf,loadrunner原理 loadrunner工具:是一种适用于许多软件体系构架的自动负载测试工具,从用户关注的响应时间、吞吐量,并发用户和性能计数器等方面来衡量系统的性能表现,辅助用户进行系统性能的优化。 原理&am…

2026/7/28 15:37:37阅读更多 →
AI Agent Skill 工程化 10:Skill 治理——Owner、清单、发布与季度复盘

AI Agent Skill 工程化 10:Skill 治理——Owner、清单、发布与季度复盘

Skill 一多,新问题就不是「怎么改」,而是「谁有权改、改坏了找谁」,尤其团队的Skill管理尤其重要 。这篇文章讲治理。工具很少,规矩很多——而且这些规矩,你们仓库里其实已经有一半雏形了。前言一句话:让 S…

2026/7/28 16:49:53阅读更多 →
小安派工:智慧工地车辆道闸弱电工程,工地进出车辆管理布线要点

小安派工:智慧工地车辆道闸弱电工程,工地进出车辆管理布线要点

一、工地车辆道闸弱电施工环境难点工地出入口属于车流密集区域,渣土车、工程货车通行频次高,路面长期承受重压,伴随扬尘、雨水冲刷、车辆震动冲击。道闸配套弱电线路埋设于路面或者沿路边敷设,一旦缺少有效防护,容易出…

2026/7/28 16:49:53阅读更多 →
【AI新手避坑指南】:20年AI专家亲授5大致命误区,90%初学者第3条就已踩雷

【AI新手避坑指南】:20年AI专家亲授5大致命误区,90%初学者第3条就已踩雷

更多请点击: https://kaifayun.com 第一章:AI新手认知误区的底层根源 许多初学者将AI等同于“自动完成一切的黑箱”,这种误解并非源于懒惰或无知,而是由技术传播链中的三重失真共同塑造:媒体简化、教学断层与工具封装…

2026/7/28 16:49:53阅读更多 →
1. 准备工作

1. 准备工作

1.准备工作前期准备工作当前系统环境学习书箱和资源前期准备工作 当前系统环境 当前系统环境Windows10专业版1903。官网下载并安装Python,当前最新版本Python为3.7.4(20190730)。官网下载并安装Sublime。官网下载并安装Pycharm。搜索Mysql …

2026/7/28 16:49:53阅读更多 →
基础Demo_4 if判断语句使用(学习笔记)

基础Demo_4 if判断语句使用(学习笔记)

if判断第一种语句格式 if判断语句用于判断代码如果a除以2不能为0 此代码块中代码不执行 public class Demo01_IF{public static void main(String[] args){int a 11; // 判断 if(a % 2 0 ){ //如果a除以2不能为0 此代码块中代码不执行System.out.println( a " 为偶数&…

2026/7/28 16:49:53阅读更多 →
HiClaw开源团队协作工具:5分钟极速部署指南

HiClaw开源团队协作工具:5分钟极速部署指南

1. 项目概述:HiClaw开源团队协作工具HiClaw作为OpenClaw的团队协作版本,是一款面向开发者群体的开源项目管理系统。这个工具最吸引人的特点是其极简的部署流程——官方宣称只需5分钟即可完成本地安装。在实际测试中,我确实在Ubuntu 20.04系统…

2026/7/28 16:47:52阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →