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

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

[[353995]]

 前言

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框架

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

2.ORMapping解析

  • O:Object
  • R:Relation
  • M:Mapping 映射
  • a.Hibernate能够将Java对象通过映射的关系映射到数据库
  • b.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> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

创建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 + "]"
 } 
  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.

编写测试类

@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(); 
  
 } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

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> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.

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> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.

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); 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.

注意事项

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

Save和Persist的区别

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

结语

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

 

责任编辑:姜华 来源: 浅羽的IT小屋
相关推荐

2019-10-29 09:41:54

Kafka分布式

2020-08-18 08:22:46

归并排序

2020-09-10 16:10:17

js继承模式前端

2020-01-09 11:11:35

RPC框架调用远程

2019-06-25 15:00:53

SpringNullJava

2020-11-11 07:32:18

MySQL InnoDB 存储

2021-02-14 22:33:23

Java字符字段

2023-08-07 11:07:30

5G电信TECS

2021-11-09 06:01:35

前端JITAOT

2021-03-10 08:56:37

Zookeeper

2021-06-07 09:20:56

Javascript运算符开发

2021-07-27 07:31:16

JavaArrayList数组

2022-05-15 21:52:04

typeTypeScriptinterface

2024-02-29 09:08:56

Encoding算法加密

2009-09-22 13:09:06

Hibernateorm框架

2020-10-30 08:20:04

SD卡TF卡存储

2018-12-17 12:30:05

Kubernetes存储存储卷

2009-06-02 17:27:28

Hibernate框架ORM

2018-05-22 16:24:20

HashMapJavaJDK

2020-03-03 17:35:09

Full GCMinor
点赞
收藏

51CTO技术栈公众号