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

前言

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系列更多文章,谢谢大家支持!

所见所领,皆是生活。慢慢来,努力一点,你我共同成长...

#Java#
全部评论

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务