连Hibernate技术都不清楚,你敢说你自己会ORM框架?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: ORM框架不是一个新话题,它已经伴随我们很多年了。它提供了概念性的、易于理解的数据模型,将数据库中的表和内存中的对象建立了很好的映射关系。在Java中常用的ORM框架主要有两个:Hi...

image.gifimage.gif

前言

ORM框架不是一个新话题,它已经伴随我们很多年了。它提供了概念性的、易于理解的数据模型,将数据库中的表和内存中的对象建立了很好的映射关系。在Java中常用的ORM框架主要有两个:Hibernate和iBatis。本篇文章主要介绍Hibernate的使用方法,后续会出介绍iBatis的文章。

传统的MVC开发模式

    1. M:Model包括pojo、service、dao
    2. V:View 包括jsp、html、模块引擎
    3. C:Controll 包括我们动态网络资源的技术:Servlet

    SSH框架在开发中的作用

      • S:Struts/SpringMVC: 实际上解决的是我们的控制器的问题(简单的可以认为是Servlet的封装)。
      • Spring: 整合其余的第三方框架,就是为 Srvice 层提供事务。
      • Hibernate:其实就是DAO层的解决方案。

      同时可以看下其余框架(SSM、SSS)的含义:

      image.gif

      Hibernate是什么

        1. Hibernate是一个非侵入式ORMapping框架

        非侵入式框架:我们在使用这个框架的时候,不需要继承或者实现这个框架中的类或者接口,这种类型的框架就叫做非侵入式的框架,非侵入式的框架在使用的时候更好的和原有的框架实现了解耦

        侵入式框架:我们在使用这个框架的时候,需要继承或者实现这个框架中的某些类或者接口,这种框架叫做侵入式框架

          1. ORMapping解析

          O:Object

          R:Relation

          M:Mapping 映射

            1. Hibernate能够将Java对象通过映射的关系映射到数据库
            2. Hibernate能够将数据库的数据通过映射关系映射到Java对象

            Hibernate就是能够通过操作Java对象来达到操作数据库的一门技术。

            Hibernate能干什么

            简单的说:实现数据库的所有操作(CRUD),是原有DAO层的一个解决方案,也是一个替代品。

            Hibernate的简单使用

            「简单使用:」

              • 导包,将下载下来的required+jpa相关的包放到一个文件里面
              • 在src下面创建hibernate.cfg.xml配置文件
              <?xml version='1.0' encoding='utf-8'?>
              <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
              <hibernate-configuration>
                  <session-factory>
                      <!--驱动程序-->
                      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
                      <!--访问的URL-->
                      <property name="hibernate.connection.url">jdbc:mysql:///qianyu</property>
                      <!--用户名-->
                      <property name="hibernate.connection.username">root</property>
                      <!--密码-->
                      <property name="hibernate.connection.password">root</property>
                      <!--方言 表示的是告诉Hibernate框架当前 你要生成那个数据库下的SQL语句-->
                      <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
                      <!--是否自动创建表  create:表示的是每一次 都从新创建  update:表示的是 如果有就不创建 没有就创建-->
                      <property name="hibernate.hbm2ddl.auto">update</property>
                      <!--配置映射文件-->
                      <mapping resource="com/qy/helloworld/User.hbm.xml"/>
                  </session-factory>
              </hibernate-configuration>

              image.gif

                • 创建Java的类的对象
                public class User implements Serializable{
                 private static final long serialVersionUID = -6949433888868762441L;
                 private int uId;
                 private String userName;
                 private String userPwd;
                 public User(int uId, String userName, String userPwd) {
                  super();
                  this.uId = uId;
                  this.userName = userName;
                  this.userPwd = userPwd;
                 }
                 public User() {
                  super();
                 }
                 public int getuId() {
                  return uId;
                 }
                 public void setuId(int uId) {
                  this.uId = uId;
                 }
                 public String getUserName() {
                  return userName;
                 }
                 public void setUserName(String userName) {
                  this.userName = userName;
                 }
                 public String getUserPwd() {
                  return userPwd;
                 }
                 public void setUserPwd(String userPwd) {
                  this.userPwd = userPwd;
                 }
                 @Override
                 public String toString() {
                  return "User [uId=" + uId + ", userName=" + userName + ", userPwd=" + userPwd + "]";
                 }
                }

                image.gif

                  • 编写测试类
                  @Test
                   public void testHelloWord() throws Exception {
                    //引入配置文件
                    Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
                    //创建SessionFactory对象
                    SessionFactory sf=cfg.buildSessionFactory();
                    //创建会话
                    Session session=sf.openSession();
                    //开启事务
                    session.beginTransaction();
                    //操作对象
                    User user=new User(1,"小羽","110");
                    //开始操作
                    session.save(user);
                    //进行事务的提交
                    session.getTransaction().commit();
                    session.close();
                   }

                  image.gif

                    • Hibernate中的hibernate.cfg.xml配置文件的详解
                    <?xml version='1.0' encoding='utf-8'?>
                    <!DOCTYPE hibernate-configuration PUBLIC
                    "-//Hibernate/Hibernate Configuration DTD//EN"
                    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
                    <hibernate-configuration>
                        <!--配置我们数据库的连接信息的-->
                        <session-factory>
                            <!--驱动程序-->
                            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
                            <!--访问的URL-->
                            <property name="connection.url">jdbc:mysql:///qianyu</property>
                            <!--用户名-->
                            <property name="connection.username">root</property>
                            <!--密码-->
                            <property name="connection.password">root</property>
                            <!--方言 表示的是告诉Hibernate框架当前 你要生成那个数据库下的SQL语句-->
                            <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
                            <!--是否自动创建表  create:表示的是每一次 都从新创建  update:表示的是 如果有就不创建 没有就创建-->
                            <!--create经常用在测试的环境中-->
                            <property name="hbm2ddl.auto">update</property>
                            <!--执行的时候将SQL语句展示出来-->
                            <property name="show_sql">true</property>
                            <!--格式化这个SQL语句-->
                            <property name="format_sql">true</property>
                            <!--配置映射文件  配置的是映射文件的-->
                           <mapping resource="com/qy/helloworld/User.hbm.xml"/> 
                           <!--使用注解的时候使用的是这一个-->
                           <!--  <mapping package="com.qy.helloworld"/> -->
                        </session-factory>
                    </hibernate-configuration>

                    image.gif

                      • Hibernate的xxx.hbm.xml配置文件的详解
                      <?xml version="1.0"?>
                      <!DOCTYPE hibernate-mapping PUBLIC
                       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                       "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
                      <!--package:一般情况下要进行配置  可以不配置 但是 下面你就要写全路径  auto-import="true":如果不配置的话那么在进行查询的时候必须写类的全路径-->
                      <!--default-lazy:配置整个实体是否支持懒加载  默认就支持懒加载-->
                      <hibernate-mapping package="com.qy.helloworld" default-lazy="true" auto-import="true">
                          <!--下面配置的是映射关系   将JAVA对象 直接映射到数据库的表里面去
                               name:表示的是类的名字
                               table:表示的是当前的这个JAVA类 对应的数据库中的表的名字做是什么 这个名字是可以随便写的 但是一般要见名之意
                               lazy:当前这个类在进行查询操作的时候  要进行懒加载
                          -->
                       <class name="User" table="t_user"  lazy="true">
                           <!--
                               id:表示的是主键的映射
                               name:类中主键的名字
                               column:主键对应的表的字段
                               length:确定当前字段的最大长度
                               type:类型(写的是JAVA中数据类型的全路径)
                                        注意:类型可以省略:省略之后的类型就和实体中的类型保持一致
                                    length:可以省略  默认就是int的最大范围  
                                    column:这个也可以省略省略之后 默认和类中保持一致  
                           -->
                        <id name="uId">
                            <!--主键自增长
                                         上面的重点记住
                                identity:自增长这个表示的意思是:会根据底层的数据库选择自增长的策略
                                assigned:自己设置这个id的值
                                foreign:这个表示的是要将别人的主键来作为自己的主键
                                uuid:通过uuid来生成id主键 
                                        下面的了解
                                increment:递增(这个跟数据库是有关系的)
                                native:是递增(跟底层的数据库的方言有关)
                                sequence:这个表示的是通过表的序列来完成下一个id的生成(Oracle数据库)
                            -->
                         <generator class="identity"/>
                        </id>
                        <!--下面映射的是普通的属性
                             length:字符串的长度
                             not-null:当前字段不能为空
                             type:类型
                        -->
                        <property name="userName" column="userName" length="20" not-null="true"/>
                        <property name="userPwd" length="20" not-null="true" type="java.lang.String"/>  
                       </class>
                      </hibernate-mapping>

                      image.gif

                        • Hibernate中的CRUD的实现
                        添加数据
                            session.save(user);  
                          session.persist(user);
                        修改数据
                                session.beginTransaction(); 
                          //查询数据(积极的加载)
                          User user=session.get(User.class,1);
                          //下面支持的是懒加载
                          user.setUserName("xxxxx");
                          user.setUserPwd("yyyyy");
                          session.getTransaction().commit();
                        数据查询
                                //查询数据(积极的加载)
                          User user=session.get(User.class,1);
                          //下面支持的是懒加载
                          User user2=session.load(User.class,1); 
                           删除数据
                               //查询数据(积极的加载)
                          User user=session.get(User.class,1);
                          session.delete(user);

                        image.gif

                          • Hibernate中的帮助类的编写
                          public class HibernateUtils {
                           private static Configuration cfg=null;
                           private static SessionFactory sf=null;
                           private static ThreadLocal<Session> threadLocal=null;
                           static{
                            //初始化线程的局部变量
                            threadLocal=new ThreadLocal<Session>();
                            //加载配置文件
                            cfg=new Configuration().configure("config/hibernate.cfg.xml");
                            //生成我们的工厂
                            sf=cfg.buildSessionFactory();
                           }
                           /**
                            * 获取session的玩法
                            * @Title: getSession   
                            * @Description: TODO
                            * @param: @return      
                            * @return: Session      
                            * @throws
                            */
                           public static Session getSession(){
                             Session session=threadLocal.get();
                             if(null==session){
                              session=sf.openSession();
                              session.beginTransaction();
                              threadLocal.set(session);
                             }
                             return session;
                           }
                           /**
                            * 关闭Session
                            * @Title: close   
                            * @Description: TODO
                            * @param:       
                            * @return: void      
                            * @throws
                            */
                           public static void close(){
                            Session session=threadLocal.get();
                            if(null!=session){
                             session.getTransaction().commit();
                             session.close();
                             threadLocal.remove();
                            }
                           }
                          }

                          image.gif

                          注意事项

                            1. 我们hibernate.cfg.xml配置文件中这个括hibernate.是可以省略
                            2. 为什么不开启事务也能查询到数据?是因为默认Hibernate存在只读事务,只读事务是可以完成数据的读的操作的,如果是要完成增删改的话那么就需要读写事务,这个时候就需要开启事务

                            Save和Persist的区别

                              • Save在保存数据的时候,如果id是自增长,你给定id和不给定id都是对的。
                              • Persist在保存数据的时候,如果id是自增长的,你给定id是会报错的。

                              结语

                              本篇关于Hibernate的介绍就先到这里结束了,后续会出更多关于Hibernate系列更多文章,谢谢大家支持!


                              image.gif

                              image.gif

                              image.gif

                              点个赞,证明你还爱我

                              相关实践学习
                              如何在云端创建MySQL数据库
                              开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
                              全面了解阿里云能为你做什么
                              阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
                              相关文章
                              |
                              2月前
                              |
                              SQL Java 数据库连接
                              Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
                              Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
                              37 1
                              |
                              2月前
                              |
                              Java 数据库连接 数据库
                              告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
                              【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
                              66 0
                              |
                              2月前
                              |
                              数据库 Java 数据库连接
                              Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
                              【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
                              41 0
                              |
                              3月前
                              |
                              SQL Java 数据库连接
                              Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
                              Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
                              53 0
                              |
                              4月前
                              |
                              XML Java Apache
                              必知的技术知识:HHS整合(Struts2+Spring+Hibernate)
                              必知的技术知识:HHS整合(Struts2+Spring+Hibernate)
                              30 0
                              |
                              4月前
                              |
                              SQL Java 数据库连接
                              技术经验分享:Hibernate之HQL
                              技术经验分享:Hibernate之HQL
                              17 0
                              |
                              4月前
                              |
                              前端开发 Java 数据库连接
                              程序技术好文:电脑睡眠(sleep)和休眠(Hibernate)的区别,以及休眠功能的设置
                              程序技术好文:电脑睡眠(sleep)和休眠(Hibernate)的区别,以及休眠功能的设置
                              |
                              4月前
                              |
                              前端开发 Java 数据库连接
                              技术好文共享:电脑睡眠(sleep)和休眠(Hibernate)的区别,以及休眠功能的设置
                              技术好文共享:电脑睡眠(sleep)和休眠(Hibernate)的区别,以及休眠功能的设置
                              |
                              4月前
                              |
                              Java 数据库连接 数据库
                              探索JPA生态:Hibernate与其他ORM框架的对比分析
                              【6月更文挑战第25天】**JPA标准下的Hibernate是流行的ORM实现,提供丰富功能如二级缓存和延迟加载,但其学习曲线较陡,性能优化复杂。相比如MyBatis,Hibernate的JPQL更面向对象,MyBatis则接近SQL。选择ORM需考虑项目需求和个人偏好。**
                              63 0
                              |
                              5月前
                              |
                              SQL 缓存 Java
                              框架分析(9)-Hibernate
                              框架分析(9)-Hibernate