zoukankan      html  css  js  c++  java
  • Hibernate 学习(一)

    一、Hibernate 简介

    1、Hibernate 简介

      Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。

    2、Hibernate 优缺点

      优点与缺点都是相对的,那么讲一个东西的优缺点我们都需要一个参数对比,而咱们要来进行对比的咱们操作数据的原生的JDBC:

    1、JDBC的优缺点

    本质:处理Java对象和关系型数据库表之间的转换。

    优点:

      操作数据库最底层,性能最高(需要你是有相应的经验,并且是一个数据库高手)。

    缺点:  

    1、使用复杂(重复代码太多)。

    2、移植数据库很麻烦,改动比较多;主键的生成方式不同(mysql使用自增,oracle使用序列);分页的sql语句也是不同(mysql使用limit,oracle使用ROWNUM)。

    3、性能优化得自己处理,没有提供数据的缓存。

    4、面向sql语句操作,不是面向对象的。

    2、hibernate的优缺点

      本质:处理Java对象和关系型数据库表之间的转换,只是对JDBC再次做了一层封装。

    优点:

    1、程序员操作很简单,代码简单 session.save(user);

    2、直接面向对象操作。

    3、提供世界级数据缓存(现在几乎所有的ORM框架的缓存都是学的Hibernate);一级缓存,二级缓存,查询缓存。

    4、数据库移植性很强,很少的修改;把各种数据库抽取了一个方言接口;不同数据库实现一个方言接口,如果换了数据库,必须修改方言实现,驱动jar文件,连接数据库信息。

    缺点:

    1、不能干预sql语句的生成;session.get(User.class,id); 默认查询t_user表的所有字段,自动生成select user0_.id,user0_.name,user0_.age from t_user user0_ where    user0_.id=?

    2、一个项目中,如果对sql语句的优化要求比较高,不适合用hibernate(不过可以使用 Hibernate 对原生sql 的支持来解决)。

    3、如果一张表中有上亿级别的数据量,也不适合用hibernate,其实也不适合用jdbc(可以使用数据库读写分离,分库分表方案解决)。

    二、Hibernate 入门

    1、步骤

    1、拷贝jar包

    2、建立 pojo

    Product 类:

     1 package com.hibernate.pojo;
     2 
     3 /**
     4  * @author zt1994 2018/3/6 14:16
     5  */
     6 public class Product {
     7     private Integer id;
     8     private String name;
     9     private float price;
    10 
    11     public Integer getId() {
    12         return id;
    13     }
    14 
    15     public void setId(Integer id) {
    16         this.id = id;
    17     }
    18 
    19     public String getName() {
    20         return name;
    21     }
    22 
    23     public void setName(String name) {
    24         this.name = name;
    25     }
    26 
    27     public float getPrice() {
    28         return price;
    29     }
    30 
    31     public void setPrice(float price) {
    32         this.price = price;
    33     }
    34 }

    3、建立映射文件

    Product.hbm.xml 映射文件:

     1 <!DOCTYPE hibernate-mapping PUBLIC
     2         "-//Hibernate/Hibernate Mapping DTD//EN"
     3         "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
     4 
     5 <!--映射文件-->
     6 <hibernate-mapping package="com.hibernate.pojo">
     7     <!--class表示一个由hibernate管理的持久对象,对应数据库中一个表-->
     8     <!--table数据库的表名-->
     9     <class name="Product" table="product">
    10         <id name="id" type="int" column="id">
    11             <!--generator表示主键的生成方式,native自动选择数据库本地的策略-->
    12             <generator class="native"/>
    13         </id>
    14         <!--非主键属性-->
    15         <property name="name" column="name" type="string"/>
    16         <property name="price" column="price" type="float"/>
    17     </class>
    18 </hibernate-mapping>

    4、建立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 
     6 <!--hibernate核心配置文件-->
     7 <hibernate-configuration>
     8     <session-factory>
     9         <property name="dialect">
    10             org.hibernate.dialect.MySQLDialect
    11         </property>
    12         <!--链接池配置-->
    13         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    14         <property name="connection.url">jdbc:mysql://localhost:3306/how2java</property>
    15         <property name="connection.username">root</property>
    16         <property name="connection.password">admin</property>
    17         <!--显示sql语句-->
    18         <property name="show_sql">true</property>
    19 
    20         <!-- 映射文件-->
    21         <mapping resource="mapper/Product.hbm.xml"/>
    22     </session-factory>
    23 </hibernate-configuration>

    5、编辑dao实现类

    dao 接口:

     1 package com.hibernate.dao;
     2 
     3 import com.hibernate.pojo.Product;
     4 
     5 import java.util.List;
     6 
     7 public interface IProductDao {
     8 
     9     /**
    10      * 添加产品
    11      * @param product
    12      * @return
    13      */
    14     void addProduct(Product product);
    15 }

    dao 实现:

     1 package com.hibernate.dao.impl;
     2 
     3 import com.hibernate.dao.IProductDao;
     4 import com.hibernate.pojo.Product;
     5 import org.hibernate.Query;
     6 import org.hibernate.Session;
     7 import org.hibernate.SessionFactory;
     8 import org.hibernate.Transaction;
     9 import org.hibernate.cfg.Configuration;
    10 
    11 import java.util.List;
    12 
    13 /**
    14  * @author zt1994 2018/3/6 14:40
    15  */
    16 public class ProductDaoImpl implements IProductDao {
    17 
    18     @Override
    19     public void addProduct(Product product) {
    20         //1.读取并解析配置文件
    21         Configuration configuration = new Configuration();
    22         //2.加载配置文件,如果不设置加载默认配置文件hibernate.cfg.xml
    23         configuration.configure("hibernate.cfg.xml");
    24         //3.生成会话工厂
    25         SessionFactory sessionFactory = configuration.buildSessionFactory();
    26         //4.获取session
    27         Session session = sessionFactory.openSession();
    28         //5.开启事务
    29         Transaction transaction = session.getTransaction();
    30         transaction.begin();
    31         //6.操作CRUD
    32         session.save(product);
    33         transaction.commit();
    34         //7.关闭资源
    35         session.close();
    36         sessionFactory.close();
    37     }
    38 }

    6、测试

     1 package com.hibernate.test;
     2 
     3 import com.hibernate.dao.IProductDao;
     4 import com.hibernate.dao.impl.ProductDaoImpl;
     5 import com.hibernate.pojo.Product;
     6 import org.junit.Test;
     7 
     8 /**
     9  * @author zt1994 2018/3/6 14:47
    10  */
    11 public class TestProductDao {
    12     private IProductDao productDao = new ProductDaoImpl();
    13 
    14     /**
    15      * 测试添加商品
    16      */
    17     @Test
    18     public void testAddProduct(){
    19         Product product = new Product();
    20         product.setName("test");
    21         product.setPrice(2222);
    22         productDao.addProduct(product);
    23     }
    24 }
  • 相关阅读:
    线程池ThreadPoolExcecutor介绍
    java类初始化顺序
    CountDownLatch,CyclicBarrier,Semaphore的使用
    设计模式UML图
    windows10磁盘分区后,如何恢复分区,回到未分区之前
    神州战神U盘安装windows10系统,启动项制作好后,在bios中识别不到自己的u盘问题
    项目报错:Invalid bound statement (not found):
    在docker安装tomcat的时候,报错:Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true
    PowerDesigner逆向生成MYSQL数据库表结构总结
    mysql导出word的表结构操作
  • 原文地址:https://www.cnblogs.com/zt19994/p/8515134.html
Copyright © 2011-2022 走看看