zoukankan      html  css  js  c++  java
  • hello hibernate

    Hibernate概述

    1.什么是hibernate

      Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以 自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

    2.hibernate的优缺点

    优点:

       1、对象化。hibernate可以让开发人员以面相对象的思想来操作数据库。jdbc只能通过SQL语句将元数据传送给数据库,进行数据操作。而hibernate可以在底层对元数据和对象进行转化,使得开发者只用面向对象的方式来存取数据即可。

       2、更好的移植性。hibernate使用xml或JPA的配置以及数据库方言等等的机制,使得hibernate具有更好的移植性,对于不同的数据库,开发者只需要使用相同的数据操作即可,无需关心数据库之间的差异。而直接使用JDBC就不得不考虑数据库差异的问题。

       3、开发效率高。hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。

       4、缓存机制的使用。hibernate提供了缓存机制(session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益。

    缺点: 

       1、由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate 
       2、框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来
       3、如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
       4、Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点

    3.案例的开发步骤及具体代码实现

       本例演示使用hibernate添加一条数据到表Product

       如图:

       

    步骤1:

       准备数据库
       我这边安装的是mysql数据库,账号密码都是root, 后续的配置里,也是用的这个账号密码。
        1 create database test; 
     步骤2:
       新建一个 java Project
       

    步骤3:

        导入jar包 
        下载地址>
        hibernate所需包
        hibernate 5.2
        hibernate 4.2
        数据连接所需包
        下载解压,在项目上新建lib文件夹,导入解压后的hibernate-release-4.2.21.Finallib equired文件夹的所有包及mysql-connector-java-5.1.44.jar
        如图:
        

    步骤4:

      创建实体类及实体类映射,直接上代码。

      实体类:

     1 package com.day01.pojo;
     2 
     3 public class Product {
     4     private int id;
     5     private String pName;
     6     private double price;
     7     public int getId() {
     8         return id;
     9     }
    10     public void setId(int id) {
    11         this.id = id;
    12     }
    13     public String getpName() {
    14         return pName;
    15     }
    16     public void setpName(String pName) {
    17         this.pName = pName;
    18     }
    19     public double getPrice() {
    20         return price;
    21     }
    22     public void setPrice(double price) {
    23         this.price = price;
    24     }
    25     
    26 }
    View Code

      实体类映射:

      命名:类名.hbm.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     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 <hibernate-mapping package="com.day01.pojo">
     6     <class name="Product" table="Product">
     7         <id name="id" column="id"><!-- 映射主键  name:属性名    column:表中字段名 -->
     8             <generator class="native"></generator>            
     9         </id>
    10         <property name="pName"></property><!-- 只指定name表示属性名和字段名保持一致 -->
    11         <property name="price"></property>
    12     </class>
    13 </hibernate-mapping>
    View Code
    步骤5:
      配置hibernate,即hibernate.cfg.xml
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
     5 <hibernate-configuration>
     6     <session-factory>
     7         <!-- 数据库连接配置 -->
     8         <property name="connection.driver_class">
     9             com.mysql.jdbc.Driver
    10         </property>
    11         <property name="connection.url">
    12             jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8
    13         </property>
    14         <property name="connection.username">root</property>
    15         <property name="connection.password">root</property>
    16         <!-- 设置数据库方言     就是告诉hibernate使用的是什么数据库 -->
    17         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    18         <!-- 是否显示sql语句 -->
    19         <property name="show_sql">true</property>
    20         <!-- 是否显示sql语句 -->
    21         <property name="sql_format">true</property>
    22         <!-- 设置事务管理方式        即每个线程一个事务 -->
    23         <property name="current_session_context_class">thread</property>
    24          <!-- hbm2ddl.auto: 生成表结构的策略配置
    25               update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构. 
    26                            如果存在表结构,并且表结构与实体一致,那么不做修改
    27                            如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.
    28               create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
    29               create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
    30               validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.
    31           -->
    32         <property name="hbm2ddl.auto">update</property>
    33         <!-- 映射实体  Product-->
    34         <mapping resource="com/day01/pojo/Product.hbm.xml" />
    35     </session-factory>
    36 </hibernate-configuration>
    View Code

     步骤6:

      编写测试类代码

     1 package com.day01.test;
     2 
     3 import org.hibernate.Session;
     4 import org.hibernate.SessionFactory;
     5 import org.hibernate.cfg.Configuration;
     6 import org.hibernate.service.ServiceRegistry;
     7 import org.hibernate.service.ServiceRegistryBuilder;
     8 import com.day01.pojo.Product;
     9 
    10 public class Test {
    11     public static void main(String[] args) {
    12         //创建配置对象
    13         Configuration cfg=new Configuration().configure();//默认加载hibernate.cfg.xml
    14         //若不以hibernate.cfg.xml命名 则需为configure()指定参数:如 configure("myhibernate.cfg.xml")
    15         //创建服务注册类  进一步加载配置文件
    16         ServiceRegistry sr=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
    17         //创建会话工厂
    18         SessionFactory sf=cfg.buildSessionFactory(sr);
    19         //获取会话对象
    20         Session session=sf.openSession();
    21         //开始事务
    22         session.beginTransaction();
    23         //创建一个商品实例
    24         Product p=new Product();
    25         p.setpName("电视");
    26         p.setPrice(5000.00);
    27         //将实例p保存到数据库
    28         session.save(p);
    29         //提交事务
    30         session.getTransaction().commit();
    31         //关闭资源
    32         session.close();
    33         sf.close();
    34     }
    35     
    36 }
    View Code

      
  • 相关阅读:
    base64解码
    字典排序之后md5
    python 如何将列表多个字符串拼接成一个字符串
    Mongodb $setOnInsert操作符 和upsert:true
    为了不复制粘贴,我被逼着学会了JAVA爬虫
    10-序列化
    【开发笔记】- 停止MySQL正在执行的SQL语句
    【算法练习】- 百钱百鸡
    volatile与synchronized的区别与作用
    记录一次使用OSS而引发的关于maven的问题
  • 原文地址:https://www.cnblogs.com/UnwillingToMediocrity/p/7867656.html
Copyright © 2011-2022 走看看