写点什么

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

作者:浅羽技术
  • 2023-04-15
    江苏
  • 本文字数:5474 字

    阅读完需:约 18 分钟

前言

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)的含义:


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>

复制代码


  • 创建 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 + "]"; } }
复制代码


  • 编写测试类

@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();  }
复制代码


  • 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>

复制代码


  • 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>

复制代码


  • 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);
复制代码


  • 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();  } }}
复制代码


注意事项

  1. 我们 hibernate.cfg.xml 配置文件中这个括hibernate.是可以省略

  2. 为什么不开启事务也能查询到数据?是因为默认Hibernate存在只读事务,只读事务是可以完成数据的读的操作的,如果是要完成增删改的话那么就需要读写事务,这个时候就需要开启事务

Save 和 Persist 的区别

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

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

结语

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


发布于: 2023-04-15阅读数: 29
用户头像

浅羽技术

关注

才疏学浅,习习而为,编程羽录,与你同行。 2019-02-26 加入

分享一些计算机信息知识、理论技术、工具资源、软件介绍、后端开发、面试、工作感想以及生活随想等一系列文章。

评论

发布
暂无评论
连Hibernate技术都不清楚,你敢说你自己会ORM框架?_Java_浅羽技术_InfoQ写作社区