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

连Hibernate技术都不清楚,你敢说你自己会ORM框架?_第1张图片

前言

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技术都不清楚,你敢说你自己会ORM框架?_第2张图片

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

 

 

    
        
        com.mysql.jdbc.Driver
        
        jdbc:mysql:///qianyu
        
        root
        
        root
        
        org.hibernate.dialect.MySQL5Dialect
        
        update
        
        
        
        
        
    
 


  • 创建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配置文件的详解



 

    
    
        
        com.mysql.jdbc.Driver
        
        jdbc:mysql:///qianyu
        
        root
        
        root
        
        
        
        org.hibernate.dialect.MySQL5Dialect
        
        
        update
        
        true
        
        true
          
        
        
       
       
       
        
    
 


  • Hibernate的xxx.hbm.xml配置文件的详解








    
 
 
     
  
      
   
  
  
  
  
    
 



  • 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 threadLocal=null;
 static{
  //初始化线程的局部变量
  threadLocal=new ThreadLocal();
  //加载配置文件
  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系列更多文章,谢谢大家支持!

往期推荐

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

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

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

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

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

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

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

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

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

 

点个赞,证明你还爱我

你可能感兴趣的:(Java,框架,数据库,单元测试,hibernate,mysql,java)