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:38 阅读更多 →
突破性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:38 阅读更多 →
测试工具的使用

测试工具的使用

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

2026/7/28 15:37:38 阅读更多 →

最新新闻

物联网设备低功耗优化:从6个月到3年的电池寿命提升

物联网设备低功耗优化:从6个月到3年的电池寿命提升

1. 项目背景与核心挑战在物联网设备和便携式电子设备中,不可充电的初级电池(如纽扣电池、AA/AAA电池)是最常见的供电方案。这类电池一旦耗尽就必须更换,而在某些部署场景中(如远程传感器、植入式医疗设备)&…

2026/7/28 15:46:41 阅读更多 →
Unity Shader多Pass渲染:从Standard Shader源码解析到自定义AddPass实战

Unity Shader多Pass渲染:从Standard Shader源码解析到自定义AddPass实战

1. 项目概述:为什么我们要深入AddPass?如果你在Unity里做过一些稍微复杂点的渲染效果,比如给角色加个发光轮廓,或者让武器在特定时候高亮显示,那你大概率已经接触过或听说过“多Pass渲染”。Standard Shader作为Unity内…

2026/7/28 15:46:41 阅读更多 →
百考通答辩PPT生成,精准定位,智能生成,省时省力

百考通答辩PPT生成,精准定位,智能生成,省时省力

毕业答辩是每一位学子学术生涯中的重要时刻,它不仅是对研究成果的展示,更是对学术能力的全面检验。然而,面对紧张的答辩时间、严格的评审要求,如何将复杂的研究内容凝练成清晰有力的演示文稿,成为困扰无数学生的难题。…

2026/7/28 15:46:41 阅读更多 →
物联网设备电源管理优化:NBM7100A与STM32F427ZI实战

物联网设备电源管理优化:NBM7100A与STM32F427ZI实战

1. 项目背景与核心挑战在物联网设备和大规模传感器网络部署中,初级电池(不可充电电池)供电的设备面临一个根本性矛盾:设备需要长期稳定运行(通常要求5-10年),但电池容量受物理限制无法无限提升。…

2026/7/28 15:46:41 阅读更多 →
LabVIEW 做交流氩弧焊弧压跟踪,3 种方案实测对比

LabVIEW 做交流氩弧焊弧压跟踪,3 种方案实测对比

焊接自动化中,弧长控制是最头疼的问题之一。弧长过短,钨极扎进熔池;弧长过长,焊缝变宽、熔深不够。手工焊靠师傅手感,自动化焊接只能通过电弧电压反馈来控制弧长——因为TIG焊电源的陡降特性决定了电弧电压与弧长有良好…

2026/7/28 15:46:41 阅读更多 →
Matlab仿真实现垂直泊车路径规划算法解析

Matlab仿真实现垂直泊车路径规划算法解析

1. 垂直泊车路径规划与自动泊车仿真概述垂直泊车是自动泊车系统(APS)中最具挑战性的场景之一,需要车辆在有限空间内完成精确的横向移动和角度调整。Matlab/Simulink因其强大的数值计算和可视化能力,成为验证泊车算法的首选工具。我在汽车电子行业参与过多…

2026/7/28 15:45:40 阅读更多 →

日新闻

告别臃肿!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:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

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

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

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

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

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

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻