小言_互联网的博客

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

448人阅读  评论(0)

前言

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配置文件


   
  1.  <?xml version= '1.0' encoding= 'utf-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5.  
  6. <hibernate-configuration>
  7.     <session-factory>
  8.         <!--驱动程序-->
  9.         <property name= "hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  10.         <!--访问的URL-->
  11.         <property name= "hibernate.connection.url">jdbc:mysql: ///qianyu</property>
  12.         <!--用户名-->
  13.         <property name= "hibernate.connection.username">root</property>
  14.         <!--密码-->
  15.         <property name= "hibernate.connection.password">root</property>
  16.         <!--方言 表示的是告诉Hibernate框架当前 你要生成那个数据库下的SQL语句-->
  17.         <property name= "hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  18.         <!--是否自动创建表  create:表示的是每一次 都从新创建  update:表示的是 如果有就不创建 没有就创建-->
  19.         <property name= "hibernate.hbm2ddl.auto">update</property>
  20.         
  21.         
  22.         <!--配置映射文件-->
  23.         <mapping resource= "com/qy/helloworld/User.hbm.xml"/>
  24.         
  25.     </session-factory>
  26.  
  27. </hibernate-configuration>
  • 创建Java的类的对象


   
  1.  public class User implements Serializable{
  2.  private static final long serialVersionUID =  -6949433888868762441L;
  3.  private  int uId;
  4.  
  5.  private String userName;
  6.  
  7.  private String userPwd;
  8.  public User( int uId, String userName, String userPwd) {
  9.   super();
  10.   this.uId = uId;
  11.   this.userName = userName;
  12.   this.userPwd = userPwd;
  13.  }
  14.  public User() {
  15.   super();
  16.  }
  17.  public  int getuId() {
  18.    return uId;
  19.  }
  20.  public void setuId( int uId) {
  21.   this.uId = uId;
  22.  }
  23.  public String getUserName() {
  24.    return userName;
  25.  }
  26.  public void setUserName(String userName) {
  27.   this.userName = userName;
  28.  }
  29.  public String getUserPwd() {
  30.    return userPwd;
  31.  }
  32.  public void setUserPwd(String userPwd) {
  33.   this.userPwd = userPwd;
  34.  }
  35.  @Override
  36.  public String toString() {
  37.    return  "User [uId=" + uId +  ", userName=" + userName +  ", userPwd=" + userPwd +  "]";
  38.  }
  39.  
  40. }
  • 编写测试类


   
  1. @Test
  2.  public void testHelloWord() throws Exception {
  3.    //引入配置文件
  4.   Configuration cfg= new Configuration().configure( "hibernate.cfg.xml");
  5.    //创建SessionFactory对象
  6.   SessionFactory sf=cfg.buildSessionFactory();
  7.    //创建会话
  8.   Session session=sf.openSession();
  9.    //开启事务
  10.   session.beginTransaction();
  11.    //操作对象
  12.   
  13.   User user= new User( 1, "小羽", "110");
  14.   
  15.    //开始操作
  16.   session.save(user);
  17.   
  18.    //进行事务的提交
  19.   
  20.   session.getTransaction().commit();
  21.   
  22.   session. close();
  23.  
  24.  }
  • Hibernate中的hibernate.cfg.xml配置文件的详解


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


   
  1. <?xml version= "1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <!-- package:一般情况下要进行配置  可以不配置 但是 下面你就要写全路径  auto- import= "true":如果不配置的话那么在进行查询的时候必须写类的全路径-->
  6. <!-- default-lazy:配置整个实体是否支持懒加载  默认就支持懒加载-->
  7. <hibernate-mapping  package= "com.qy.helloworld"  default-lazy= "true" auto- import= "true">
  8.     <!--下面配置的是映射关系   将JAVA对象 直接映射到数据库的表里面去
  9.          name:表示的是类的名字
  10.          table:表示的是当前的这个JAVA类 对应的数据库中的表的名字做是什么 这个名字是可以随便写的 但是一般要见名之意
  11.          lazy:当前这个类在进行查询操作的时候  要进行懒加载
  12.     -->
  13.  <class name= "User" table= "t_user"  lazy= "true">
  14.  
  15.      <!--
  16.          id:表示的是主键的映射
  17.          name:类中主键的名字
  18.          column:主键对应的表的字段
  19.          length:确定当前字段的最大长度
  20.          type:类型(写的是JAVA中数据类型的全路径)
  21.          
  22.                   注意:类型可以省略:省略之后的类型就和实体中的类型保持一致
  23.               length:可以省略  默认就是 int的最大范围  
  24.               column:这个也可以省略省略之后 默认和类中保持一致  
  25.          
  26.      -->
  27.   <id name= "uId">
  28.       <!--主键自增长
  29.       
  30.                    上面的重点记住
  31.           identity:自增长这个表示的意思是:会根据底层的数据库选择自增长的策略
  32.           assigned:自己设置这个id的值
  33.           foreign:这个表示的是要将别人的主键来作为自己的主键
  34.           uuid:通过uuid来生成id主键 
  35.           
  36.                   下面的了解
  37.           increment:递增(这个跟数据库是有关系的)
  38.           native:是递增(跟底层的数据库的方言有关)
  39.           sequence:这个表示的是通过表的序列来完成下一个id的生成(Oracle数据库)
  40.        
  41.       -->
  42.    <generator class= "identity"/>
  43.   </id>
  44.   
  45.   <!--下面映射的是普通的属性
  46.        length:字符串的长度
  47.        not-null:当前字段不能为空
  48.         type:类型
  49.   -->
  50.   <property name= "userName" column= "userName" length= "20" not-null= "true"/>
  51.   <property name= "userPwd" length= "20" not-null= "true"  type= "java.lang.String"/>  
  52.  </class>
  53. </hibernate-mapping>
  • Hibernate中的CRUD的实现


   
  1. 添加数据
  2.     session.save(user);  
  3.   session.persist(user);
  4. 修改数据
  5.         session.beginTransaction(); 
  6.    //查询数据(积极的加载)
  7.   User user=session.get(User.class, 1);
  8.    //下面支持的是懒加载
  9.   user.setUserName( "xxxxx");
  10.   user.setUserPwd( "yyyyy");
  11.   session.getTransaction().commit();
  12. 数据查询
  13.          //查询数据(积极的加载)
  14.   User user=session.get(User.class, 1);
  15.    //下面支持的是懒加载
  16.   User user2=session.load(User.class, 1); 
  17.    删除数据
  18.         //查询数据(积极的加载)
  19.   User user=session.get(User.class, 1);
  20.   session. delete(user);
  • Hibernate中的帮助类的编写


   
  1. public class HibernateUtils {
  2.  private static Configuration cfg=null;
  3.  private static SessionFactory sf=null;
  4.  private static ThreadLocal<Session> threadLocal=null;
  5.  static{
  6.    //初始化线程的局部变量
  7.   threadLocal= new ThreadLocal<Session>();
  8.    //加载配置文件
  9.   cfg= new Configuration().configure( "config/hibernate.cfg.xml");
  10.    //生成我们的工厂
  11.   sf=cfg.buildSessionFactory();
  12.  }
  13.  
  14.   /**
  15.   * 获取session的玩法
  16.   * @Title: getSession   
  17.   * @Description: TODO
  18.   * @param: @return      
  19.   * @return: Session      
  20.   * @throws
  21.   */
  22.  public static Session getSession(){
  23.    Session session=threadLocal.get();
  24.     if(null==session){
  25.     session=sf.openSession();
  26.     session.beginTransaction();
  27.     threadLocal.set(session);
  28.    }
  29.     return session;
  30.  }
  31.  
  32.   /**
  33.   * 关闭Session
  34.   * @Title: close   
  35.   * @Description: TODO
  36.   * @param:       
  37.   * @return: void      
  38.   * @throws
  39.   */
  40.  public static void  close(){
  41.   Session session=threadLocal.get();
  42.    if(null!=session){
  43.    session.getTransaction().commit();
  44.    session. close();
  45.    threadLocal.remove();
  46.   }
  47.  }
  48. }

注意事项

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

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

Save和Persist的区别

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

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

结语

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

往期推荐

Spring Data开发手册|手摸手教你简化持久层开发工作

Spring Data开发手册|Java持久化API(JPA)需要了解到什么程度呢?

动态资源技术JSP|Java与Html的美好相遇

尚能饭否|技术越来越新,我对老朋友jQuery还是一如既往热爱

告别祈祷式编程|单元测试在项目里的正确落地姿势

组件必知必会|那些年我们使用过的轮子—Filter和Proxy

ES开发指南|如何快速上手ElasticSearch

玩转Redis|学会这10点让你分分钟拿下Redis,满足你的一切疑问

如果你觉得浅羽的文章对你有帮助的话,请在微信搜索并关注「 浅羽的IT小屋 」微信公众号,我会在这里分享一下计算机信息知识、理论技术、工具资源、软件介绍、后端开发、面试、工作感想以及一些生活随想等一系列文章。所见所领,皆是生活。慢慢来,努力一点,你我共同成长...

 

点个赞,证明你还爱我


转载:https://blog.csdn.net/weixin_43719843/article/details/110103043
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场